DOM Based XSS는 XSS(Cross-Site Scripting)의 한 종류로, 클라이언트 측에서 실행되는 자바스크립트 코드가 악의적인 입력을 처리하면서 발생하는 취약점입니다. DOM(Document Object Model)을 조작하는 코드에서 사용자 입력을 적절히 검증하지 않으면 공격자가 악성 스크립트를 삽입하여 실행할 수 있습니다.
클라이언트 측에서 발생: 서버와 상관없이 브라우저 내에서 실행되는 코드에서 취약점이 발생합니다.
DOM 조작: 자바스크립트 코드가 DOM 요소를 조작하거나 값을 동적으로 생성하는 과정에서 사용자 입력이 제대로 검증되지 않은 경우 취약점이 발생합니다.
HTTP 요청 필요 없음: 서버 요청이나 응답이 필요하지 않으며, 단순히 URL, 브라우저 히스토리, 또는 클라이언트 측 저장소(예: LocalStorage) 등을 통해 입력이 전달될 수 있습니다.
신뢰할 수 없는 데이터 사용: 사용자 입력을 DOM에 직접 삽입하거나 자바스크립트에서 동적으로 실행할 때 검증 없이 사용하는 경우.
JavaScript의 위험한 메서드: innerHTML, document.write, eval, setTimeout, setInterval 등의 메서드 사용 시.
동적 URL 매개변수 처리: URL의 쿼리 파라미터 또는 해시 값이 DOM 요소에 삽입되는 경우.
<!DOCTYPE html>
<html>
<head>
<title>DOM Based XSS Example</title>
<script>
document.addEventListener('DOMContentLoaded', function() {
const param = new URLSearchParams(window.location.search);
const userInput = param.get('input');
document.getElementById('output').innerHTML = userInput;
});
</script>
</head>
<body>
<h1>DOM Based XSS Test</h1>
<div id="output"></div>
</body>
</html>
http://example.com/?input=<script>alert('XSS')</script>
HTML 인코딩: &, <, >, " 등을 안전한 엔티티로 변환.
document.getElementById('output').textContent = userInput;
Content Security Policy(CSP) 적용: 스크립트 실행을 제어하여 악성 스크립트 실행 가능성을 줄입니다.
라이브러리 사용: DOMPurify와 같은 라이브러리를 사용하여 신뢰할 수 없는 입력을 안전하게 처리합니다.