Race Condition
Verwenden Sie Trickest, um mühelos Workflows zu erstellen und zu automatisieren, die von den fortschrittlichsten Community-Tools der Welt unterstützt werden. Heute Zugriff erhalten:
Für ein tiefes Verständnis dieser Technik lesen Sie den Originalbericht unter https://portswigger.net/research/smashing-the-state-machine
Verbesserung von Rennbedingungsangriffen
Das Hauptproblem bei der Ausnutzung von Rennbedingungen besteht darin, sicherzustellen, dass mehrere Anfragen gleichzeitig bearbeitet werden, mit sehr geringen Unterschieden in ihren Verarbeitungszeiten - idealerweise weniger als 1 ms.
Hier finden Sie einige Techniken zur Synchronisierung von Anfragen:
HTTP/2 Single-Packet-Angriff vs. HTTP/1.1 Last-Byte-Synchronisierung
HTTP/2: Unterstützt das Senden von zwei Anfragen über eine einzelne TCP-Verbindung und reduziert den Einfluss von Netzwerk-Jitter. Aufgrund von serverseitigen Variationen reichen jedoch zwei Anfragen möglicherweise nicht für einen konsistenten Rennbedingungsangriff aus.
HTTP/1.1 'Last-Byte Sync': Ermöglicht das Vorsenden der meisten Teile von 20-30 Anfragen, wobei ein kleines Fragment zurückgehalten wird, das dann zusammen gesendet wird und gleichzeitig beim Server ankommt.
Die Vorbereitung auf Last-Byte Sync umfasst:
Senden von Headern und Body-Daten abzüglich des letzten Bytes, ohne den Stream zu beenden.
Pause von 100 ms nach dem initialen Senden.
Deaktivieren von TCP_NODELAY, um den Nagle-Algorithmus zur Stapelung von finalen Frames zu nutzen.
Pingen zur Aufwärmung der Verbindung.
Das nachfolgende Senden zurückgehaltener Frames sollte zu deren Ankunft in einem einzelnen Paket führen, was über Wireshark überprüfbar ist. Diese Methode gilt nicht für statische Dateien, die normalerweise nicht in RC-Angriffen involviert sind.
Anpassung an die Serverarchitektur
Das Verständnis der Architektur des Ziels ist entscheidend. Front-End-Server können Anfragen möglicherweise unterschiedlich routen, was die Zeitnahme beeinflusst. Eine vorbeugende serverseitige Verbindungsaufwärmung durch belanglose Anfragen könnte die Zeitnahme von Anfragen normalisieren.
Behandlung von Sitzungsbasierten Sperren
Frameworks wie der PHP-Sitzungshandler serialisieren Anfragen nach Sitzung, was potenziell Schwachstellen verschleiern kann. Die Verwendung unterschiedlicher Sitzungstoken für jede Anfrage kann dieses Problem umgehen.
Überwindung von Rate- oder Ressourcenbeschränkungen
Wenn die Verbindungsaufwärmung nicht wirksam ist, kann das absichtliche Auslösen von Verzögerungen durch Webserver-Raten- oder Ressourcenbeschränkungen durch eine Flut von Dummy-Anfragen den Single-Packet-Angriff erleichtern, indem eine serverseitige Verzögerung induziert wird, die Rennbedingungen begünstigt.
Angriffsbeispiele
Tubo Intruder - HTTP2 Single-Packet-Angriff (1 Endpunkt): Sie können die Anfrage an Turbo Intruder senden (
Erweiterungen
->Turbo Intruder
->An Turbo Intruder senden
), Sie können in der Anfrage den Wert, den Sie für%s
brute forcen möchten, ändern, wie incsrf=Bn9VQB8OyefIs3ShR2fPESR0FzzulI1d&username=carlos&password=%s
und dann dasexamples/race-single-packer-attack.py
aus dem Dropdown-Menü auswählen:
Wenn Sie verschiedene Werte senden möchten, könnten Sie den Code mit diesem ändern, der eine Wortliste aus der Zwischenablage verwendet:
Wenn das Web HTTP2 nicht unterstützt (nur HTTP1.1), verwenden Sie Engine.THREADED
oder Engine.BURP
anstelle von Engine.BURP2
.
Tubo Intruder - HTTP2 single-packet attack (Mehrere Endpunkte): Falls Sie eine Anfrage an einen Endpunkt senden müssen und dann mehrere an andere Endpunkte, um die RCE auszulösen, können Sie das Skript
race-single-packet-attack.py
wie folgt ändern:
Es ist auch in Repeater über die neue Option 'Gruppe parallel senden' in Burp Suite verfügbar.
Für limit-overrun könnten Sie einfach die gleiche Anfrage 50 Mal in der Gruppe hinzufügen.
Für Verbindungsaufwärmung könnten Sie am Anfang der Gruppe einige Anfragen an einen nicht statischen Teil des Webservers hinzufügen.
Um den Prozess zwischen der Bearbeitung einer Anfrage und einer anderen in 2 Unterzuständen zu verzögern, könnten Sie zusätzliche Anfragen zwischen beiden Anfragen hinzufügen.
Für ein Multi-Endpoint RC könnten Sie die Anfrage starten, die zum versteckten Zustand führt, und dann 50 Anfragen direkt danach senden, die den versteckten Zustand ausnutzen.
Automatisiertes Python-Skript: Das Ziel dieses Skripts ist es, die E-Mail-Adresse eines Benutzers zu ändern und kontinuierlich zu überprüfen, bis der Bestätigungstoken der neuen E-Mail-Adresse an die letzte E-Mail-Adresse gesendet wird (dies liegt daran, dass im Code ein RC gesehen wurde, bei dem es möglich war, eine E-Mail-Adresse zu ändern, aber die Bestätigung an die alte E-Mail-Adresse gesendet wurde, weil die Variable, die die E-Mail-Adresse angibt, bereits mit der ersten befüllt war). Wenn das Wort "objetivo" in den empfangenen E-Mails gefunden wird, wissen wir, dass wir den Bestätigungstoken der geänderten E-Mail-Adresse erhalten haben, und beenden den Angriff.
Roh BF
Vor der vorherigen Forschung wurden einige Payloads verwendet, die einfach versuchten, die Pakete so schnell wie möglich zu senden, um eine RC zu verursachen.
Repeater: Überprüfen Sie die Beispiele aus dem vorherigen Abschnitt.
Intruder: Senden Sie die Anfrage an Intruder, setzen Sie die Anzahl der Threads im Optionsmenü auf 30 und wählen Sie als Payload Null-Payloads aus und generieren Sie 30.
Turbo Intruder
Python - asyncio
RC Methodik
Limit-Überlauf / TOCTOU
Dies ist die grundlegendste Art von Race Condition, bei der Schwachstellen auftreten, die die Anzahl der Male begrenzen, die Sie eine Aktion ausführen können. Zum Beispiel das mehrfache Verwenden desselben Rabattcodes in einem Webshop. Ein sehr einfaches Beispiel finden Sie in diesem Bericht oder in diesem Bug.
Es gibt viele Variationen dieses Angriffstyps, darunter:
Mehrfaches Einlösen einer Geschenkkarte
Mehrfaches Bewerten eines Produkts
Abheben oder Übertragen von Bargeld über Ihrem Kontostand
Wiederverwendung einer einzelnen CAPTCHA-Lösung
Umgehen einer Anti-Brute-Force-Ratenbegrenzung
Versteckte Unterzustände
Die Ausnutzung komplexer Race Conditions beinhaltet oft die Nutzung kurzer Gelegenheiten zur Interaktion mit versteckten oder unerwünschten maschinellen Unterzuständen. So gehen Sie vor:
Potenzielle versteckte Unterzustände identifizieren
Beginnen Sie damit, Endpunkte zu lokalisieren, die kritische Daten modifizieren oder mit ihnen interagieren, wie z. B. Benutzerprofile oder Passwortzurücksetzungsprozesse. Konzentrieren Sie sich auf:
Speicherung: Bevorzugen Sie Endpunkte, die serverseitige persistente Daten manipulieren, gegenüber denen, die Daten clientseitig verarbeiten.
Aktion: Suchen Sie nach Operationen, die vorhandene Daten ändern, da diese eher ausnutzbare Bedingungen schaffen als solche, die neue Daten hinzufügen.
Schlüsselung: Erfolgreiche Angriffe beinhalten normalerweise Operationen, die auf demselben Identifikator basieren, z. B. Benutzername oder Zurücksetzungstoken.
Erste Sondierung durchführen
Testen Sie die identifizierten Endpunkte mit Race-Condition-Angriffen und beobachten Sie Abweichungen von den erwarteten Ergebnissen. Unerwartete Antworten oder Änderungen im Anwendungsverhalten können auf eine Schwachstelle hinweisen.
Schwachstelle demonstrieren
Reduzieren Sie den Angriff auf die minimale Anzahl von Anfragen, die benötigt werden, um die Schwachstelle auszunutzen, oft nur zwei. Dieser Schritt erfordert möglicherweise mehrere Versuche oder Automatisierung aufgrund des präzisen Timing.
Zeitkritische Angriffe
Präzision beim Timing von Anfragen kann Schwachstellen aufdecken, insbesondere wenn vorhersehbare Methoden wie Zeitstempel für Sicherheitstoken verwendet werden. Beispielsweise könnten durch die Generierung von Passwortzurücksetzungstoken basierend auf Zeitstempeln identische Tokens für gleichzeitige Anfragen ermöglicht werden.
Zum Ausnutzen:
Verwenden Sie präzises Timing, wie bei einem Ein-Paket-Angriff, um gleichzeitige Passwortzurücksetzungsanfragen zu stellen. Identische Tokens deuten auf eine Schwachstelle hin.
Beispiel:
Fordern Sie gleichzeitig zwei Passwortzurücksetzungstoken an und vergleichen Sie sie. Übereinstimmende Tokens deuten auf einen Fehler in der Token-Generierung hin.
Überprüfen Sie dieses PortSwigger Lab um dies auszuprobieren.
Fallstudien zu versteckten Unterzuständen
Bezahlen & Artikel hinzufügen
Überprüfen Sie dieses PortSwigger Lab, um zu sehen, wie Sie in einem Geschäft bezahlen und einen zusätzlichen Artikel hinzufügen können, für den Sie nicht bezahlen müssen.
Andere E-Mails bestätigen
Die Idee ist es, eine E-Mail-Adresse zu überprüfen und gleichzeitig in eine andere zu ändern, um herauszufinden, ob die Plattform die neue geänderte Adresse überprüft.
E-Mail zu 2 E-Mail-Adressen Cookie-basiert ändern
Laut dieser Forschung war Gitlab anfällig für eine Übernahme auf diese Weise, weil es möglicherweise das E-Mail-Verifizierungstoken einer E-Mail an die andere E-Mail sendet.
Überprüfen Sie dieses PortSwigger Lab um dies auszuprobieren.
Versteckte Datenbankzustände / Bestätigungsumgehung
Wenn 2 verschiedene Schreibvorgänge verwendet werden, um Informationen in einer Datenbank hinzuzufügen, gibt es einen kurzen Zeitraum, in dem nur die erste Daten in der Datenbank geschrieben wurde. Wenn beispielsweise ein Benutzer erstellt wird, könnte der Benutzername und das Passwort geschrieben werden und dann das Token, um das neu erstellte Konto zu bestätigen. Dies bedeutet, dass für kurze Zeit das Token zur Bestätigung eines Kontos null ist.
Daher könnte das Registrieren eines Kontos und das Senden mehrerer Anfragen mit einem leeren Token (token=
oder token[]=
oder einer anderen Variation) zur sofortigen Bestätigung des Kontos ermöglichen, ein Konto zu bestätigen, bei dem Sie die E-Mail nicht kontrollieren.
Überprüfen Sie dieses PortSwigger Lab um dies auszuprobieren.
2FA umgehen
Der folgende Pseudocode ist anfällig für eine Race Condition, weil in einem sehr kurzen Zeitraum die 2FA nicht durchgesetzt wird, während die Sitzung erstellt wird:
OAuth2 ewige Persistenz
Es gibt mehrere OAuth-Anbieter. Diese Dienste ermöglichen es Ihnen, eine Anwendung zu erstellen und Benutzer zu authentifizieren, die der Anbieter registriert hat. Um dies zu tun, muss der Client Ihrer Anwendung erlauben, auf einige ihrer Daten innerhalb des OAuth-Anbieters zuzugreifen. Also, bis hierhin nur ein üblicher Login mit Google/LinkedIn/GitHub... wo Sie mit einer Seite aufgefordert werden, die besagt: "Anwendung <InsertCoolName> möchte auf Ihre Informationen zugreifen, möchten Sie dies zulassen?"
Race Condition in authorization_code
authorization_code
Das Problem tritt auf, wenn Sie es akzeptieren und automatisch einen authorization_code
an die bösartige Anwendung sendet. Dann missbraucht diese Anwendung eine Race Condition im OAuth-Dienstanbieter, um mehr als ein AT/RT (Authentication Token/Refresh Token) aus dem authorization_code
für Ihr Konto zu generieren. Grundsätzlich wird sie den Umstand ausnutzen, dass Sie der Anwendung erlaubt haben, auf Ihre Daten zuzugreifen, um mehrere Konten zu erstellen. Dann, wenn Sie der Anwendung nicht mehr erlauben, auf Ihre Daten zuzugreifen, wird ein Paar AT/RT gelöscht, aber die anderen werden weiterhin gültig sein.
Race Condition in Refresh Token
Refresh Token
Sobald Sie einen gültigen RT erhalten haben, könnten Sie versuchen, ihn zu missbrauchen, um mehrere AT/RT zu generieren, und selbst wenn der Benutzer die Berechtigungen für die bösartige Anwendung widerruft, um auf seine Daten zuzugreifen, werden mehrere RTs weiterhin gültig sein.
RC in WebSockets
In WS_RaceCondition_PoC finden Sie einen PoC in Java, um WebSocket-Nachrichten parallel zu senden und Race Conditions auch in WebSockets auszunutzen.
Referenzen
Verwenden Sie Trickest, um mithilfe der weltweit fortschrittlichsten Community-Tools einfach Workflows zu erstellen und zu automatisieren. Heute zugreifen:
Last updated