티스토리 뷰

보안/Wargame

[Lord of SQLi] dragon Writeup/문제풀이

돔돔이부하 2021. 10. 25. 23:35
728x90
반응형

이번 문제는 다른 문제와는 다르게 별다른 필터링이 없습니다. 그리고 희한하게도 query문에 주석(#)이 포함되어 있습니다. 언뜻보면 pw 에 어떤 걸 입력해도 모두 주석처리되어서 mysql 쿼리 결과를 조작할 수 없는 것처럼 보이는데 말이죠.

 

정말 그랬다면, 문제로 나오지도 않았겠지만 말입니다. 사실 mysql 에서 # 주석문은 한 줄 주석문입니다. 말그대로 한 줄에 대한 주석이기 때문에 다음 줄에는 해당되지 않습니다.

 

SQL 쿼리문은 여러줄을 입력할 수 있습니다. 다음 예시를 보도록 하겠습니다.

mysql> select * from user
    -> where user='guest';
+----+-------+----------+
| id | user  | pass     |
+----+-------+----------+
|  2 | guest | guest123 |
+----+-------+----------+
1 row in set (0.00 sec)

select * from user 다음에 엔터키를 입력한 다음에 바로 다음 줄에 where 절을 사용했습니다. 이처럼 위 문제에서도 # 주석문을 우회하기 위해서 개행문자(\n)를 삽입할 수 있겠습니다.

 

그리고 이 개행문자는 아스키코드로 0A 에 해당하고, URL 인코딩을하면 %0A 가 됩니다.

 

현재 문제에서는 아래와 같이 쿼리문이 이루어져있습니다.

select id from prob_dragon where id='guest'# and pw=''

그렇기 때문에 pw='' 다음에 개행문자를 넣어줘서 다음 문장을 만들어보겠습니다.

select id from prob_dragon where id='guest'# and pw=''
and pw='' or id='admin'

and pw='' 을 넣어줘서 앞의 guest 부분은 쿼리의 결과를 거짓으로 만들고, or 다음에 나오는 id='admin' 으로 admin 에 대한 쿼리 결과가 나오도록 했습니다.

 

이제 위 쿼리문을 URL에 넣어서 표현해보겠습니다. 개행문자를 제외한 특수문자들은 모두 URL 디코딩하였습니다.

// ?pw=%27%0Aand%20pw%3D%27%27%20or%20id%3D%27admin
?pw='%0Aand pw='' or id='admin

 

위와 같이 pw 파라미터를 입력하게 되면 아래와 같이 문제를 풀 수 있습니다.

 

- 끝 -

728x90
반응형
댓글