없다
문제에 들어가면 위에 query와 sql명령문이 적혀있고 아래 코드가 나와 있다.
get으로 요청된 no값에 prob
, _
, .
, ()
, '
, "
, `
이 들어가면 프로그램이 죽는다. 즉 저 값들이 필터링되어 있다.
if(preg_match('/prob|_|\.|\(\)/i', $_GET[no])) exit("No Hack ~_~");
if(preg_match('/\'|\"|\`/i', $_GET[no])) exit("No Quotes ~_~");
그 다음은 query에 sql명령문이 나온다.
명령문은 id
를 찾는데 prob_goblin
이라는 table
에 있어야 하고, id
는 guest
이고, no
는 get으로 요청한 값이여야 한다.
$query = "select id from prob_goblin where id='guest' and no={$_GET[no]}";
id
가 있으면 hello (id값)
이라고 출력되고, id
가 admin
이면 문제가 풀린다.
if($result['id']) echo "<h2>Hello {$result[id]}</h2>";
if($result['id'] == 'admin') solve("goblin");
먼저 query에서 id
부분이 guest
로 고정이 되어 있다. 그 고정을 풀기 위해 sql의 or
를 사용해야 한다.
그리고 필터링 중에 '
가 필터링이 되어 있기 때문에 '
가 없이 id
를 admin
으로 잘 지정해 줘야 한다. 즉 filter bypass를 잘 해 줘야 한다.
먼저 guest로 고정되어 있기 때문에 no에 false값을 넣고(no에 0,1,2,3,4 넣어보면 guest는 1이라는 것을 알 수 있다.) or를 사용한다.
id= 'admin'으로 바꿔줘야 하는데 '
로 필터링 되어 있으니까 filter bypass로 id=0x61646d696e로 적어준다. 저것은 ascii 코드로 admin이다. '
를 사용할 필요없이 admin을 나타낼 수 있기 때문에 사용했다.
/?no=0 or id=0x61646d696e
익스플로잇을 넣었을 떄 실행될 sql query
select id from prob_goblin where id='guest' and no=0 or id=0x61646d696e