Write-Up
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";
위의 조건들을 보면, strlen() 에 의해 shit 에 대한 인자의 길이가 1자리를 넘어가서는 안된다. 또한 공백에 대한 필터링 패턴 ( |\n|\r|\t )이 적용되어 있다.
select 1234 fromprob_giant where 1
위는 현재 쿼리인데, from 과 prob_giant 사이에 공백이 없어, 올바른 query가 수행되지 않는다. 공백을 통해 두 문자 사이를 떨어뜨려주도록 한다.
White Space Filtering ( %20 ) 일 경우 다른 공백 문자는 아래와 같다.
\n : ( %0a ) \t : ( %09 ) \r : ( %0d )
/**/
() +
vertical tab : ( %0b ) form feed : ( %0c )
해당 문제에서는 %0b 와 %0c 가 필터링 되지 않는다.
참고
\n|\r|\t
\n
줄 바꿈(LF, U+000A) 문자에 일치
\r
캐리지 리턴(CR, U+000D) 문자에 일치
\t
탭 (U+0009) 문자에 일치