CSRF (Cross Site Request Forgery)
Treten Sie dem HackenProof Discord 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 bei Discord und beginnen Sie noch heute mit Top-Hackern zusammenzuarbeiten!
Cross-Site Request Forgery (CSRF) erklärt
Cross-Site Request Forgery (CSRF) ist ein Typ von Sicherheitslücke, die in Webanwendungen gefunden wird. Sie ermöglicht es 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:
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.
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.
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 vom Browser aus 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: Dieses Attribut verhindert, dass der Browser Cookies zusammen mit Cross-Site-Anfragen sendet. Mehr über SameSite-Cookies.
Cross-Origin-Ressourcenfreigabe: 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.
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 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önnen 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:
Authentifizieren mit ihrem eigenen Konto.
Erhalten eines gültigen CSRF-Tokens aus dem globalen Pool.
Verwenden dieses Tokens 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 Überschreibungsfunktionalität 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 angepasste Token und auch 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:
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.
Änderung des Inhalts-Typs
Gemäß dieser Quelle 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) zum Senden von JSON-Daten als text/plain:
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 initiiert die Verwendung von XMLHttpRequest
zur Übermittlung dieses Inhaltstyps 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 verarbeitet, unabhängig vom Content-Type:
Verwendung alternativer Content-Typen: Verwenden Sie
Content-Type: text/plain
oderContent-Type: application/x-www-form-urlencoded
, indem Sieenctype="text/plain"
im Formular festlegen. Mit diesem Ansatz wird getestet, ob das Backend die Daten unabhängig vom Content-Type verwendet.Ä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.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.
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:
Dies stellt sicher, dass der 'Referer'-Header ausgelassen wird und möglicherweise Validierungsprüfungen in einigen Anwendungen umgangen werden.
Regexp-Bypasses
pageURL Format BypassUm den Domainnamen des Servers in der URL festzulegen, den der Referrer innerhalb der Parameter senden wird, können Sie Folgendes tun:
HEAD-Method-Umgehung
Der erste Teil dieses CTF-Lösungsberichts erklärt, dass im Oak-Quellcode 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 dem 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.
Exploit-Beispiele
Exfiltration des CSRF-Tokens
Wenn ein CSRF-Token als Schutzmaßnahme verwendet wird, könnten Sie versuchen, es durch Ausnutzung einer XSS-Schwachstelle oder einer Dangling-Markup-Schwachstelle auszuleiten.
GET mit HTML-Tags
Andere HTML5-Tags, die verwendet werden können, um automatisch eine GET-Anfrage zu senden, sind:
Form GET-Anfrage
Form POST-Anfrage
Form POST-Anfrage über iframe
Ajax POST-Anfrage
multipart/form-data POST-Anfrage
multipart/form-data POST-Anforderung v2
Form POST-Anfrage innerhalb eines Iframes
CSRF-Token stehlen und eine POST-Anfrage senden
CSRF-Token stehlen und einen POST-Request mithilfe eines iframes, eines Formulars und Ajax senden
Stehlen Sie CSRF-Token und senden Sie eine POST-Anfrage mithilfe eines iframes und eines Formulars
Token stehlen und über 2 iframes senden
POST CSRF-Token mit Ajax stehlen und einen Beitrag mit einem Formular senden
CSRF mit Socket.IO
CSRF Login Brute Force
Der Code kann verwendet werden, um ein Anmeldeformular mit Brute Force anzugreifen, wobei ein CSRF-Token verwendet wird (Es wird auch der Header X-Forwarded-For verwendet, um zu versuchen, eine mögliche IP-Blacklist zu umgehen):
Werkzeuge
Referenzen
Treten Sie dem HackenProof Discord 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 Echtzeit-Nachrichten und Einblicke auf dem Laufenden
Neueste Ankündigungen Bleiben Sie über die neuesten Bug-Bounties und wichtige Plattformupdates informiert
Treten Sie uns bei Discord bei und beginnen Sie noch heute mit Top-Hackern zusammenzuarbeiten!
Last updated