Cha4SEr Security Study

[Web Hacking] - Blind SQL Injection_1. DB 버전 수집 본문

Web/Web Hacking

[Web Hacking] - Blind SQL Injection_1. DB 버전 수집

Cha4SEr 2020. 7. 17. 18:05

Union Based SQL Injection에 이어 Blind SQL Injection에 대해 알아보도록 하겠습니다.

 

Blind SQL Injection 은 데이터베이스 조회 후 결과를 직접적으로 확인할 수 없는 경우 사용하는

공격 기법입니다.

 

흔히 사용자로부터 입력받은 데이터를 비교해 참/거짓을 구분 짓고, 참/거짓의 결과에 따른 특별한

응답을 생성할 때 시도해 볼 수 있습니다.

 

 

이해하기 쉽게 실습 사이트에서 직접 해보면서 설명하겠습니다.

실습 사이트 : http://testphp.vulnweb.com/listproducts.php?cat=1 

 

pictures

The shore Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Donec molestie. Sed aliquam sem ut arcu. painted by: r4w8173 comment on this picture Mistery Donec molestie. Sed aliquam sem ut arcu. painted by: r4w8173 comment on this picture The univer

testphp.vulnweb.com

 

 

우선 간단하게 해당 웹 사이트가 Blind SQL Injection을 수행할 수 있는 취약한 웹사이트 인지 확인하기 위해 

and 연산자를 통한 Boolean 조건을 이용합니다.

 

현재 웹 사이트의 URL의 가장 마지막 부분에서 cat=1 이라는 파라미터를 서버에 보내고 있습니다. 

 

여기서 시도해 볼 수 있는 케이스는 두 가지 입니다. 

 

1) http://testphp.vulnweb.com/listproducts.php?cat=1 and 1=1

 

 

 

 2) http://testphp.vulnweb.com/listproducts.php?cat=1 and 1=2 

 

 

 

 

and 연산자는 앞뒤 조건이 모두 만족되어야 참을 반환합니다. 

위 예시에서 1번은 (cat=1)(1=1) 모두가 참이기 때문에 정상적인 페이지를 보여주고

2번은 (cat=1)(1=2) 에서 (1=2)가 거짓이기 때문에 공백 페이지를 출력합니다.

 

이와같은 상황이 나올수 있었던 이유는 서버에 요청을 보낼 때 데이터베이스에서 cat = 1 인 데이터를 가져오는

형식으로 이루어져있기 때문입니다.

 

즉, 테이블 명이 어떤 것인지는 아직 모르지만

 

SELECT * FROM 'table_name' WHERE cat=1  와 유사한 형식으로 진행되는 것으로 예측할 수 있습니다.

 

여기서 "cat=1"  URL에서 직접 입력받기 때문에 적절한 필터링이 없는 경우

 

"cat=1 and 1=1" 을 입력하게 되면

 

SELECT * FROM 'table_name' WHERE (cat=1) and (1=1) 

 

이런식으로 전달하게 되어 조건문이 만족하기 때문에 정상 페이지를 출력하게 되고,

 

"cat=1 and 1=2" 을 입력하게 되면

 

SELECT * FROM 'table_name' WHERE (cat=1) and (1=2)

 

 

와 같이 전달 되어 조건문이 만족하지 않기 때문에 cat=1을 나타내는 페이지를 불러올 수 없게 됩니다.

 

 

 

이제 이 사이트가 취약하다는 것을 알게 되었으니 Blind SQL Injection을 통해 데이터를 수집해 봅시다.

 

1) DB 버전 찾기

DBMS의 종류와 버전에 따라 쿼리문 종류가 달라질 수 있습니다.

공격자의 입장에서는 버전 정보를 획득하면 그 버전에 맞는 쿼리문을 유연하게 만들 수 있고,

관리자 입장에서는 취약성 검증용이나 해당 버전에 맞는 cve를 참고할 수 있기 때문에 

DB 버전도 나름 유용한 정보가 될 수 있습니다.

 

Mysql 기준으로 DB의 버전을 알기위해 사용하는 키워드는 "@@version" 입니다.

 

 

제 PC에 깔려있는 Mysql 버전은  8.0.20 입니다. 공격을 위해 수집할 때는 소수점 뒤에있는 값들 까지 알 필요는 없고 8,5,6, 등 앞에 나오는 숫자만 알아도 무방합니다.

 

@@version 에서 가장 앞에 나오는 숫자만 따오기 위해서는 substr() 함수를 이용합니다.

substr 함수의 경우 DB버전 뿐만 아니라 Blind SQL Injection에서 많이 사용되기 때문에 자세히 알아두시면 좋겠습니다.

 

* substr(string, start_index, count)

string : 문자열

start_index : 출력할 문자열의 시작 인덱스 위치

count : start_index로부터 몇글자를 출력할지 지정즉, 첫번째 인자로 들어온 문자열의 시작부분과 출력할 글자 수를  정해서 그 부분만 출력하는 함수입니다.여기서 인덱스는 보통 프로그래밍 언어와 다르게 0이 아닌 1부터 시작합니다.

 

ex1 ) SELECT substr("abcde",1,2) = ab

 

 

ex2 ) SELECT substr("abcde",2,3) = bcd

 

 

ex3) SELECT substr(@@version,1,1) = 8

 

 

DB  버전을 알기 위해 사용할 때에는 ex3)과 같이 이용합니다. 

 

 

이제 공격 사이트에서 어떤 버전을 사용하는지 쿼리문을 날려서 확인

하기 전에! URL을 다시 살펴봅시다.

 

 

http://testphp.vulnweb.com/listproducts.php?cat=1

우리는 이 쿼리문에 and 연산자를 포함시켰을 때 참인 경우와 거짓인 경우에서의 결과 화면을 알고 있습니다.

 

- 참인 경우 : 정상 페이지 출력

- 거짓인 경우 : 공백 페이지 출력

 

그렇다면 and 뒤에 1=1 / 1=2가 아닌 

 

1) cat = 1 and DB버전 = 5

2) cat = 1 and DB버전 = 7

3) cat = 1 and DB버전 = 8

 

이런식으로 DB 버전에 대해 무작위로 대입 해 볼 수 있습니다. 

예를 들어 시스템의 DB 버전이 5였다면

 

1)의 경우는 정상 페이지가 출력 되고 2),3)의 경우는 공백 페이지가 출력될 것입니다. 

직접 시도해보겠습니당

 

 

1) cat = 1 and substr(@@versioin,1,1)=5

 

 

 

and 다음 substr으로 DB 버전의 첫글자를 따서 5와 비교하였습니다.

 

and 연산 후 결과가 참일 경우에 정상 페이지가 출력되기 때문에 해당 서버의 DB 버전은 5인것을 한번에 확인하였습니다.

 

=> SELECT * FROM 'table_name' WHERE (cat=1) and (substr(@@version,1,1) = 5) 

1. (cat=1) : 참

2. (substr(@@version,1,1) = 5) : 참 

3. and 연산 결과 : 참

4. 결과 페이지 : 정상

 

2) cat = 1 and substr(@@versioin,1,1)=7

 

 

 

3) cat = 1 and substr(@@versioin,1,1)=8

 

2), 3) 의 경우 DB 버전이 7,8이 아니기 때문에 and 연산의 결과가 거짓이 되었습니다.

 

따라서 정상 페이지가 아닌 공백 페이지가 출력되었습니다.

 

=> SELECT * FROM 'table_name' WHERE (cat=1) and (substr(@@version,1,1) = 7) 

1. (cat=1) : 참

2. (substr(@@version,1,1) = 7) : 거짓 

3. and 연산 결과 : 거짓

4. 결과 페이지 : 공백 페이지

 

 

이상으로 Blind SQL Injection에 대한 개요와 DB 버전을 수집하는 과정에 대해 알아보았습니다.

다음 포스팅에서는 테이블 명과 칼럼 명을 수집하는 방법에 대해 알아보도록 하겠습니다.

Comments