DOM-based XSS

DOM이란 Document Object Model의 약자로, HTML 태그들의 집합이자 구조를 뜻합니다. 트리 구조를 띕니다.

DOM-based XSS 공격은 다른 XSS 공격 기법들과 다르게 서버가 악성 스크립트에 응답하지 않는 공격 기법입니다.

이름에서 알 수 있듯 DOM 구조를 이용한 기법으로, JavaScript 같은 스크립트 언어를 이용하여 DOM 구조에 접근하여 공격을 시행합니다.

공격 방식

주로 보안에 취약한 코드가 DOM 객체를 제어하는 과정에서의 취약점을 이용하며, URL에 악의적인 스크립트를 추가한 뒤 그 URL을 피해자들에게 퍼트리는 방식입니다.

이때 공격은 클라이언트 측에서 사용자의 입력 값을 통해 동적 페이지를 구성하는 환경에서 이루어지기에,

요청이 서버로 가지 않고 클라이언트 브라우저에서만 이루어집니다.

 

공격 시나리오

  1. 보안에 취약한 페이지에 악성 스크립트가 실행되도록 URL 주소를 만들어 사용자들에게 전달합니다.
  2. 사용자들은 메일 등을 통해 전달받은 URL을 클릭합니다.
  3. URL을 통해 서버로부터 HTML 문서를 전달받습니다.
  4. 이때 사용자의 브라우저가 HTML 문서를 읽는 과정에서 URL에 숨겨져있던 악성 스크립트가 동작합니다.
  5. 악성 스크립트를 통해 공격자에게 사용자의 정보가 전달됩니다.

취약한 함수들

  • example.innerHTML
  • example.outerHTML
  • document.write(), document.writeln()
  • eval()
  • location.href
  • loacthon
  • location.replace()

이 이외에도 수많은 함수들이 있지만 주로 워게임 등 보안 문제를 풀때는 위와 같은 함수들이 자주 보입니다.

 

DOM-based XSS 예시

<!-- example.html -->
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>DOM XSS Example</title>
</head>
<body>
  <h1>검색 결과</h1>
  <div id="result"></div>

  <script>
    // 사용자가 전달한 해쉬 값 받아오기
    const query = location.hash.slice(1); // # 제거
    document.getElementById("result").innerHTML = "검색어: " + query;
  </script>
</body>
</html>

 

위같은 코드가 있다고 예를 들어보겠습니다.

location.hash은 URL의 # 뒤에 있는 문자열을 반환해주는 함수입니다.

slice(1)은 문자열의 특정 범위를 잘라내는 함수로, location.hash로 가져온 문자열 앞에 붙은 #를 없애줍니다.

URL의 해시 값을 가져오는 역할을 하며 위 코드는 query에 # 뒤에 온 문자열을 넣어줍니다.

예) https://example.com/example.html#1234  //query = 1234

 

이때 result에 query의 값이 들어가게되는데, 아무런 필터링과 검사조차 없기에 악의적인 스크립트가 삽입 될 수 있습니다.

공격 URL의 예시는 아래와 같습니다.

https://example.com/example.html#<img src=x onerror=alert('XSS')>

 

location.hash.slice(1)로 인해 #가 사라진 <img src=x onerror=alert('XSS')> 값이 query 변수에 들어가고,

그 값이 다시 result에 들어가게 되면서 innerHTML을 통해 HTML로 렌더링 되게 됩니다.

이를 통해 onerror 이벤트가 실행되어 XSS가 발생하게 됩니다.

 

'보안 > 이론 정리' 카테고리의 다른 글

웹 해킹 - SVG 파일과 취약점  (0) 2025.09.19
웹 해킹 - SSTI  (0) 2025.09.15
Base64에 대한 여러가지  (0) 2025.07.17
curl의 사용법과 보안 활용 정리  (0) 2025.07.09
웹 해킹 - Error Based SQL Injection  (0) 2025.07.08

+ Recent posts