<?
echo("<a href=index_lolll.phps>source</a>");
if(!$_GET[id]) $_GET[id]="guest";
echo("<html><head><title>Challenge 61</title></head><body>");
if(eregi("\(|\)|union|select|challenge|from|,|by|\.",$_GET[id])) exit("Access Denied");
if(strlen($_GET[id])>18) exit("Access Denied");
$q=@mysql_fetch_array(mysql_query("select $_GET[id] from c_61 order by id desc limit 1"));
echo("<b>$q[id]</b><br>");
if($q[id]=="admin") @clear();
echo("</body></html>");
?>
코드를 한줄 씩 해석해보면
(,),union,select 등등이 필터링 되어 있으며 파라미터로 18글자가 넘어서는 안된다.
order by는 정렬이며 limit 는 리턴 밸류를 제한하는 명령어다.
어쨋든 from이 막혀있기 때문에 새로 구문을 작성할 수도 없다.
즉 select 부분에서 무언가를 해주어야한다.
(,)가 막혀있으니 함수를 쓸수도 없다.
as를 이용하여 풀이를 할 수 있다.
'admin' as id를 하게 되면 id column에 admin이라는 데이터 값이 들어가게 된다.
as를 안쓰고 'admin' id로 해도 된다.
하지만 '가 먹히지 않는다.
즉 이 admin을 16진수로 우회하여 주입하면 된다.
?id=0x61646d696e%20id