없다.
문제에 들어가면 위에 query와 sql명령문이 적혀있고 아래 코드가 나와 있다.
get으로 요청된 id
, pw
값에 prob
, _
, .
, ()
, '
가 들어가면 프로그램이 죽는다. 즉 필터링 부분이다.
if(preg_match('/prob|_|\.|\(\)/i', $_GET[id])) exit("No Hack ~_~");
if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");
if(preg_match('/\'/',$_GET[id])) exit("HeHe");
if(preg_match('/\'/',$_GET[pw])) exit("HeHe");
그 다음은 query에 sql명령문이 나온다.
명령문은 id
를 찾는데 prob_succubus
라는 테이블에 있어야 하고, id
, pw
값은 요청된 id
, pw
값이어야 한다.
$query = "select id from prob_succubus where id='{$_GET[id]}' and pw='{$_GET[pw]}'";
그리고 id
를 찾으면 문제가 풀린다.
if($result['id']) solve("succubus");
이 문제를 풀기 위해선 id
를 찾아야 하는데 id
를 찾기 위해서 id
값과 pw
값을 알고 있어야 한다. 하지만 모르기 때문에 sql injection을 이용하여 필터링을 잘 우회해서 문제를 풀어야 한다.
\
는 다른 의미가 생기지 않게 막을 수 있지만 반대의 경우도 생기게 할 수 있다.
\
를 id
값에 넣어서 id
뒤에 있는 '
의 의미를 문자열로 인식하게 만든다. 그렇게 하면 다음 '
인 pw
앞까지가 id
의 범위가 되면서 pw
값에 '
를 넣지 않아도 되게 된다. 그래서 pw
값에 or
를 넣고, 뒤에 true
로 만들고 뒤에 주석 처리만 하면 문제가 풀린다.
/?id=\&pw= or 1=1 -- -
익스플로잇을 넣었을 때 실행될 sql query
select id from prob_succubus where id='\' and pw=' or 1=1 -- -'