없다.
문제에 들어가면 위에 query와 sql명령문이 적혀있고 아래 코드가 나와 있다.
get으로 요청받은 id에 '
가 들어가면 No Hack ~_~
이라고 나오면서 프로그램이 죽는다. 그리고 get으로 요청받은 id
에 strtolower
을 한 뒤에 저장하고, id
에 admin
을 빈 아무것도 없는 것으로 바꾼다.
strtolower
는 대문자를 소문자로 바꾸는 함수이다.
이 부분들이 바로 필터링 부분이다.
if(preg_match('/\'/i', $_GET[id])) exit("No Hack ~_~");
$_GET[id] = strtolower($_GET[id]);
$_GET[id] = str_replace("admin","",$_GET[id]);
그 다음 query가 나오는데 sql 명령문이다.
sql 명령문은 id를 찾는데 prob_vampire이라는 테이블에 있어야 하고, id가 get으로 요청된 id값이어야 한다.
$query = "select id from prob_vampire where id='{$_GET[id]}'";
그리고 id
값이 admin
이면 문제가 풀린다.
if($result['id'] == 'admin') solve("vampire");
id
값에 admin
이 들어가면 문제가 풀리지만, id
에 admin
을 넣을 수 없다. 그리고 Admin
을 이용해서 우회하는 것도 strtolower
때문에 불가능하다. 하지만 다른 우회 방법을 이용하면 문제를 풀 수 있다.
id
에 admin
대신에 admadminin
을 넣는다. 그러면 필터링에 의해 admin
이 지워지면서 admin
이 남는다.(admadminin) 그렇기 때문에 문제가 풀린다.
/?id=admadminin
익스플로잇을 넣었을 때 실행될 sql query
select id from prob_vampire where id='admin'