# CSRF (Cross Site Request Forgery)
Lernen Sie AWS-Hacking von Null auf Held mithtARTE (HackTricks AWS Red Team Expert)!
Andere Möglichkeiten, HackTricks zu unterstützen:
* 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)
* 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.
Treten Sie dem [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) Server bei, um mit erfahrenen Hackern und Bug-Bounty-Jägern zu kommunizieren!
**Hacking-Einblicke**\
Beschäftigen Sie sich mit Inhalten, die sich mit dem Nervenkitzel und den Herausforderungen des Hackens befassen
**Echtzeit-Hack-News**\
Bleiben Sie mit der schnelllebigen Hacking-Welt durch Echtzeitnachrichten und Einblicke auf dem Laufenden
**Neueste Ankündigungen**\
Bleiben Sie über die neuesten Bug-Bounties und wichtige Plattformupdates informiert
**Treten Sie uns auf** [**Discord**](https://discord.com/invite/N3FrSbmwdy) bei und beginnen Sie noch heute mit der Zusammenarbeit mit Top-Hackern!
## Cross-Site Request Forgery (CSRF) erklärt
**Cross-Site Request Forgery (CSRF)** ist ein Typ von Sicherheitslücke, die in Webanwendungen gefunden wird. Es ermöglicht Angreifern, Aktionen im Namen ahnungsloser Benutzer auszuführen, indem sie deren authentifizierte Sitzungen ausnutzen. Der Angriff wird ausgeführt, wenn ein Benutzer, der in die Plattform eines Opfers eingeloggt ist, eine bösartige Website besucht. Diese Website löst dann Anfragen an das Konto des Opfers aus, indem sie Methoden wie das Ausführen von JavaScript, das Absenden von Formularen oder das Abrufen von Bildern verwendet.
### Voraussetzungen für einen CSRF-Angriff
Um eine CSRF-Sicherheitslücke auszunutzen, müssen mehrere Bedingungen erfüllt sein:
1. **Identifizierung einer wertvollen Aktion**: Der Angreifer muss eine lohnenswerte Aktion finden, die ausgenutzt werden kann, wie z.B. das Ändern des Benutzerpassworts, der E-Mail oder das Erhöhen von Berechtigungen.
2. **Sitzungsverwaltung**: Die Sitzung des Benutzers sollte ausschließlich über Cookies oder den HTTP Basic Authentication-Header verwaltet werden, da andere Header nicht für diesen Zweck manipuliert werden können.
3. **Fehlen von unvorhersehbaren Parametern**: Die Anfrage sollte keine unvorhersehbaren Parameter enthalten, da diese den Angriff verhindern können.
### Schnellüberprüfung
Sie könnten **die Anfrage in Burp erfassen** und CSRF-Schutzmaßnahmen überprüfen und um es aus dem Browser zu testen, können Sie auf **Als fetch kopieren** klicken und die Anfrage überprüfen:
### Schutz vor CSRF
Es können mehrere Gegenmaßnahmen implementiert werden, um sich vor CSRF-Angriffen zu schützen:
* [**SameSite-Cookies**](hacking-with-cookies/#samesite): Dieses Attribut verhindert, dass der Browser Cookies zusammen mit Cross-Site-Anfragen sendet. [Mehr über SameSite-Cookies](hacking-with-cookies/#samesite).
* [**Cross-Origin-Ressourcenfreigabe**](cors-bypass.md): Die CORS-Richtlinie der Opferseite kann die Durchführbarkeit des Angriffs beeinflussen, insbesondere wenn der Angriff erfordert, dass die Antwort von der Opferseite gelesen wird. [Erfahren Sie mehr über CORS-Bypass](cors-bypass.md).
* **Benutzerverifizierung**: Das Auffordern des Benutzerpassworts oder das Lösen eines Captchas kann die Absicht des Benutzers bestätigen.
* **Überprüfung von Referrer- oder Origin-Headern**: Die Validierung dieser Header kann dazu beitragen, sicherzustellen, dass Anfragen von vertrauenswürdigen Quellen stammen. Eine sorgfältige Gestaltung von URLs kann jedoch schlecht implementierte Überprüfungen umgehen, wie z.B.:
* Verwendung von `http://mal.net?orig=http://example.com` (URL endet mit der vertrauenswürdigen URL)
* Verwendung von `http://example.com.mal.net` (URL beginnt mit der vertrauenswürdigen URL)
* **Ändern von Parameternamen**: Das Ändern von Parameternamen in POST- oder GET-Anfragen kann helfen, automatisierte Angriffe zu verhindern.
* **CSRF-Token**: Die Integration eines eindeutigen CSRF-Tokens in jede Sitzung und die Anforderung dieses Tokens in nachfolgenden Anfragen können das Risiko von CSRF erheblich verringern. Die Effektivität des Tokens kann durch die Durchsetzung von CORS verbessert werden.
Das Verständnis und die Implementierung dieser Abwehrmaßnahmen sind entscheidend für die Aufrechterhaltung der Sicherheit und Integrität von Webanwendungen.
## Abwehrmaßnahmen umgehen
### Von POST zu GET
Vielleicht ist das Formular, das Sie missbrauchen möchten, darauf vorbereitet, eine **POST-Anfrage mit einem CSRF-Token zu senden**, aber Sie sollten überprüfen, ob ein **GET** ebenfalls **gültig** ist und ob beim Senden einer GET-Anfrage das **CSRF-Token immer noch validiert wird**.
### Fehlen des Tokens
Anwendungen könnten einen Mechanismus implementieren, um **Tokens zu validieren**, wenn sie vorhanden sind. Es entsteht jedoch eine Sicherheitslücke, wenn die Validierung vollständig übersprungen wird, wenn das Token fehlt. Angreifer können dies ausnutzen, indem sie den Parameter entfernen, der das Token trägt, nicht nur dessen Wert. Dies ermöglicht es ihnen, den Validierungsprozess zu umgehen und einen Cross-Site Request Forgery (CSRF)-Angriff effektiv durchzuführen.
### CSRF-Token ist nicht an die Benutzersitzung gebunden
Anwendungen, die CSRF-Tokens **nicht an Benutzersitzungen binden**, stellen ein erhebliches **Sicherheitsrisiko** dar. Diese Systeme überprüfen Tokens gegen einen **globalen Pool**, anstatt sicherzustellen, dass jedes Token an die initiierende Sitzung gebunden ist.
So nutzen Angreifer dies aus:
1. **Authentifizieren** sich mit ihrem eigenen Konto.
2. **Erhalten ein gültiges CSRF-Token** aus dem globalen Pool.
3. **Verwenden dieses Token** in einem CSRF-Angriff gegen ein Opfer.
Diese Sicherheitslücke ermöglicht es Angreifern, unbefugte Anfragen im Namen des Opfers zu stellen, indem sie den unzureichenden Token-Validierungsmechanismus der Anwendung ausnutzen.
### Methodenumgehung
Wenn die Anfrage eine "**seltsame**" **Methode** verwendet, überprüfen Sie, ob die **Methode** **Überschreibungsfunktion** funktioniert. Wenn beispielsweise eine **PUT**-Methode verwendet wird, können Sie versuchen, eine **POST**-Methode zu verwenden und zu **senden**: _https://example.com/my/dear/api/val/num?**\_method=PUT**_
Dies könnte auch funktionieren, indem der **\_method-Parameter innerhalb einer POST-Anfrage** gesendet wird oder indem die **Header** verwendet werden:
* _X-HTTP-Method_
* _X-HTTP-Method-Override_
* _X-Method-Override_
### Umgehung des benutzerdefinierten Header-Tokens
Wenn die Anfrage einen **benutzerdefinierten Header** mit einem **Token** zur Anfrage als **CSRF-Schutzmethode** hinzufügt, dann:
* Testen Sie die Anfrage ohne das **benutzerdefinierte Token und auch den Header**.
* Testen Sie die Anfrage mit genau **gleicher Länge, aber unterschiedlichem Token**.
### CSRF-Token wird durch ein Cookie überprüft
Anwendungen können CSRF-Schutz implementieren, indem sie das Token sowohl in einem Cookie als auch in einem Anfrageparameter duplizieren oder indem sie ein CSRF-Cookie setzen und überprüfen, ob das im Backend gesendete Token mit dem Cookie übereinstimmt. Die Anwendung validiert Anfragen, indem sie überprüft, ob das Token im Anfrageparameter mit dem Wert im Cookie übereinstimmt.
Diese Methode ist jedoch anfällig für CSRF-Angriffe, wenn die Website Fehler aufweist, die es einem Angreifer ermöglichen, ein CSRF-Cookie im Browser des Opfers zu setzen, wie z.B. eine CRLF-Sicherheitslücke. Der Angreifer kann dies ausnutzen, indem er ein irreführendes Bild lädt, das das Cookie setzt, gefolgt von der Initiierung des CSRF-Angriffs.
Nachfolgend ein Beispiel, wie ein Angriff strukturiert sein könnte:
```html
```
{% hint style="info" %}
Beachten Sie, dass, wenn das **CSRF-Token mit dem Sitzungscookie verknüpft ist, dieser Angriff nicht funktioniert**, da Sie dem Opfer Ihre Sitzung mitteilen müssten und somit sich selbst angreifen würden.
{% endhint %}
### Änderung des Inhalts-Typs
Gemäß [**dieser Quelle**](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#simple\_requests) sind zur **Vermeidung von Preflight-Anfragen** bei Verwendung der **POST**-Methode die folgenden Content-Type-Werte zulässig:
- **`application/x-www-form-urlencoded`**
- **`multipart/form-data`**
- **`text/plain`**
Beachten Sie jedoch, dass die **Serverlogik variieren kann**, abhängig vom verwendeten **Content-Type**, daher sollten Sie die genannten Werte und andere wie **`application/json`**_**,**_**`text/xml`**, **`application/xml`**_._
Beispiel (von [hier](https://brycec.me/posts/corctf\_2021\_challenges)) zum Senden von JSON-Daten als text/plain:
```html
```
### Umgehen von Preflight-Anfragen für JSON-Daten
Beim Versuch, JSON-Daten über eine POST-Anfrage zu senden, ist die Verwendung von `Content-Type: application/json` in einem HTML-Formular nicht direkt möglich. Ebenso führt die Verwendung von `XMLHttpRequest` zur Sendung dieses Inhaltstyps zu einer Preflight-Anfrage. Dennoch gibt es Strategien, um diese Einschränkung möglicherweise zu umgehen und zu überprüfen, ob der Server die JSON-Daten verarbeitet, unabhängig vom Content-Type:
1. **Verwendung alternativer Content-Typen**: Verwenden Sie `Content-Type: text/plain` oder `Content-Type: application/x-www-form-urlencoded`, indem Sie `enctype="text/plain"` im Formular festlegen. Dieser Ansatz testet, ob das Backend die Daten unabhängig vom Content-Type verwendet.
2. **Ändern des Content-Typs**: Um eine Preflight-Anfrage zu vermeiden und gleichzeitig sicherzustellen, dass der Server den Inhalt als JSON erkennt, können Sie die Daten mit `Content-Type: text/plain; application/json` senden. Dies löst keine Preflight-Anfrage aus, könnte aber vom Server korrekt verarbeitet werden, wenn er konfiguriert ist, `application/json` zu akzeptieren.
3. **SWF-Flash-Datei-Nutzung**: Eine weniger verbreitete, aber machbare Methode besteht darin, eine SWF-Flash-Datei zu verwenden, um solche Einschränkungen zu umgehen. Für ein tieferes Verständnis dieser Technik siehe [diesen Beitrag](https://anonymousyogi.medium.com/json-csrf-csrf-that-none-talks-about-c2bf9a480937).
### Referrer / Origin-Prüfung umgehen
**Vermeiden des Referrer-Headers**
Anwendungen können den 'Referer'-Header nur validieren, wenn er vorhanden ist. Um zu verhindern, dass ein Browser diesen Header sendet, kann das folgende HTML-Meta-Tag verwendet werden:
```xml
```
Dies stellt sicher, dass der 'Referer'-Header ausgelassen wird und möglicherweise Validierungsprüfungen in einigen Anwendungen umgangen werden.
**Reguläre Ausdrücke umgehen**
{% content-ref url="ssrf-server-side-request-forgery/url-format-bypass.md" %}
[url-format-bypass.md](ssrf-server-side-request-forgery/url-format-bypass.md)
{% endcontent-ref %}
Um den Domainnamen des Servers in der URL festzulegen, den der Referrer innerhalb der Parameter senden wird, können Sie Folgendes tun:
```html
```
### **HEAD-Methode umgehen**
Der erste Teil [**dieses CTF-Lösungsberichts**](https://github.com/google/google-ctf/tree/master/2023/web-vegsoda/solution) erklärt, dass im [Oak-Quellcode](https://github.com/oakserver/oak/blob/main/router.ts#L281) ein Router so eingestellt ist, dass **HEAD-Anfragen als GET-Anfragen behandelt** werden, ohne Antwortkörper - ein gängiger Workaround, der nicht einzigartig für Oak ist. Anstatt eines spezifischen Handlers, der mit HEAD-Anfragen umgeht, werden sie einfach **an den GET-Handler übergeben, aber die App entfernt einfach den Antwortkörper**.
Daher könnten Sie, wenn eine GET-Anfrage eingeschränkt wird, einfach **eine HEAD-Anfrage senden, die als GET-Anfrage verarbeitet wird**.
## **Beispiel für Exploits**
### **CSRF-Token exfiltrieren**
Wenn ein **CSRF-Token** als **Schutzmaßnahme** verwendet wird, könnten Sie versuchen, es durch eine [**XSS**](xss-cross-site-scripting/#xss-stealing-csrf-tokens)-Schwachstelle oder eine [**Dangling Markup**](dangling-markup-html-scriptless-injection/)-Schwachstelle **exfiltrieren**.
### **GET mit HTML-Tags**
```xml
404 - Page not found
The URL you are requesting is no longer available
```
Andere HTML5-Tags, die verwendet werden können, um automatisch eine GET-Anfrage zu senden, sind:
```html