# Dom Clobbering {{#include ../../banners/hacktricks-training.md}} ## **Основи** Можливо генерувати **глобальні змінні в контексті JS** з атрибутами **`id`** та **`name`** в HTML тегах. ```html
``` **Тільки** певні елементи можуть використовувати **атрибут name** для кловерінгу глобальних змінних, це: `embed`, `form`, `iframe`, `image`, `img` та `object`. Цікаво, що коли ви використовуєте **елемент форми** для **кловерінгу** змінної, ви отримаєте **`toString`** значення самого елемента: `[object HTMLFormElement]`, але з **якорем** **`toString`** буде якорний **`href`**. Тому, якщо ви кловерите за допомогою **`a`** тегу, ви можете **контролювати** **значення**, коли воно **обробляється як рядок**: ```html ``` ### Масиви та Атрибути Також можливо **перезаписати масив** та **атрибути об'єкта**: ```html ``` Щоб перезаписати **третій атрибут** (наприклад, x.y.z), вам потрібно використовувати **`form`**: ```html ``` Клобберинг більше атрибутів є **більш складним, але все ще можливим**, використовуючи iframes: ```html ``` > [!WARNING] > Тег style використовується для **надання достатньо часу iframe для рендерингу**. Без нього ви отримаєте сповіщення про **undefined**. Щоб змінити глибші атрибути, ви можете використовувати **iframes з html кодуванням** таким чином: ```html ``` ### **Обхід фільтра** Якщо фільтр **перебирає** **властивості** вузла, використовуючи щось на зразок `document.getElementByID('x').attributes`, ви можете **перезаписати** атрибут **`.attributes`** і **зламати фільтр**. Інші властивості DOM, такі як **`tagName`**, **`nodeName`** або **`parentNode`** та інші також є **перезаписуваними**. ```html ``` ## **Перезапис `window.someObject`** В JavaScript часто можна зустріти: ```javascript var someObject = window.someObject || {} ``` Маніпулювання HTML на сторінці дозволяє перезаписати `someObject` з DOM-елементом, що потенційно вводить уразливості безпеки. Наприклад, ви можете замінити `someObject` на елемент посилання, що вказує на шкідливий скрипт: ```html ``` У вразливому коді, такому як: ```html ``` Цей метод використовує джерело скрипта для виконання небажаного коду. **Трюк**: **`DOMPurify`** дозволяє використовувати протокол **`cid:`**, який **не кодує URL подвійні лапки**. Це означає, що ви можете **впровадити закодовану подвійні лапки, яка буде декодована під час виконання**. Тому, впровадження чогось на кшталт **``** змусить HTML закодоване `"` бути **декодованим під час виконання** і **вийти** з значення атрибута, щоб **створити** подію **`onerror`**. Інша техніка використовує елемент **`form`**. Деякі бібліотеки на стороні клієнта перевіряють атрибути новоствореного елемента форми, щоб очистити їх. Однак, додавши `input` з `id=attributes` всередині форми, ви ефективно перезаписуєте властивість атрибутів, запобігаючи санітайзеру доступ до фактичних атрибутів. Ви можете [**знайти приклад цього типу клобберингу в цьому CTF звіті**](iframes-in-xss-and-csp.md#iframes-in-sop-2). ## Клобберинг об'єкта документа Згідно з документацією, можливо перезаписати атрибути об'єкта документа, використовуючи DOM Clobbering: > Інтерфейс [Document](https://html.spec.whatwg.org/multipage/dom.html#document) [підтримує іменовані властивості](https://webidl.spec.whatwg.org/#dfn-support-named-properties). [Підтримувані імена властивостей](https://webidl.spec.whatwg.org/#dfn-supported-property-names) об'єкта [Document](https://html.spec.whatwg.org/multipage/dom.html#document) в будь-який момент складаються з наступних, у [деревоподібному порядку](https://dom.spec.whatwg.org/#concept-tree-order) відповідно до елемента, який їх надав, ігноруючи пізні дублікати, і з значеннями з атрибутів [id](https://html.spec.whatwg.org/multipage/dom.html#the-id-attribute), які йдуть перед значеннями з атрибутів name, коли один і той же елемент надає обидва: > > \- Значення атрибута вмісту name для всіх [експонованих](https://html.spec.whatwg.org/multipage/dom.html#exposed) [embed](https://html.spec.whatwg.org/multipage/iframe-embed-object.html#the-embed-element), [form](https://html.spec.whatwg.org/multipage/forms.html#the-form-element), [iframe](https://html.spec.whatwg.org/multipage/iframe-embed-object.html#the-iframe-element), [img](https://html.spec.whatwg.org/multipage/embedded-content.html#the-img-element) та [експонованих](https://html.spec.whatwg.org/multipage/dom.html#exposed) [object](https://html.spec.whatwg.org/multipage/iframe-embed-object.html#the-object-element) елементів, які мають непорожній атрибут вмісту name і знаходяться [в дереві документа](https://dom.spec.whatwg.org/#in-a-document-tree) з документом як їх [коренем](https://dom.spec.whatwg.org/#concept-tree-root);\ > \ > \- Значення атрибута вмісту [id](https://html.spec.whatwg.org/multipage/dom.html#the-id-attribute) для всіх [експонованих](https://html.spec.whatwg.org/multipage/dom.html#exposed) [object](https://html.spec.whatwg.org/multipage/iframe-embed-object.html#the-object-element) елементів, які мають непорожній атрибут вмісту [id](https://html.spec.whatwg.org/multipage/dom.html#the-id-attribute) і знаходяться [в дереві документа](https://dom.spec.whatwg.org/#in-a-document-tree) з документом як їх [коренем](https://dom.spec.whatwg.org/#concept-tree-root);\ > \ > \- Значення атрибута вмісту [id](https://html.spec.whatwg.org/multipage/dom.html#the-id-attribute) для всіх [img](https://html.spec.whatwg.org/multipage/embedded-content.html#the-img-element) елементів, які мають як непорожній атрибут [id](https://html.spec.whatwg.org/multipage/dom.html#the-id-attribute), так і непорожній атрибут вмісту name, і знаходяться [в дереві документа](https://dom.spec.whatwg.org/#in-a-document-tree) з документом як їх [коренем](https://dom.spec.whatwg.org/#concept-tree-root). Використовуючи цю техніку, ви можете перезаписати загальновживані **значення, такі як `document.cookie`, `document.body`, `document.children`**, і навіть методи в інтерфейсі Document, такі як `document.querySelector`. ```javascript document.write("clobbered
``` Крім того, використовуючи стилі для приховування цих ін'єкованих HTML/body тегів, можна запобігти втручанню з іншого тексту в `innerText`, тим самим підвищуючи ефективність атаки: ```htmlexisting text
clobbered ``` Дослідження SVG виявили, що тег `` також може бути ефективно використаний: ```html ``` Для того щоб HTML тег працював в SVG в браузерах, таких як Chrome і Firefox, необхідний тег `