Dom Clobbering
Основи
Можливо створити глобальні змінні всередині контексту JS з атрибутами id
та name
в HTML тегах.
Лише певні елементи можуть використовувати атрибут name, щоб замінити глобальні змінні, вони: embed
, form
, iframe
, image
, img
та object
.
Цікаво, коли ви використовуєте елемент form для заміни змінної, ви отримаєте значення toString
самого елемента: [object HTMLFormElement]
, але з anchor toString
буде href
якоря. Тому, якщо ви використовуєте тег a
для заміни, ви можете контролювати значення, коли воно обробляється як рядок:
Масиви та атрибути
Також можливо переповнити масив та атрибути об'єкта:
Для заміни третього атрибуту (наприклад, x.y.z), вам потрібно використовувати form
:
Перезапис атрибутів є складнішим, але все ще можливим, використовуючи 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
всередині форми, ви фактично перезаписуєте властивість атрибутів, запобігаючи санітару отримати доступ до фактичних атрибутів.
Ви можете знайти приклад цього типу clobbering у цьому описі CTF.
Перезапис об'єкта документу
Згідно з документацією, можливо перезаписати атрибути об'єкта документу за допомогою DOM Clobbering:
Інтерфейс Document підтримує іменовані властивості. Підтримувані імена властивостей об'єкта Document document у будь-який момент складаються з наступного, в порядку дерева відповідно до елемента, який їх вніс, ігноруючи пізніші дублікати, і зі значеннями від атрибутів id, коли той самий елемент вносить обидва:
- Значення атрибуту name для всіх відкритих елементів embed, form, iframe, img та відкритих елементів object, які мають непорожнє значення атрибуту name та знаходяться у дереві документа з document як їх корінь; - Значення атрибуту id для всіх відкритих елементів object, які мають непорожнє значення атрибуту id та знаходяться у дереві документа з document як їх корінь; - Значення атрибуту id для всіх елементів img, які мають як непорожнє значення атрибуту id, так і непорожнє значення атрибуту name та знаходяться у дереві документа з document як їх корінь.
Використовуючи цю техніку, ви можете перезаписати часто використовувані значення, такі як document.cookie
, document.body
, document.children
, а також методи в інтерфейсі Document, наприклад document.querySelector
.
Запис після елементу, який був перезаписаний
Результати викликів document.getElementById()
та document.querySelector()
можуть бути змінені шляхом впровадження тегу <html>
або <body>
з ідентичним атрибутом id. Ось як це можна зробити:
Крім того, застосовуючи стилі для приховування цих впроваджених тегів HTML/body, можна уникнути втручання іншого тексту в innerText
, що підвищує ефективність атаки:
Дослідження SVG показали, що тег <body>
також може бути використаний ефективно:
Для того, щоб тег HTML працював у межах SVG у браузерах, таких як Chrome та Firefox, необхідний тег <foreignobject>
:
Переповнення форм
Можливо додавати нові записи всередині форми просто, вказавши атрибут form
всередині деяких тегів. Ви можете використовувати це, щоб додавати нові значення всередині форми та навіть додавати нову кнопку для відправлення (клікджекінг або зловживання деяким .click()
JS кодом):
Для отримання додаткових атрибутів форми в кнопці перевірте це.
References
Heyes, Gareth. JavaScript для хакерів: Вивчайте думати як хакер.
Last updated