> 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).

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

Заметки о состоянии гонки в одной конечной точке для лабораторий PortSwigger Web Security Academy, включая рабочий процесс эксплуатации, тестирование полезных нагрузок, валидацию в Burp Suite и контекст устранения.

### Состояния гонки с одним конечным пунктом

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

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

Пользователь с адресом **<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="https://4248209978-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-3ab11eef8935b88b8cf12e18aa475fef81448792%2F%7BB9965F27-F99E-4E23-9E7D-9F2E94C7F043%7D.png?alt=media" alt=""><figcaption></figcaption></figure>

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

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

<figure><img src="https://4248209978-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-6eba0920d90de61a9f7285b81f048bae6142d92f%2F%7BB366E8CE-D8D9-4D46-942E-63B9BB8FE44B%7D.png?alt=media" alt=""><figcaption></figcaption></figure>

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

После перехода по ссылке:

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

<figure><img src="https://4248209978-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-9f60d6a8e3d68770dc60ff1e54f0ea08e8c3171e%2F%7B5AB7B670-A429-47DB-A72F-80B5111784B6%7D.png?alt=media" alt=""><figcaption></figcaption></figure>

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

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

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

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

<figure><img src="https://4248209978-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-357c60e05d8bfd2eb429eb50840b2067cb7c476e%2F%7BB58C2B7C-B60C-4F1F-829B-5096C98DAC0A%7D.png?alt=media" 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="https://4248209978-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-c43aa15adffcea353c6bb0c501b4dcb55f92773d%2F%7B9FCBD891-6314-4A27-BB9C-4E2E9E301C6F%7D.png?alt=media" alt=""><figcaption></figcaption></figure>

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

<figure><img src="https://4248209978-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-6b191058ec9bc145e37525859bbf436cd2afa1f7%2F%7BC1955487-7C79-46C5-AA7F-4E5AB76649ED%7D.png?alt=media" alt="" width="563"><figcaption></figcaption></figure>

<figure><img src="https://4248209978-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-3bf9ae1755022c015c658c9cbe8848492dbb8903%2Fimage%20(87).png?alt=media" alt=""><figcaption></figcaption></figure>

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

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

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

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

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

Часть с:

```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="https://4248209978-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-5907a4217989d1b6c48409ce59ae672be0456335%2F%7BF5E0B96B-0ACE-47EE-8C3F-E268A7538D29%7D.png?alt=media" alt=""><figcaption></figcaption></figure>

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

<figure><img src="https://4248209978-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-efdf8a609e605c94a029cf972ff85131bdfd9c4d%2F%7BA07FCA9E-56F0-4753-BA33-FF61670FA998%7D.png?alt=media" 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 by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://hacking-notes.jord4n.pro/ru/web/race-conditions/single-endpoint-race-condition.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

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.
