본문 바로가기

Wargame(hacking)/LOS

LORD OF SQLINJECTION : giant

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 가 필터링 되지 않는다. 

 

그림 1

 

참고

 

https://inpa.tistory.com/entry/JS-%F0%9F%93%9A-%EC%A0%95%EA%B7%9C%EC%8B%9D-RegExp-%EB%88%84%EA%B5%AC%EB%82%98-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-%EC%89%BD%EA%B2%8C-%EC%A0%95%EB%A6%AC

 

📚 JavaScript 정규 표현식 문법 총정리 + 응용 예제

정규 표현식(Regular Expression) 정규식(Regular Expression)은 문자열에서 특정 내용을 찾거나 대체 또는 발췌하는데 사용된다. 대표적으로 입력칸에 전화번호나 이메일을 입력하라고 했을때 옳지 않은

inpa.tistory.com

 

\n|\r|\t

\n
줄 바꿈(LF, U+000A) 문자에 일치

\r
캐리지 리턴(CR, U+000D) 문자에 일치

\t
탭 (U+0009) 문자에 일치