없다.
문제에 들어가면 "SQL INJECTION"이라고 적혀 있고, 아래 입력창과 소스코드를 볼 수 있는 링크가 주어진다.
소스코드는 이렇게 되어 있다.
php 부분만 따로 보면 get
으로 no
가 요청된 값이 있을 때 dbconnect
가 이루어진다.
if($_GET['no']){
$db = dbconnect();
그리고 get으로 요청된 no값에
, /
, (
, )
, |
, &
, select
, from
, 0x
가 들어갈 경우 "no hack"이라고 나온 뒤에 프로그램이 죽는다. 즉 이 부분이 필터링부분이다.
if(preg_match("/ |\/|\(|\)|\||&|select|from|0x/i",$_GET['no'])) exit("no hack");
sql문을 보면 id
를 찾는데 chall18
이라는 테이블에 있고, id
는 guest
이고, no
는 get
으로 요청된 값이다.
그리고 주석으로 admin
의 no
는 2
라고 한다.
$result = mysqli_fetch_array(mysqli_query($db,"select id from chall18 where id='guest' and no=$_GET[no]")); // admin's no = 2
만약 찾은 id
가 guest이면 hi guest
를 출력하고, 찾은 id
가 admin
이면 문제가 풀리고, hi admin!
을 출력한다.
if($result['id']=="guest") echo "hi guest";
if($result['id']=="admin"){
solve(18);
echo "hi admin!";
filter bypass를 잘 이용해서 sql injection을 사용하면 된다.
id
가 guest
로 고정되어 있기 때문에 or
를 이용해야 할 거 같다.
guest
의 no
을 넣어서 false
으로 만들어야 되기 때문에 숫자를 하나씩 넣어보면 guest
의 no
는 1
인 것을 알 수 있다.
필터링 중에 스페이스( )
도 필터링이 되어 있기 때문에 스페이스( )
대신에 %09
를 사용한다. %09
은 tab의 아스키코드값인데 sql에서는 스페이스로 인식을 한다.
이것을 가지고 익스플로잇을 짠 뒤에 url에 뒤에 넣으면 문제가 풀린다.
?no=0%09or%09no=2