MSSQL에서의 time based sql injection 문제
생각보다 복잡한 MSSQL 문법이었다.
waitfor delay '0:0:3'
과 같이 사용하면 되는데, 어려웠던 점은 아래와 같다.
보통의 SQL injection cheet sheet을 보면, ;
를 삽입하여 구문을 끝낸 후에, waitfor delay
를 사용하라고 한다. 이 문제에서는 ;
가 필터링 되어 있어 그런 방법을 사용할 수는 없었다.
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
이 걸리도록 해 주었다.
아래는 사용한 코드이다.