Web Hacking/LOS

Lord of SQL Injection - succubus

Lucvs 2021. 8. 18. 15:11

preg_match('/prob|_|\.|\(\)/i'

를 통하여 'prob', '_', '()', '.' 를 필터링하고 있다.

 

또한 아래에서는 싱글쿼터(')를 필터링하고 있다. 

 

id 와 pw 의 입력값이 모두 싱글쿼터로 갇혀있기 때문에 어떻게든 탈출시켜야 한다.

이전에는 싱글쿼터를 한 번 더 사용함으로써 기존의 싱글쿼터를 탈출했다.

하지만 지금은 싱글쿼터가 필터링 되어있기 때문에 다른 방법을 찾아야 한다.

 

우선 더블쿼터를 이용해보려고 했다. 하지만 쿼리문 자체에서 싱글쿼터로 입력값을 감싸기 때문에 소용이 없다.

그 다음으로는 주석을 이용하려고 했다. 

하지만 어떻게든 문자열을 탈출하여 'or TRUE' 라는 쿼리문을 만들어야 한다.

 

문자열 탈출이 답이다.

 

mySQL 에는 '\' 를 이용함으로써 특수문자를 제어문자가 아닌 일반적인 문자열로 인식하게끔 할 수 있다.

만약 '%'라는 문자를 wild card 가 아닌 일반적인 문자열로 사용하고 싶다면,

'\%' 와 같이 '\'를 사용함으로써 이어지는 특수문자를 일반적인 문자열로 만들 수 있다.

 

이를 이용하여 문자열을 탈출하고 참값을 가지는 쿼리문을 보내면 된다.

 

select id from prob_succubus where id='\' and pw=' or 1#'

백슬래시 뒤에 있는 싱글쿼터는 일반적인 문자열로 인식되어 빨간 글씨는 id의 입력값이 되는 것이고, 

pw 의 입력값을 감싸는 첫번째 싱글쿼터가 id 의 입력값을 감싸는 마지막 싱글쿼터로 사용된다.

 

또한 참값을 가지는 쿼리문 'or 1' 뒤에 주석처리(#)를 함으로써 마지막에 남아있는 pw 입력값의 마지막 싱글쿼터를 무력화할 수 있다.

주석처리는 %23(#)으로 전달해야 작동한다.

 

결국 'or 1' 이 모든 것을 지배하게 된다.