DVWA실습 (SQLInjection-blind)

1. SQLInjection(Blind)란?

SQL Injection-Blind는 공격자가 웹 애플리케이션에서 발생하는 SQL Injection 취약점을 악용하여 데이터베이스에 액세스하려는 공격 형태 중 하나다. Blind SQL Injection은 쿼리의 실행 결과에 대한 정보가 화면에 표시되지 않는 경우에 사용된다. 즉, 공격자는 쿼리의 결과를 직접 확인할 수 없으며, SQL 쿼리의 결과 값이 참 또는 거짓인지를 구별하여 규칙적인 HTTP의 응답의 차이를 이용해 DB의 데이터를 간접적으로 추측하고 수집하는 공격이다.

2. 공격수행

더보기

- 수행하기 앞서 이 blind sql injection공격을 할 때에는 burp의 Repeater기능을 사용하게 된다면 더욱 수월할 것이다.

참 값

- 해당 SQL 질의에 참인 값을 넣었을때 참을 알려주는 결괏값이 나오는 것을 확인할 수 있다.

거짓

- 거짓의 값을 넣었을경우 false값에 대한 DB반응이 도출되는 것을 확인할 수 있다.

- 이 결과를 이용해 Blind SQLinjection을 이용하면 된다는것을 알 수 있다.

- union sql 쿼리를 작성하여 컬럼갯수를 확인해 볼 것이다.

※UNION 구문이란?

- UNION 은 두 개 이상의 select 구문을 결합하는 데 사용하는 구문이다. 이를 사용할 때에는 칼럼의 개수를 맞춰야 한다. 

 

union을 사용하여 컬럼 갯수 확인

- 칼럼개수를 하나를 작성하여 삽입하였다.

삽입한 결과

- 삽입한 결과 에러가 나오는 것을 확인할 수 있다. 이를 통해 칼럼의 개수가 1개가 아니라는 것을 알 수 있다.

칼럼개수 찾기)

컬럼 2개

- 칼럼개수를 2개로 작성하여 삽입한 결과 개수가 참의 결괏값이 나왔다. 

- 이제 데이터베이스에 대한 정보를 찾을 것이다.

DB명 개수 찾기)

DB 명 갯수 찾기
1' and length(database()) = 갯수#

- 위의 질의문을 작성하여 삽입한 결과 4의 값을 삽입하였을 경우 참의 결과가 나와 데이터베이스의 길이가 4라는 것을 알 수 있다.

DB명 찾기)

DB명 확인
1' and substr(database(),1,1)= '문자'#

- 단어 substr을 사용하여 DB명을 하나씩 알아본 결과 D , V , W ,  A라는 것을 알 수 있다.

 

※SUBSTR이란?

- Substring이라는 문자열 가르기 함수이다. 

SELECT SUBSTR(문자열, 시작위치, 길이)

 - 위와 같이 사용할 수 있다. 

EX) JUNHO라는 문자열이 있다

SELECT 	SUBSTR(NAME, 1, 3), //이라고 하면 JUN 까지 나타내고
		SUBSTR(NAME, 2, 4) //이라고 하면 UNHO 까지 나타낼 수 있는 문자열 가르기이다.
FROM TABLE WHERE NAME = JUNHO

DB 테이블 명 개수 찾기)

DB 테이블 명 찾기
1' and length((select table_name from information_schema.tables where table_schema='dvwa' limit 1,1))=갯수#

- 위의 코드에서 보면  LIMIT함수를 사용하여 information_schema.tables 테이블에서 table_schema 가 dvwa인 첫 번째의 테이블의 이름글 가져와서 개수를 확인하는 코드이다.

- 이 결과 5에서 참의 값이 나오는 것으로 DB테이블명이 5개라는 것을 알 수 있다.

DB 테이블 명 확인)

테이블 명 확인
1' and substr((select table_name from information_schema.tables where table_schema='dvwa' limit 1,1),1,1)='문자'#

- SUBSTR을 사용하여 문자열 가르기를 통해 이전에 찾은 테이블의 명을 대입하여 찾아볼 수 있다.

- 그 결과 'users'라는 DB 테이블명을 확인할 수 있다.

칼럼명 문자열 확인)

칼럼명 문자열 확인
1' and substr((select column_name from information_schema.columns where table_name='users' limit 2,1),1,1)='문자'#

- 찾아본 결과 l로 시작하는 것으로 알고 대입해 본 결과 last_name이라는 것을 확인할 수 있다.

3. 대응방안 

더보기

1) 입력값 검증(화이트리스트, 블랙리스트 기반 필터링)

- /*, –, ‘, “,?, #, (, ), ;, @, =, *, +, union, select, drop, update, from 등의 입력값 검증

 

2) prepared statement적용 

- 입력값에 대해 스스로 sql구문을 분석해 주는 클래스

 

3) 불필요한 데이터베이스 에러 메시지가 사용자에게 노출이 되지 않도록 한다.

 

4) 웹 방화벽(WAF, Web Application Firewall)를 사용하여 비정상적인 데이터가 전송되지 않도록 차단한다.

 

5) preg_match를 이용하여 특정 문자열을 사용하지 못하도록 막는다.

 

'DVWA' 카테고리의 다른 글

DVWA실습 (XSS-Stored)  (0) 2023.12.05
DVWA실습(XSS-Reflected)  (0) 2023.12.05
DVWA실습 (XSS -DOM)  (1) 2023.12.04
DVWA실습 (File Inclusion)  (0) 2023.12.03
DVWA 실습(File Upload - Hard)  (0) 2023.12.01