webhacking/sql, sql injection

시간 기반 sql 인젝션.

qkqhxla1 2014. 8. 22. 18:36

참고 : http://www.sqlinjection.net/


시간 기반 인젝션은 간단히 설명하자면 쿼리의 결과값이 true이던 false이던간에 그 결과값을

화면에 출력하지 않아서 알아볼 수 없을 시에, 시간을 멈춤으로서 경과한 시간을 가지고

쿼리의 참 거짓을 판별하는걸 말합니다.

테이블을 간단하게 하나 만들었습니다.



1. 위 설명 그대로 시간을 멈춤. mysql의 sleep함수를 이용합니다. password에서 첫 글자를 뽑아

왔을시 h가 맞으면 2초를 멈추겠다는 쿼리입니다. 아래 결과를 보면 첫글자가 h가 맞을시 2초의

시간이 걸렸고, 틀렸을시에는 그냥 결과를 출력하는걸 알 수 있습니다. 코딩을 할 때에는 시간 모듈

같은걸 써서 해당 시간이상걸렸으면 true라고 판별하면 되겠죠?


2. sleep함수가 필터링되서 못쓸경우. benchmark()함수를 이용.

benchmark(돌릴 횟수, 돌릴 함수()) 돌릴 횟수를 조정해가며 적당한 시간을 멈추게 할 수 있습니다.

하지만 benchmark()함수는 서버의 성능이나 db의 양에 따라서 늦춰지는 속도가 다를 수 있으니

무조건 신뢰하지 말고 충분한 테스트를 거친 후 인젝션하는게 좋습니다.

benchmark()함수 예시.


테스트해보면(아래 결과입니다.). password에서 한글자를 뽑아와서 h가 맞으면 benchmark로 

시간을 지연하고, 아니면 1 했을경우 2.38초의 시간이 지연되는걸 확인할수 있습니다. a로 

바꿨을시에는 거짓이니 바로 출력하네요.


3. 헤비쿼리.

적당히 큰 쿼리(내부 데이터 400개정도 이상? 환경에 따라서 다를 수 있습니다. 400개는 제

개인적인 크기입니다.)를 더 큰 크기로 늘려서 가져오게 될 경우 오래 걸리는 시간을 이용한겁니다.

이것도 benchmark()와 마찬가지로 서버의 환경에 따라서 멈추는 시간이 다를 수 있으므로

충분한 검증을 요합니다.

예시.



똑같은 information_schema.columns테이블을 세번 불러오니 적당히 2.49초정도 멈추네요.

sleep, benchmark()둘다 막혔을때 쓰시면 됩니다.

password에서 한글자를 뽑아와서 h가 맞으면 큰 쿼리연산을 실행하고, 아니면 1.

원리는 같습니다.



'webhacking > sql, sql injection' 카테고리의 다른 글

rubiya.kr 2번  (0) 2014.08.28
rubiya.kr 1번.  (0) 2014.08.28
효율적인 블라인드 인젝션  (0) 2014.08.20
숫자 뽑아오기.  (0) 2014.08.19
webhacking.kr 7번 소스코드  (0) 2014.08.19