> 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/ru/web/race-conditions/single-endpoint-race-condition.md).

# Состояние гонки на одном endpoint

### Состояния гонки с одной конечной точкой

### Контекст лабораторной работы

Функция смены адреса электронной почты содержит **состояние гонки** которое позволяет привязать к нашей учетной записи произвольный адрес.

Пользователь с адресом **<carlos@ginandjuice.shop>** имеет **ожидающее приглашение** стать администратором, но **еще не создал учетную запись**. / Поэтому, если кто-то успеет **перепродать этот адрес**, он автоматически получит **права администратора**.

### Цель

1. Найдите состояние гонки, чтобы присвоить произвольный адрес электронной почты.
2. Смените адрес электронной почты учетной записи на **<carlos@ginandjuice.shop>**.
3. Доступ к **панели администратора**.
4. Удалить пользователя **carlos**.

Предоставленные учетные данные: **wiener:peter**/ Доступ к почтовому клиенту для адресов **@exploit-...exploit-server.net**.

### Обычный процесс смены электронной почты

Первая попытка — сменить e-mail на контролируемый адрес:

* Новый адрес:/ `wiener@exploit-0a10009b04efd21981a1bafc0102005d.exploit-server.net`

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

Ответ приложения:

> «Пожалуйста, перейдите по ссылке в письме, чтобы подтвердить смену e-mail на …»

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

На e-mail приходит письмо со ссылкой подтверждения, например:/ `/confirm-email?user=wiener&token=ob0dI7AMlwX2Y2uw`

После нажатия на ссылку:

> «Ваш адрес электронной почты успешно обновлен»

<figure><img src="/files/41e7d122a0ae3551c3cf045cf9b5f600193ef561" alt=""><figcaption></figcaption></figure>

Внутри запрос выглядит так:

```bash
email=wiener%40exploit-0a10009b04efd21981a1bafc0102005d.exploit-server.net&csrf=UoUvroZsYvL6IJPN7GKumJSoEuLFdBYk
```

### Базовый тест без гонки

Мы отправляем несколько запросов на смену e-mail с разными адресами (test1, test2,... test20), каждый отдельно, и полученные подтверждения корректно соответствуют запрошенным адресам.

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

```bash

email=test1@exploit-0a10009b04efd21981a1bafc0102005d.exploit-server.net&csrf=UoUvroZsYvL6IJPN7GKumJSoEuLFdBYk

email=test2@exploit-0a10009b04efd21981a1bafc0102005d.exploit-server.net&csrf=UoUvroZsYvL6IJPN7GKumJSoEuLFdBYk

email=test3@exploit-0a10009b04efd21981a1bafc0102005d.exploit-server.net&csrf=UoUvroZsYvL6IJPN7GKumJSoEuLFdBYk

email=test4@exploit-0a10009b04efd21981a1bafc0102005d.exploit-server.net&csrf=UoUvroZsYvL6IJPN7GKumJSoEuLFdBYk

email=test5@exploit-0a10009b04efd21981a1bafc0102005d.exploit-server.net&csrf=UoUvroZsYvL6IJPN7GKumJSoEuLFdBYk

email=test6@exploit-0a10009b04efd21981a1bafc0102005d.exploit-server.net&csrf=UoUvroZsYvL6IJPN7GKumJSoEuLFdBYk

email=test7@exploit-0a10009b04efd21981a1bafc0102005d.exploit-server.net&csrf=UoUvroZsYvL6IJPN7GKumJSoEuLFdBYk

email=test8@exploit-0a10009b04efd21981a1bafc0102005d.exploit-server.net&csrf=UoUvroZsYvL6IJPN7GKumJSoEuLFdBYk
.....

email=test20@exploit-0a10009b04efd21981a1bafc0102005d.exploit-server.net&csrf=UoUvroZsYvL6IJPN7GKumJSoEuLFdBYk
```

<figure><img src="/files/6d85e198d3fef8e9b27f7aee4bcf2cda11875f37" alt=""><figcaption></figcaption></figure>

Но когда вы выполняете те же самые запросы **параллельно**, появляется неожиданное поведение: иногда вы получаете подтверждения, которые не соответствуют нужному получателю.

<figure><img src="/files/7fd6b85f5c4a1236d5c2ac5054e89fde0819e6e3" alt="" width="563"><figcaption></figcaption></figure>

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

### Анализ состояния гонки

Наблюдаемое поведение указывает на обработку в две фазы\*\*:

1. Фаза, которая **подготавливает/записывает** письмо-подтверждение
2. Фаза, которая **определяет, какой адрес** электронной почты отправляется

Отправляя пакет запросов параллельно, нам удается пересечь эти две фазы: содержимое одного письма может быть связано с другим адресом назначения.

Принцип: параллельно отправьте смесь запросов, содержащих:

Часть с:

```bash
email=carlos@ginandjuice.shop&csrf=UoUvroZsYvL6IJPN7GKumJSoEuLFdBYk
```

Другая часть с контролируемым адресом:

```bash
email=test@exploit-0a10009b04efd21981a1bafc0102005d.exploit-server.net&csrf=UoUvroZsYvL6IJPN7GKumJSoEuLFdBYk
```

Результат: мы получаем письмо со следующим текстом:

> «Чтобы подтвердить смену вашего e-mail на **<carlos@ginandjuice.shop>**, перейдите по ссылке ниже»

<figure><img src="/files/69e6b689ac3c2f6ea5fecd3797c95d0a395d7365" alt=""><figcaption></figcaption></figure>

Так мы получаем **ссылку подтверждения** для адреса Карлоса и можем завершить смену e-mail на **<carlos@ginandjuice.shop>**.

<figure><img src="/files/eb45a83ae83b314e1e1c3a1b6568db308509d43f" 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/ru/web/race-conditions/single-endpoint-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.
