Bypass XSS Protection with fake tag and data: (가짜 태그와 data 구문을 이용한 XSS 우회기법)

퇴근길에 트위터보다가 재미있는 XSS 페이로드 찾아서 글 작성합니다. 요즘 바쁘고 두통도 심하고해서 신경 못쓰나 싶었는데, 또 이런글 보고 이러면 아픈것도 사라지네요. 자 빠르게 시작하죠.

XSS Payload : < script/”<a”/src=data:=”.<a,[45].some(alert)>

제목 그대로 script 를 이용한 XSS 구문인데, 몇가지 트릭으로 필터링 규칙을 빠져나갑니다. 지난번에 썼던 글이랑 조금은 비슷한데요.. (https://www.hahwul.com/2018/03/bypass-xss-protection-event-handler.html )

우선 그림을 봅시다.

https://twitter.com/s0md3v/status/981465370736320513

Reflected XSS 할 때 <a 으로 로 보이게 하여 src 필터링 규칙을 나가서(보통, a 태그의 href, src 등을 막진 않죠)

작성자가 src=data 부분이 왜 되는지 모르겠다고 하는데.. 일단 복잡하니깐 줄여봅시다.

문법을 최대한 줄여보면..

<script//src=data:,[45].some(alert)></script>

아!! src 주소를 data:로 해서 로컬로 준 후 스크립트 구문 자체를 값으로 넘겨줘서 실행하는 형태입니다.

data: 구문으로 XSS 하던건 아래 링크 참고해주세요

(https://www.hahwul.com/2017/03/web-hacking-data-xss-filtering-bypass.html )

그렇다면 data:로 값이 넘어간 [45].some(alert) 부분이 실제 실행되는 구간이고.. alert(45)와 결국은 동일한 결과입니다.(Array의 some 메소드로 호출)

[8].some
 => function some()

풀어서 다시보면 이런 형태라고 볼 수 있습니다.

<script src=data:[document_type] , alert(45)></script>

Test XSS

간단하게 파일을 만들어서 테스트해봅시다. 위 payload는 뒤쪽 스크립트 닫는 부분이 없는데, 이는 Reflected 되는 구간을 이용해서 강제로 붙여주는 것을 사용하기 위해서입니다.

<script/"<a"/src=data:=".<a,[45].some(alert)></script>
Awesome!

Reference

https://twitter.com/s0md3v/status/981465370736320513