Notice
Recent Posts
Recent Comments
Link
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
Tags more
Archives
Today
Total
관리 메뉴

Hello Security World

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

정보보안/BWAPP Bee-box

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

프로앱등이 2020. 5. 3. 18:35

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() 함수를 사용하면 된다.