SQL Injection/SQL Injection

Time Based SQLi

ragdo11 2024. 6. 16. 01:36

Time Based SQL Injection 공격은 시간 지연을 이용하여 쿼리가 참인지 거짓인지 판별하는 공격이다. 결과는 항상 동일하게 나오므로 결과를 보고 공격의 성공 여부를 결정하는 것이 아닌 시간 지연이 되는지를 보고 성공 여부를 결정한다.

 

시간을 지연시키는 대표적인 함수인 sleep() 함수를 대부분 이용하여 Time Based SQLi를 시도한다.

sleep 함수를 이용했을 때 참/거짓에 따른 반응 차이이다. 결과는 동일하나 참인 쿼리에서는 1초가 지연되는 모습을, 거짓인 쿼리에서는 바로 0초만에 처리해버리는 모습을 볼 수 있다.

 

지연이 발생하면 쿼리가 참이라는 것을 이용해 정보를 조금씩 취합한다. 과정이 Blind SQLi랑 굉장히 유사한 점이 많다.

실습 과정을 넣어보려고 하였으나 캡쳐 화면으로는 시간 지연의 발생을 보기가 상당히 번거로운 부분이 있어서 '대충 이런 쿼리로 공격을 시도하는구나' 의 느낌만 가져가도록 하겠다.. ㅠ

 

위 사진은 쿼리가 참이라 시간 지연이 발생한 경우고, 아래 쿼리는 거짓이라 시간 지연이 발생하지 않았다.

쿼리는 저런 느낌으로 작성해주면 되고 아무래도 시간 지연에 따라 참 거짓을 판별하다 보니 그 오래걸리는 Blind SQLi 보다도 더 시간이 오래 걸릴 수 밖에 없다.

 

이외에도 heavy query를 이용하여 시간 지연을 발생시키는 방법이 있다.

헤비 쿼리는 연산을 많이 하게끔 하여 일부러 시간 지연을 발생시키는 쿼리를 말한다.

데이터의 수가 굉장히 많은 information_schema들을 조인해서 전체 행 갯수를 가져오는 쿼리이다. columns 테이블이 tables 테이블보다 데이터의 양이 훨씬 많아 적은 수로도 더 많은 시간 지연이 발생하는 것을 볼 수 있다.

 

헤비 쿼리 역시 sleep 함수처럼 써주면 된다.

sleep 함수와 좀 차이가 있는데 그 중 하나는 결과값이 다르다는 것. sleep 함수의 경우 and를 사용했을 때 앞 조건문이 틀리면 sleep이 실행되지 않았는데, 헤비 쿼리의 경우 앞 조건문이 틀려도 실행함. 쇼트 서킷이 안되는건가..

그리고 조건문이 맞던 틀리던 결과가 같았던 sleep에 비해 헤비 쿼리는 0과 1로 결과값이 다름을 볼 수 있다.

 

그럼 이거는 어떻게 실제로 사용해야 할까.. 하다가 if문이나 case문으로 조건을 나눠서 실행시키게 하면 되겠다는 생각이 들었다.

이런 식으로 1=2인 부등식을 넣었을 때는 뒤의 헤비 쿼리가 실행되지 않아서 응답이 빠르게 왔고,

1=1인 항등식을 넣었을 때는 헤비 쿼리가 실행되어 시간이 지연되었었다!

 

Time Based SQLi는 Blind SQLi의 그냥 하위호환격인 공격이 아닌가 싶지만, Blind SQLi는 어찌됬든 참/거짓에 따라 결과값이 차이가 나는 곳에 사용할 수 있다는 점을 생각하면 Time Based SQLi는 참/거짓의 결과에 차이가 없더라도 사용할 수 있으므로 유용한 부분이 분명 있다.