일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- SANS
- 로그 분석
- SQL Injection
- Burp Suite Intruder
- 보안
- 디스크 포렌식
- 해커 팩토리 6번
- 테이블명 수집
- 리버싱
- 웹 해킹
- 리버싱 기초
- python flask
- 포렌식
- 해커 팩토리
- 부트스트랩
- 시스템 해킹
- Blind Sql Injection
- 해커팩토리 10번
- CTF-d
- 해커팩토리
- 해커팩토리 8번
- 레나 튜토리얼
- 해커팩토리 7번
- 웹해킹 실습
- ftz
- 네트워크 포렌식
- Burp Suite
- union sql injection
- 게시판 만들기
- 파일 다운로드 취약점
- Today
- Total
Cha4SEr Security Study
[Web Hacking] - Blind SQL Injection_1. DB 버전 수집 본문
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 버전을 수집하는 과정에 대해 알아보았습니다.
다음 포스팅에서는 테이블 명과 칼럼 명을 수집하는 방법에 대해 알아보도록 하겠습니다.
'Web > Web Hacking' 카테고리의 다른 글
[Web Hacking] - Blind SQL Injection_2. 테이블명 수집(2) (0) | 2020.07.20 |
---|---|
[Web Hacking] - Blind SQL Injection_2. 테이블명 수집(1) (2) | 2020.07.18 |
[Web Hacking] - Union Based SQL Injection (0) | 2020.07.11 |