없다.
문제에 들어가면 위에 query와 sql명령문이 적혀있고 아래 코드가 나와 있다.
get으로 요청받은 id값에 '
, admin
이 들어가면 프로그램이 죽는다. 즉 저 값들이 필터링되어 있다.
if(preg_match('/\'/i', $_GET[id])) exit("No Hack ~_~");
if(preg_match("/admin/", $_GET[id])) exit("HeHe");
그 다음 query가 나오는데 sql 명령문이다.
sql명령문은 id를 찾는데 prob_troll이라는 테이블에 있어야 하고, id가 get으로 요청된 id값이어야 한다.
$query = "select id from prob_troll where id='{$_GET[id]}'";
그리고 id
값이 admin
이면 문제가 풀린다.
if($result['id'] == 'admin') solve("troll");
id
값에 admin
이 들어가면 문제가 풀리지만, id
에 admin
을 넣을 수 없다. 그래서admin
을 대신하면서 필터링을 우회할 값을 넣으면 문제를 풀 수 있다. (preg_match("/admin/", $_GET[id]))
를 보면 i
가 없는 것을 볼 수 있다. 즉 필터링부분은 대소문자를 구분한다.
id
값에 admin
대신 Admin
을 넣는다. 필터링부분은 대소문자를 구분하지만 sql에서는 대소문자를 구분하지 않기 때문에 필터링을 우회할 수 있다.
그렇기 때문에 문제가 풀린다.
/?id=Admin
익스플로잇을 넣었을 때 실행될 sql query
select id from prob_troll where id='Admin'