DOM-based XSS
DOM이란 Document Object Model의 약자로, HTML 태그들의 집합이자 구조를 뜻합니다. 트리 구조를 띕니다.
DOM-based XSS 공격은 다른 XSS 공격 기법들과 다르게 서버가 악성 스크립트에 응답하지 않는 공격 기법입니다.
이름에서 알 수 있듯 DOM 구조를 이용한 기법으로, JavaScript 같은 스크립트 언어를 이용하여 DOM 구조에 접근하여 공격을 시행합니다.
공격 방식
주로 보안에 취약한 코드가 DOM 객체를 제어하는 과정에서의 취약점을 이용하며, URL에 악의적인 스크립트를 추가한 뒤 그 URL을 피해자들에게 퍼트리는 방식입니다.
이때 공격은 클라이언트 측에서 사용자의 입력 값을 통해 동적 페이지를 구성하는 환경에서 이루어지기에,
요청이 서버로 가지 않고 클라이언트 브라우저에서만 이루어집니다.
공격 시나리오
- 보안에 취약한 페이지에 악성 스크립트가 실행되도록 URL 주소를 만들어 사용자들에게 전달합니다.
- 사용자들은 메일 등을 통해 전달받은 URL을 클릭합니다.
- URL을 통해 서버로부터 HTML 문서를 전달받습니다.
- 이때 사용자의 브라우저가 HTML 문서를 읽는 과정에서 URL에 숨겨져있던 악성 스크립트가 동작합니다.
- 악성 스크립트를 통해 공격자에게 사용자의 정보가 전달됩니다.
취약한 함수들
- 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 |