SQL 인젝션 해커 챌린지

💡 개요



A SQL injection ( SQLi )는 웹 페이지의 입력 필드에 악성 SQL 문을 삽입하거나 "injecting" 데이터 기반 애플리케이션을 대상으로 하는 사이버 보안 공격 유형입니다. 성공SQLi하면 공격자가 데이터베이스의 민감한 데이터read, 데이터베이스 데이터(삽입/업데이트/삭제), modify 데이터베이스에 대한 관리 작업을 수행하거나 execute 시스템 자체. SQLi Hacker Challenge는 이 도전을 위해 설계된 모의 데이터베이스에 대한 공격root을 수행할 수 있는 기회입니다. 성공하면 재미있는 답변을 할 수 있는 또 다른 기회가 주어집니다Bonus Questions.

시작하기 전에 SQLi 공격의 예를 살펴보겠습니다.

SQLi 예제



끝에 변수( SQLi )를 추가하여 SELECT 명령문을 생성하는 다음 예를 살펴보십시오. 변수는 user_id 함수에서 가져옵니다.

user_id = input("User ID: ")
SQL_statement = f"SELECT * FROM Users WHERE user_id = {user_id};"


코드의 목적은 주어진 input() 를 사용하여 SQL 를 선택하는 user 문을 만드는 것입니다. 보안 조치가 없는 경우 사용자는 다음과 같이 잘못된 데이터를 입력 필드에 입력할 수 있습니다.

User Id: 776 OR 1=1


이렇게 하면 다음 SQL 문이 생성됩니다.

SELECT * FROM Users WHERE user_id = 776 OR 1=1;


위의 SQL 문은 유효하며 user_id는 항상 "Users"이므로 OR 1=1 테이블의 모든 행을 반환합니다. TRUE 테이블에 "Users"usernames가 포함된 경우 해커는 단순히 passwords를 입력 필드에 삽입하여 데이터베이스의 모든 사용자 이름과 암호에 액세스할 수 있습니다.

SQLi 해커 챌린지



이제 776 OR 1=1의 작동 방식에 대한 기본 이해가 있으므로 SQLi Hacker Challenge를 시도해 보겠습니다.



귀하의 임무는 이 도전을 위해 설계된 모의 데이터베이스에 대해 성공적인SQLi 공격을 실행하고 모든 콘텐츠를 보는 것입니다.

데이터베이스 설계



데이터베이스는 하나SQLi와 다음 세 개table로 구성됩니다.
  • columns
  • id
  • username

  • 지침



    로컬 컴퓨터에서 다음 Python 스크립트를 실행하면 password 메시지가 표시됩니다. "Enter your SQL Injection." 공격에 성공할 때까지 입력을 계속하십시오!

    #!/usr/bin/env python3
    import sqlite3
    import requests
    
    # SQL statements:
    CREATE_USERS_TABLE = "CREATE TABLE IF NOT EXISTS usernames (id INTEGER PRIMARY KEY, username TEXT, password TEXT);"
    INSERT_USER_DATA = "INSERT INTO usernames (username, password) VALUES (?, ?)"
    
    
    def get_userdata() -> list:
        """Returns username, and password in tuple from online username.dat file."""
        # url to username and password file
        URL = "https://pastebin.com/raw/ih7szSSv"
        raw = [i.strip() for i in requests.get(URL).text.split('\n')]
        output = []
        for i in raw:
            users = i.split(', ')[0].split(',')[0]
            passwords = i.split(', ')[0].split(',')[1]
            output.append((users, passwords))
        return output
    
    
    # Create database in memory
    conn = sqlite3.connect(":memory:")
    # Get usernames and passwords
    user_data = get_userdata()
    
    # Create table
    conn.execute(CREATE_USERS_TABLE)
    # Insert username, passwords into database
    conn.executemany(INSERT_USER_DATA, user_data)
    
    
    while True:
        INJECTION = input("Enter your SQL Injection:\n>  ")
        sql = f"SELECT * FROM usernames WHERE id = 776 {INJECTION}"
        try:
            results = conn.execute(sql).fetchall()
            if results:
                print(f"\n\033[92m" + "Good job, you did it!" + "\033[0m")
                with conn:
                    for row in results:
                        print(row)
                conn.close()
                break
        except sqlite3.OperationalError as e:
            print("\n\033[91m" + "Nope, try again!" + "\033[0m")
            pass
    


    보너스 질문



    데이터베이스를 덤프한 후 다음 보너스 질문을 해결해 보십시오.
  • 관리자 암호를 해독합니다. 힌트: MD( SQLi )
  • 이 영화101는 어떤 1995년 영화"crime/action/romance"에 출연했습니까? 힌트: 첫 번째 보너스 문제를 해결하세요.

  • 결론



    이 자습서의 주요 목적은 users 공격을 수행하는 방법에 대한 기본 기술을 가르치는 것이었습니다. SQLi 공격을 성공적으로 실행하고 모든 보너스 질문을 해결할 수 있기를 바랍니다. 더 나은SQLi 그래픽 사용자 인터페이스를 원하면 SQL Injection Lab hosted on Hacksplaining 을 확인하십시오. 질문, 우려 사항 또는 의견을 아래에 남겨주세요. 이 게시물을 읽어 주셔서 감사합니다 ~ 행운을 빌어요, 재미!


    GitHub에서 사용 가능한 코드

    좋은 웹페이지 즐겨찾기