MSSQL에서의 time based sql injection 문제

생각보다 복잡한 MSSQL 문법이었다.

waitfor delay '0:0:3' 과 같이 사용하면 되는데, 어려웠던 점은 아래와 같다.

  1. 보통의 SQL injection cheet sheet을 보면, ; 를 삽입하여 구문을 끝낸 후에, waitfor delay를 사용하라고 한다. 이 문제에서는 ; 가 필터링 되어 있어 그런 방법을 사용할 수는 없었다.

  2. select 뒤 쪽으로 waitfor delay를 붙여도 정상적으로 작동하기는 한다. 그러나, ( ) 서브쿼리 안에서는 waitfor delay 가 작동하지 않았고, select 구문과 동등한 레벨(?)에서만 동작하였다.

    이게 문제가 되는 이유는 case when 과 같은 분기를 나눌 수 없기 때문이다. 어떤 식으로 분기를 나누어도 select 가 실행된 이후에는 항상 waitfor delay가 실행되는 것을 볼 수 있었다.


그러다가 결국 알아낸 방법은 다음과 같다.

%0a 를 통해서 ;과 같은 효과를 주면 문장을 끝낼 수 있다는 것이다.

(이렇게 쉬운 줄 알았으면 삽질 안 했을 텐데...)

사용한 쿼리는 아래와 같다.

select id from prob_yeti where 1=1
if 1=(select 1 from prob_yeti where id='admin' and ascii(substring(pw,1,1))>10) waitfor delay '0:0:1'

if 아래 조건이 충족될 때에만 waitfor 이 걸리도록 해 주었다.

아래는 사용한 코드이다.