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 구문을 결합하는 데 사용하는 구문이다. 이를 사용할 때에는 칼럼의 개수를 맞춰야 한다.

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

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

- 칼럼개수를 2개로 작성하여 삽입한 결과 개수가 참의 결괏값이 나왔다.
- 이제 데이터베이스에 대한 정보를 찾을 것이다.
DB명 개수 찾기)

1' and length(database()) = 갯수#
- 위의 질의문을 작성하여 삽입한 결과 4의 값을 삽입하였을 경우 참의 결과가 나와 데이터베이스의 길이가 4라는 것을 알 수 있다.
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 테이블 명 개수 찾기)

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 |