Dom Clobbering
Основи
Можливо генерувати глобальні змінні в контексті JS з атрибутами id
та name
в HTML тегах.
Тільки певні елементи можуть використовувати атрибут name для клобберингу глобальних змінних, це: embed
, form
, iframe
, image
, img
та object
.
Цікаво, що коли ви використовуєте елемент форми для клобберингу змінної, ви отримаєте toString
значення самого елемента: [object HTMLFormElement]
, але з якорем toString
буде значення якоря href
. Тому, якщо ви клобберите за допомогою a
тегу, ви можете контролювати значення, коли воно обробляється як рядок:
Масиви та атрибути
Також можливо перезаписати масив та атрибути об'єкта:
Щоб знищити третій атрибут (наприклад, x.y.z), вам потрібно використовувати form
:
Clobbering більше атрибутів є більш складним, але все ще можливим, використовуючи iframes:
Тег стилю використовується для надання достатньо часу для рендерингу iframe. Без нього ви отримаєте сповіщення про невизначене.
Щоб перекрити глибші атрибути, ви можете використовувати iframes з html-кодуванням таким чином:
Обхід фільтрації
Якщо фільтр перебирає властивості вузла, використовуючи щось на зразок document.getElementByID('x').attributes
, ви можете перезаписати атрибут .attributes
і зламати фільтр. Інші властивості DOM, такі як tagName
, nodeName
або parentNode
та інші також є перезаписуваними.
Клобберинг window.someObject
window.someObject
В JavaScript часто можна зустріти:
Маніпулювання HTML на сторінці дозволяє перезаписати someObject
з DOM-елементом, що потенційно вводить уразливості безпеки. Наприклад, ви можете замінити someObject
на елемент посилання, що вказує на шкідливий скрипт:
В уразливому коді, наприклад:
Цей метод експлуатує джерело скрипта для виконання небажаного коду.
Трюк: DOMPurify
дозволяє використовувати протокол cid:
, який не кодує URL подвійні лапки. Це означає, що ви можете впровадити закодовану подвійні лапки, яка буде декодована під час виконання. Тому, впроваджуючи щось на кшталт <a id=defaultAvatar><a id=defaultAvatar name=avatar href="cid:"onerror=alert(1)//">
, HTML закодоване "
буде декодовано під час виконання і вийде з значення атрибута, щоб створити подію onerror
.
Інша техніка використовує елемент form
. Деякі бібліотеки на стороні клієнта перевіряють атрибути новоствореного елемента форми, щоб очистити їх. Однак, додавши input
з id=attributes
всередині форми, ви ефективно перезаписуєте властивість атрибутів, запобігаючи санітайзеру доступ до фактичних атрибутів.
Ви можете знайти приклад цього типу клобберингу в цьому CTF звіті.
Клобберинг об'єкта документа
Згідно з документацією, можливо перезаписати атрибути об'єкта документа, використовуючи DOM Clobbering:
Інтерфейс Document підтримує іменовані властивості. Підтримувані імена властивостей об'єкта Document в будь-який момент складаються з наступних, у деревоподібному порядку відповідно до елемента, який їх надав, ігноруючи пізні дублікати, і з значеннями з атрибутів id, які йдуть перед значеннями з атрибутів name, коли один і той же елемент надає обидва:
- Значення атрибута вмісту name для всіх експонованих embed, form, iframe, img та експонованих object елементів, які мають непорожній атрибут вмісту name і знаходяться в дереві документа з документом як їх коренем; - Значення атрибута вмісту id для всіх експонованих object елементів, які мають непорожній атрибут вмісту id і знаходяться в дереві документа з документом як їх коренем; - Значення атрибута вмісту id для всіх img елементів, які мають як непорожній атрибут id, так і непорожній атрибут вмісту name, і знаходяться в дереві документа з документом як їх коренем.
Використовуючи цю техніку, ви можете перезаписати загальновживані значення, такі як document.cookie
, document.body
, document.children
, і навіть методи в інтерфейсі Document, такі як document.querySelector
.
Writing after the element clobbered
Результати викликів document.getElementById()
та document.querySelector()
можуть бути змінені шляхом ін'єкції тегу <html>
або <body>
з ідентичним атрибутом id. Ось як це можна зробити:
Крім того, використовуючи стилі для приховування цих ін'єкованих HTML/body тегів, можна запобігти втручанню з іншого тексту в innerText
, тим самим підвищуючи ефективність атаки:
Дослідження SVG виявили, що тег <body>
також може бути ефективно використаний:
Щоб HTML тег працював у SVG в браузерах, таких як Chrome і Firefox, необхідний тег <foreignobject>
:
Clobbering Forms
Можливо додати нові записи всередині форми, просто вказавши атрибут form
всередині деяких тегів. Ви можете використовувати це, щоб додати нові значення всередині форми і навіть додати нову кнопку для відправки (клікджекинг або зловживання деяким кодом JS .click()
):
Для отримання додаткових атрибутів форми в кнопці перевірте це.
Посилання
Heyes, Gareth. JavaScript для хакерів: навчіться думати як хакер.
Last updated