hacktricks/pentesting-web/postmessage-vulnerabilities/blocking-main-page-to-steal-postmessage.md
2023-08-03 19:12:22 +00:00

4.8 KiB
Raw Blame History

阻塞主页面以窃取postmessage

☁️ HackTricks云 ☁️ -🐦 推特 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

使用Iframes赢得RCs

根据这个Terjanq的解析从空源创建的blob文档是为了安全起见而被隔离的这意味着如果你保持主页面繁忙iframe页面将会被执行。

基本上,在这个挑战中,一个被隔离的iframe被执行,并且在它加载完毕后父页面将会发送一个带有标志的post消息
然而这种postmessage通信是容易受到XSS攻击的(iframe可以执行JS代码

因此,攻击者的目标是让父页面创建iframe,但是在父页面发送敏感数据(标志)之前,让父页面保持繁忙并将有效载荷发送到iframe。而父页面忙碌时,iframe执行有效载荷,该有效载荷将是一些监听父页面postmessage消息并泄露标志的JS代码。
最后iframe执行了有效载荷父页面停止忙碌所以它发送了标志而有效载荷泄露了它。

但是你如何让父页面在生成iframe后立即忙碌并且只在等待iframe准备好发送敏感数据时忙碌呢基本上你需要找到异步操作,你可以让父页面执行。例如在这个挑战中父页面正在监听像这样的postmessage

window.addEventListener('message', (e) => {
if (e.data == 'blob loaded') {
$("#previewModal").modal();
}
});

所以可以发送一个大整数的 postmessage,在比较时会将其转换为字符串,这将需要一些时间:

const buffer = new Uint8Array(1e7);
win?.postMessage(buffer, '*', [buffer.buffer]);

为了准确地在iframe创建后但尚未准备好接收来自父级的数据时发送postmessage您需要使用setTimeout的毫秒数进行调整。

☁️ HackTricks云 ☁️ -🐦 推特 🐦 - 🎙️ Twitch 🎙️ - 🎥 YouTube 🎥