postMessage

iframes and Window References

Window References
mywebsite.com
My Website
window.frames[0]
<iframe>
Embedded Page
(Isolated DOM)
window.open("page2.com")
postMessage
page2.com
Page 2
Opened via window.open()
OR embedded as iframe

The postMessage API

Sender / Receiver Flow
Sender
targetWindow.postMessage(
message, targetOrigin)
message
Receiver
addEventListener("message",
function(event) { ... })

Try It: Interactive postMessage Demo

Send a message from this page into the iframe below. Watch the receiver log the origin, data, and type of each message in real time.

Sender (this page)
Code being executed:
receiverFrame.postMessage(data, "*")
postMessage
Receiver (iframe)
Quick presets:

Typical postMessage Handler

JavaScript
window.addEventListener('message', function(event) {
    // 1. Origin check
    if (event.origin !== "https://trusted.com") return;

    // 2. Route by message type
    if (event.data.type === "updateProfile") {
        // 3. Do stuff if data.type is "updateProfile"
    } else if (event.data.type === "redirect") {
        // 3. Do some other stuff if data.type is "redirect"
    }
})
1
Origin Check
2
Route by Type
3
Process Data

Weak Origin Checks

JavaScript Console
"https://jkbrah.com.attacker.com".includes("jkbrah.com")
true

"https://bsides.jkbrah.com.attacker.com".startsWith("https://bsides.jkbrah.") 
true

Key Takeaway: Look very closely at origin check implementation to see if it can be bypassed


Exercise: postMessage XSS

JavaScript
window.addEventListener('message', function(event) {
    var data;
    try {
        data = typeof event.data === 'string' ? JSON.parse(event.data) : event.data;
    } catch(e) {
        return;
    }

    if (!data || !data.type) return;

    if (data.type === 'STATUS_UPDATE') {
        widgetContent.innerHTML = data.content;
    } else if (data.type === 'METRIC_PUSH') {
        console.log('[StatusHub] Metric received:', data.metric, data.value);
    } else if (data.type === 'THEME_CHANGE') {
        document.body.setAttribute('data-theme', data.theme || 'dark');
    }
});
Launch Exercise → Next: Dev Tools