[Solved in under 15 minutes]
여러 워게임 사이트에서 풀어보려고 스윽 보다가 SQLI문제를 발견해 바로 해보았다.

바로 소스코드를 보자~

<?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!";
}
}
?>
소스코드중에 핵심 부분인 까지만 보면,
id가 guest로 고정이 되어 있고 no를 인자로 받는다.
LoS의 Goblin문제와 유사해 보인다.
하지만 주석처리로 // admin's no = 2 를 보아 no=2가 되면 admin으로 로그인이 가능하다는 말이다.
일단 id가 guest로 고정되어 있으니 앞에 구문인 id='guest' and no='' 부분을 false로 만들고 or을 삽입하여 no=2로 하는 시도를 해보자

역시나 단순하게 풀리지 않는다.
필터링을 확인해보자.
if(preg_match("/ |\/|\(|\)|\||&|select|from|0x/i",$_GET['no'])) exit("no hack");
이 부분만 제대로 보면 필터링이 여러가지가 걸려있다.
공백과 괄호 기타등등 걸려있다.
끄적끄적님이 작성해준 SQLI 필터링 우회 자료를 통해 공백우회에 %0b를 사용해보았다.

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ 답 ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
?no=3%0bor%0bno=2
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
를 삽입하니 잘 되는 것을 볼 수 있다.
해당문제는 저번의 Goblin 문제와 비슷하지만 admin이 no=2라는 것을 알려준 바, 이 문제의 핵심은 공백 필터링을 어떻게 우회하냐 인 듯 하다.
Webhacking.kr Old-18 Write-up
이상 보고 끝!