Blocking main page to steal postmessage

从零开始学习 AWS 黑客技术,成为专家 htARTE(HackTricks AWS 红队专家)

使用 iframe 赢得 RCs

根据这个Terjanq 的解说,从空源创建的 blob 文档出于安全考虑而被隔离,这意味着如果您让主页面保持繁忙状态,iframe 页面将被执行。

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

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

但是,您如何让父页面在生成 iframe 后立即保持繁忙状态,并在等待 iframe 准备好发送敏感数据时? 基本上,您需要找到异步操作,您可以让父页面执行。例如,在该挑战中,父页面正在监听像这样的postmessages

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的毫秒数进行调整

从零开始学习AWS黑客技术,成为专家 htARTE(HackTricks AWS Red Team Expert)

最后更新于