없다.
문제에 들어가면 위에 query와 sql명령문이 적혀있고 아래 코드가 나와 있다.
get으로 요청된 shit 값 길이가 1보다 크면 프로그램이 죽는다. 또 shit 값에
, \n
, \r
, \t
가 들어가도 죽는다. 즉 이 부분이 필터링 부분이다.
if(strlen($_GET[shit])>1) exit("No Hack ~_~");
if(preg_match('/ |\n|\r|\t/i', $_GET[shit])) exit("HeHe");
그 다음 query가 나오는데 sql명령문이다.
명령문은 1234를 찾는데 prob_giant라는 테이블에 있고, 항상 참이다.
$query = "select 1234 from{$_GET[shit]}prob_giant where 1";
그리고 1234의 결과값이 있으면 문제가 풀린다.
if($result[1234]) solve("giant");
query를 잘 보면 from과 prob_giant가 붙어있는 것을 볼 수 있다. 즉 필터링을 잘 우회해서 그 사이를 빈 공간스페이스( )
즉 공백을 만들어야 한다.
필터링된 공백문자를 보면 스페이스( )
, 줄바꿈 line feed(\n)
, 캐리지 리턴 Carriage Return(\r)
, 탭 tab(\t)
이 필터링 되어 있다. 하지만 이것 외 공백문자 필터링을 우회하는 방법이 있다.
수직 탭 vertical tab(\v)
이나 폼피드 form feed(\f)
를 사용하면 문제를 풀 수 있다.
/?shit=%0b