아래는 서버 코드이다.
<?php
include "./config.php";
login_chk();
$db = dbconnect();
if(strlen($_GET[shit])>1) exit("No Hack ~_~");
if(preg_match('/ |\n|\r|\t/i', $_GET[shit])) exit("HeHe");
$query = "select 1234 from{$_GET[shit]}prob_giant where 1";
echo "<hr>query : <strong>{$query}</strong><hr><br>";
$result = @mysqli_fetch_array(mysqli_query($db,$query));
if($result[1234]) solve("giant");
highlight_file(__FILE__);
?>
이번 문제에서는 아래에 공백을 우회하는 개행문자들을 필터링하고 있다.
그리고 아래를 보면 shit파라미터에 받는 내용이 from prob 사이에 들어간다.
결국 공백을 만들어 쿼리가 참이 되게 해야하는 문제이다.
/**/인 주석을 사용해보았지만 if(strlen($GET[shit])>1) exit("No Hack ~~"); 이것처럼 길이를 체크하고 있어서 실패했다.
아래처럼 +를 사용해보았는데 실패였다.
아마 +는 디코딩 될 때 아예 공백으로 인식이 되어서 그런 것 같다.
그래서 구글링으로 다른 우회 기법을 알아보았다.
한 3가지 정도 더 알 수 있었는데 그 중 수직탭(vertical tab)이라는 것을 발견했다.
우리가 흔히 쓰는 탭은 수평탭인데 여기서는 필터링 되고 있으므로 수직탭을 사용하면 되겠다.
수직탭은 인코딩하면 %0b라고 한다.
글머 페이로드로 아래처럼 %0b를 보내주자.
그럼 성공적으로 solve할 수 있다.