[Web Hacking] Bee - Box - Time Based SQL injection
Bee - Box - Time Based SQL injection

Time based SQL i 은 SQL i 이 가능한 취약한 파라미터에 특수문자 , SQL 함수 등 을 필터링 하지 않을때 사용 할 수 있다.
SQL i 종류 는 여러가지가 있다. Union base , Error Base , Time Base 등 .. 그 중 Time Base 를 사용하는 경우는
sql i 을 통해 '참' , '거짓' 의 결과 값을 웹 어플리케이션 에서 문자열 또는 그에 준 하는 액션 등을 취하지 않을때 사용 할 수 있다.
Union Base 의 경우에도 SQL 쿼리문 삽입시 화면에 칼럼,테이블명 등 이 틀에 맞게 출력이 된다. 이를 이용해서 정보를
얻는 방식이다.
Blind SQL i 의 경우에는 칼럼,테이블 명 등이 페이지에 출력되진 않지만 '참',거짓' 을 판단 할 수 있는 문자열 등이 출력되는 것
을 확인함으로서 유추가 가능하다.
Error SQL i 의 경우에도 SQL 쿼리문 질의 에러 결과를 보면서 칼럼명,테이블명 등을 유추 할 수 있다.
하지만 위의 모든 상황이 안될경우에는 Time base 를 이용 할 수 있다.
Time Based SQL i 은 seelp() , banchmark() 함수 등 시간과 관련된 함수를 사용해서 SQL i 을 시도 할 수 있다.
실습을 통해서 어떻게 이루어 지는지 확인해보자 !

위의 페이지는 Time based SQL i 가능한 페이지이다. 위의 페이지에서 쿼리문을 '참','거짓' 을 삽입하고
웹 어플리케이션의 반응을 살펴보자

아무 반응이 없다 그렇다면 sleep() 함수를 넣어서 삽입한 쿼리문이 지연이 되는지 확인해보자 !

and 연산자로 sleep() 함수를 호출하기 때문에 이전 쿼리가 참이면 응답을 지연한다. sleep() 함수는 인자로 정수형 값을
입력받는데, 이때 입력한 숫자의 초 단위로 응답을 지연한다. SQL i 결과 해당 데이터가 존재하는것 같다.
이제 위의 결과를 토대로 Time Based SQL i 을 시도해보자
'' or 1=1 쿼리로 서버의 정상 쿼리와 연결한 다음 length() 함수와 substring() 함수를 사용하여 데이터베이스 내용을 추측한다.
항상 sleep() 함수는 마지막에 and 연산자로 입력해준다.
쿼리
' or 1=1 and length(database())=5 and sleep(5)#
결과

다음은 length() 함수로 데이터베이스 이름의 길이를 추측하는 쿼리다. 'database()' 는 서버의 데이터베이스 명 을 반환하는 함수이다
1부더 대입해서 5일때 5초 동안 지연되므로 데이터베이스 명은 다섯 자리이다.
이제 substr() 함수로 database 명이 5글자 인 것을 알았으니 database 명을 알아내보자 !
쿼리
' or 1=1 and substr(database(),1,1)='b' and sleep(5)#
결과

위의 쿼리문을 a~b까지 대입 했을때 데이터베이스 명의 첫번째 글자가 'b' 일때 지연이 발생 했음으로 첫번째 글자는
'b' 인 것을 알아냈다.
1 2 3 4 5 ' or 1=1 and substr(database(),1,1)='b' and sleep(5)# ' or 1=1 and substr(database(),2,1)='w' and sleep(5)# ' or 1=1 and substr(database(),3,1)='a' and sleep(5)# ' or 1=1 and substr(database(),4,1)='p' and sleep(5)# ' or 1=1 and substr(database(),5,1)='p' and sleep(5)# |
이렇게 위의 쿼리문 처럼 지속적으로 대입 했을때 데이터베이스 명은 'bwapp' 인 것 을 알아넀다.
이렇듯 sleep() 함수를 사용해서 Time Based SQL i 을 시도하면 된다 문법은 기존의 Blind SQ i 을 할때와 흡사하다.
기존의 Blind SQL i 에 sleep() 함수만 추가된 것 이다.
sleep() 함수가 필터링 당했을때는 banchmark() 함수를 사용하면 된다.