Dom Clobbering이란?
Dom Clobbering은 웹 보안에서 DOM 객체와 HTML 요소의 속성이 충돌하여 예상치 못한 동작을 유발하는 취약점이다. HTML 문서 내에서 요소의 id나 name 속성을 사용하면, 자바스크립트에서 해당 요소가 전역 객체의 속성으로 자동으로 등록된다. 이를 악용하면 기존의 전역 변수나 함수가 덮어 씌워져 보안 문제가 발생할 수 있다.
공격 방법
DOM Clobbering 성공 여부를 확인하는 PoC 코드이다.
<a id="CONFIG" name="redirectUrl" href="javascript:alert(1);"></a>
<a id="CONFIG"></a>
<div id="config_status" style="white-space: pre;"></div>
<script>
if (window.CONFIG) {
if (CONFIG.redirectUrl) {
location.href = CONFIG.redirectUrl
} else {
document.write("<h1>redirectUrl is empty</h1>")
}
} else {
document.write("<h1>CONFIG is not defined.</h1>")
}
status = "CONFIG: " + (window.CONFIG||"undefined")
status += "\r\n"
status += "CONFIG.redirectUrl: " + (window.CONFIG?window.CONFIG.redirectUrl||"undefined":"undefined")
config_status.textContent = status
</script>
HTML 요소에 id 속성을 부여하면, 해당 요소는 전역 객체(window)의 속성으로 자동으로 등록되어 전역에서 접근할 수 있다. 하지만, HTML에서 id는 문서 내에서 유일해야 하며 만약 중복된 id가 존재하게 되면 동작을 예측할 수 없게 된다. 반면, PoC 코드에서는 CONFIG라는 id가 중복되어 있어 window.CONFIG가 단일 객체가 아닌 HTMLCollection으로 처리된다.
<a id="CONFIG" name="redirectUrl" href="javascript:alert(1);"></a>
<a id="CONFIG"></a>
window.CONFIG는 id가 "CONFIG"를 가진 요소들을 수집한 HTMLCollection이므로 redirectUrl 프로퍼티에 접근할 수 있게 된다.
if (CONFIG.redirectUrl) {
location.href = CONFIG.redirectUrl
}
HTMLAnchorElement 인터페이스에 의하면 a 태그의 toString() 메서드는 해당 요소의 href 속성을 반환한다. location.href에 객체가 할당되면 브라우저는 내부적으로 toString()을 호출하여 문자열로 변환하려 하고, a 태그 요소의 toString()은 href 속성을 반환하므로 결국 Dom-Based XSS가 발생하게 된다.
만약, 아래와 같이 id가 중복되지 않을 경우 CONFIG는 HTMLCollection이 아닌 단일 요소 a 태그를 반환한다. 따라서, CONFIG는 redirectUrl 프로퍼티를 가질 수 없으므로 정상적으로 XSS가 트리거 될 수 없다.
<a id="CONFIG" name="redirectUrl" href="javascript:alert(1);"></a>
Reference
'보안 > 웹' 카테고리의 다른 글
PHAR Deserialization Vulnerability (1) | 2025.04.15 |
---|