문제에 접속하게 되면 SQL Injection이라는 문구와 함께 하나의 입력창과 소스코드를 볼 수 있다.
여러 값들을 입력해보면 입력값들을 get방식으로 no 변수의 값으로 전달하는 것을 URL을 통해 알 수 있다.
<?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!";
}
}
?>
소스코드의 php는 다음과 같다.
preg_match 함수에서 볼 수 있듯이 **공백, /, (, ), |, &, select, from, 0x (대소문자 무시)**는 필터링이 된다는 사실을 알 수 있다."select id from chall18 where id='guest' and no=$_GET[no]" 를 우회해야한다는 사실, 그리고 admin의 no는 2라는 사실을 알 수 있다.우리가 입력해야되는 값, 즉 URL에 no값으로 넘겨야하는 값의 형태는 ?no=14 or no=2 의 형태이다. 그러나 공백은 URL인코딩해서 넘기더라도 preg_match() 함수에 걸리기 때문에, 탭(Tab)을 이용해 URL 인코딩으로 %09 값을 통해 ?no=14%09or%09no=2 이렇게 넘기면 포인트를 획득할 수 있다.