CSRF (Cross Site Request Forgery)
Last updated
Last updated
Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Treten Sie dem HackenProof Discord Server bei, um mit erfahrenen Hackern und Bug-Bounty-Jägern zu kommunizieren!
Hacking Einblicke Engagieren Sie sich mit Inhalten, die in die Aufregung und Herausforderungen des Hackens eintauchen
Echtzeit-Hack-Nachrichten Bleiben Sie auf dem Laufenden mit der schnelllebigen Hacking-Welt durch Echtzeit-Nachrichten und Einblicke
Neueste Ankündigungen Bleiben Sie informiert über die neuesten Bug-Bounties und wichtige Plattform-Updates
Treten Sie uns auf Discord bei und beginnen Sie noch heute mit den besten Hackern zusammenzuarbeiten!
Cross-Site Request Forgery (CSRF) ist eine Art von Sicherheitsanfälligkeit, die in Webanwendungen zu finden ist. Sie ermöglicht es Angreifern, Aktionen im Namen ahnungsloser Benutzer durch Ausnutzung ihrer authentifizierten Sitzungen durchzuführen. Der Angriff wird ausgeführt, wenn ein Benutzer, der in die Plattform eines Opfers eingeloggt ist, eine bösartige Seite besucht. Diese Seite löst dann Anfragen an das Konto des Opfers aus, indem sie Methoden wie das Ausführen von JavaScript, das Einreichen von Formularen oder das Abrufen von Bildern verwendet.
Um eine CSRF-Sicherheitsanfälligkeit auszunutzen, müssen mehrere Bedingungen erfüllt sein:
Identifizieren Sie eine wertvolle Aktion: Der Angreifer muss eine Aktion finden, die es wert ist, ausgenutzt zu werden, wie z.B. das Ändern des Passworts, der E-Mail-Adresse oder das Erhöhen von Berechtigungen.
Sitzungsmanagement: Die Sitzung des Benutzers sollte ausschließlich über Cookies oder den HTTP Basic Authentication-Header verwaltet werden, da andere Header für diesen Zweck nicht manipuliert werden können.
Fehlen unvorhersehbarer Parameter: Die Anfrage sollte keine unvorhersehbaren Parameter enthalten, da diese den Angriff verhindern können.
Sie könnten die Anfrage in Burp abfangen und die CSRF-Schutzmaßnahmen überprüfen. Um dies im Browser zu testen, können Sie auf Copy as fetch klicken und die Anfrage überprüfen:
Mehrere Gegenmaßnahmen können implementiert werden, um sich gegen CSRF-Angriffe zu schützen:
SameSite-Cookies: Dieses Attribut verhindert, dass der Browser Cookies zusammen mit Cross-Site-Anfragen sendet. Mehr über SameSite-Cookies.
Cross-Origin Resource Sharing: Die CORS-Richtlinie der Opferseite kann die Durchführbarkeit des Angriffs beeinflussen, insbesondere wenn der Angriff das Lesen der Antwort von der Opferseite erfordert. Erfahren Sie mehr über CORS-Umgehung.
Benutzerauthentifizierung: Die Aufforderung zur Eingabe des Passworts des Benutzers 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 helfen sicherzustellen, dass Anfragen von vertrauenswürdigen Quellen stammen. Allerdings kann eine sorgfältige Gestaltung von URLs 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 der Namen von Parametern in POST- oder GET-Anfragen kann helfen, automatisierte Angriffe zu verhindern.
CSRF-Token: Die Einbeziehung eines einzigartigen CSRF-Tokens in jede Sitzung und die Anforderung dieses Tokens in nachfolgenden Anfragen kann das Risiko von CSRF erheblich mindern. Die Wirksamkeit des Tokens kann durch die Durchsetzung von CORS erhöht werden.
Das Verständnis und die Implementierung dieser Verteidigungen sind entscheidend für die Aufrechterhaltung der Sicherheit und Integrität von Webanwendungen.
Vielleicht ist das Formular, das Sie ausnutzen möchten, darauf vorbereitet, eine POST-Anfrage mit einem CSRF-Token zu senden, aber Sie sollten überprüfen, ob auch eine GET-Anfrage gültig ist und ob bei der Sendung einer GET-Anfrage das CSRF-Token weiterhin validiert wird.
Anwendungen könnten einen Mechanismus implementieren, um Tokens zu validieren, wenn sie vorhanden sind. Eine Sicherheitsanfälligkeit entsteht jedoch, wenn die Validierung ganz ü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.
Anwendungen, die CSRF-Token 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:
Authentifizieren Sie sich mit ihrem eigenen Konto.
Erhalten Sie ein gültiges CSRF-Token aus dem globalen Pool.
Verwenden Sie dieses Token in einem CSRF-Angriff gegen ein Opfer.
Diese Sicherheitsanfälligkeit ermöglicht es Angreifern, unbefugte Anfragen im Namen des Opfers zu stellen und die unzureichende Token-Validierungsmechanismus der Anwendung auszunutzen.
Wenn die Anfrage eine "seltsame" Methode verwendet, überprüfen Sie, ob die Methoden Überschreibungsfunktionalität funktioniert. Wenn beispielsweise die PUT-Methode verwendet wird, können Sie versuchen, die POST-Methode zu verwenden und zu senden: https://example.com/my/dear/api/val/num?_method=PUT
Dies könnte auch funktionieren, indem Sie den _method-Parameter innerhalb einer POST-Anfrage senden oder die Header verwenden:
X-HTTP-Method
X-HTTP-Method-Override
X-Method-Override
Wenn die Anfrage einen benutzerdefinierten Header mit einem Token als CSRF-Schutzmethode hinzufügt, dann:
Testen Sie die Anfrage ohne den benutzerdefinierten Token und auch Header.
Testen Sie die Anfrage mit genau gleicher Länge, aber unterschiedlichem Token.
Anwendungen können CSRF-Schutz implementieren, indem sie das Token sowohl in einem Cookie als auch in einem Anfrageparameter duplizieren oder 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 Schwächen aufweist, die es einem Angreifer ermöglichen, ein CSRF-Cookie im Browser des Opfers zu setzen, wie z.B. eine CRLF-Sicherheitsanfälligkeit. Der Angreifer kann dies ausnutzen, indem er ein täuschendes Bild lädt, das das Cookie setzt, gefolgt von der Einleitung des CSRF-Angriffs.
Hier ist ein Beispiel, wie ein Angriff strukturiert sein könnte:
Beachten Sie, dass wenn der csrf-Token mit dem Sitzungscookie verbunden ist, dieser Angriff nicht funktioniert, da Sie die Sitzung des Opfers setzen müssen und Sie sich somit selbst angreifen.
Laut dieser Quelle, um Preflight-Anfragen mit der POST-Methode zu vermeiden, sind die folgenden Content-Type-Werte erlaubt:
application/x-www-form-urlencoded
multipart/form-data
text/plain
Beachten Sie jedoch, dass die Logik der Server 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) für das Senden von JSON-Daten als text/plain:
Beim Versuch, JSON-Daten über eine POST-Anfrage zu senden, ist es nicht direkt möglich, Content-Type: application/json
in einem HTML-Formular zu verwenden. Ebenso initiiert die Nutzung von XMLHttpRequest
, um diesen Inhaltstyp zu senden, eine Preflight-Anfrage. Dennoch gibt es Strategien, um diese Einschränkung möglicherweise zu umgehen und zu überprüfen, ob der Server die JSON-Daten unabhängig vom Content-Type verarbeitet:
Verwendung alternativer Inhaltstypen: 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 nutzt.
Ändern des Inhaltstyps: Um eine Preflight-Anfrage zu vermeiden und 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 jedoch vom Server korrekt verarbeitet werden, wenn er so konfiguriert ist, application/json
zu akzeptieren.
Nutzung von SWF Flash-Dateien: Eine weniger gängige, 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.
Vermeiden Sie den Referrer-Header
Anwendungen können den 'Referer'-Header nur validieren, wenn er vorhanden ist. Um zu verhindern, dass ein Browser diesen Header sendet, kann der folgende HTML-Meta-Tag verwendet werden:
Dies stellt sicher, dass der 'Referer'-Header weggelassen wird, wodurch möglicherweise Validierungsprüfungen in einigen Anwendungen umgangen werden.
Regexp-Umgehungen
URL Format BypassUm den Domainnamen des Servers in der URL festzulegen, den der Referrer innerhalb der Parameter senden wird, können Sie Folgendes tun:
Im ersten Teil von diesem CTF-Bericht wird erklärt, dass Oaks Quellcode, ein Router, HEAD-Anfragen als GET-Anfragen ohne Antwortkörper behandelt - ein gängiger Workaround, der nicht einzigartig für Oak ist. Anstelle eines spezifischen Handlers, der sich mit HEAD-Anfragen befasst, werden sie einfach dem GET-Handler übergeben, aber die App entfernt einfach den Antwortkörper.
Daher, wenn eine GET-Anfrage eingeschränkt wird, könnten Sie einfach eine HEAD-Anfrage senden, die als GET-Anfrage verarbeitet wird.
Wenn ein CSRF-Token als Abwehr verwendet wird, könnten Sie versuchen, es zu exfiltrieren, indem Sie eine XSS-Schwachstelle oder eine Dangling Markup-Schwachstelle ausnutzen.
Andere HTML5-Tags, die verwendet werden können, um automatisch eine GET-Anfrage zu senden, sind: