첫화면

<?php
include "./config.php";
login_chk();
$db = dbconnect();
if(preg_match('/prob|_|\.|\(\)/i', $_GET[no])) exit("No Hack ~_~");
if(preg_match('/\'|\"|\`/i', $_GET[no])) exit("No Quotes ~_~");
$query = "select id from prob_goblin where id='guest' and no={$_GET[no]}";
echo "<hr>query : <strong>{$query}</strong><hr><br>";
$result = @mysqli_fetch_array(mysqli_query($db,$query));
if($result['id']) echo "<h2>Hello {$result[id]}</h2>";
if($result['id'] == 'admin') solve("goblin");
highlight_file(__FILE__);
?>
if(preg_match('/prob|_|\.|\(\)/i', $_GET[no])) exit("No Hack ~_~");
이전과 같이 필터링 되어있고
if(preg_match('/\'|\"|\`/i', $_GET[no])) exit("No Quotes ~_~");
로 따옴표들이 필터링 추가되었다.
',",` 들이 필터링 되었다.
$query = "select id from prob_goblin where id='guest' and no={$_GET[no]}";
이 문제의 쿼리인데 id는 guest로 되어있고 no에 우리가 입력할 수 있다.
guest의 no를 알아보려고 일단 1을 넣어봤는데 우연히 맞았다

이로써 admin의 no는 1이 아닌 것을 알게 되었고 no에 1이 아닌 다른 값을 넣어 고정된 id값인 guest를 무력화시켜야한다.
no에 5를 넣었을 때는 'hello guest'가 나오지 않는 것을 알 수 있다.

이제 무력화된 쿼리문에 or을 사용해 id='admin'을 넣어야한다. 하지만 따옴표가 필터링 되므로 인코딩을 해보았다.
id=%27admin%27

인코딩 된 따옴표도 필터링이 되어서 이 방법으로는 풀 수 없다.
스트링 우회법으로 hex 값을 이용해 admin을 변형시켰다.
0x표현으로 0x뒤에 바뀐 hex값을 넣어주면 변형시킬 수 있다.

url뒤에 ?no=5 or id=0x61646d696e 붙여주면 풀린다.
