# Iframes in XSS, CSP and SOP
{% hint style="success" %}
Learn & practice AWS Hacking:[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)\
Learn & practice GCP Hacking: [**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)
Support HackTricks
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
{% endhint %}
## Iframes in XSS
Є 3 способи вказати вміст iframe-сторінки:
* Через `src`, вказуючи URL (URL може бути крос-доменним або того ж домену)
* Через `src`, вказуючи вміст, використовуючи протокол `data:`
* Через `srcdoc`, вказуючи вміст
**Доступ до змінних батьківського та дочірнього контексту**
```html
```
```html
```
Якщо ви отримуєте доступ до попереднього html через http сервер (наприклад, `python3 -m http.server`), ви помітите, що всі скрипти будуть виконані (оскільки немає CSP, що цьому перешкоджає). **батьківський контекст не зможе отримати доступ до змінної `secret` всередині жодного iframe** і **тільки iframes if2 та if3 (які вважаються такими ж сайтами) можуть отримати доступ до секрету** в оригінальному вікні.\
Зверніть увагу, що if4 вважається таким, що має `null` походження.
### Iframes з CSP
{% hint style="info" %}
Зверніть увагу, що в наступних обходах відповідь на iframe-сторінку не містить жодного заголовка CSP, який заважає виконанню JS.
{% endhint %}
Значення `self` для `script-src` не дозволить виконання JS коду, використовуючи протокол `data:` або атрибут `srcdoc`.\
Однак навіть значення `none` для CSP дозволить виконання iframes, які вказують URL (повний або лише шлях) в атрибуті `src`.\
Отже, можливо обійти CSP сторінки за допомогою:
```html
```
Зверніть увагу, що **попередній CSP дозволяє виконання лише вбудованого скрипту**.\
Однак, **будуть виконані лише скрипти `if1` та `if2`, але лише `if1` зможе отримати доступ до секрету батьківського елемента**.
![](<../../.gitbook/assets/image (372).png>)
Отже, можливо **обійти CSP, якщо ви можете завантажити JS файл на сервер і завантажити його через iframe, навіть з `script-src 'none'`**. Це **можливо також зробити, зловживаючи кінцевою точкою JSONP того ж сайту**.
Ви можете протестувати це за наступним сценарієм, де куки викрадаються навіть з `script-src 'none'`. Просто запустіть додаток і отримайте до нього доступ через ваш браузер:
```python
import flask
from flask import Flask
app = Flask(__name__)
@app.route("/")
def index():
resp = flask.Response('')
resp.headers['Content-Security-Policy'] = "script-src 'self'"
resp.headers['Set-Cookie'] = 'secret=THISISMYSECRET'
return resp
@app.route("/cookie_s.html")
def cookie_s():
return ""
if __name__ == "__main__":
app.run()
```
### Інші корисні навантаження, знайдені в дикій природі
```html
```
### Iframe sandbox
Вміст в iframe може підлягати додатковим обмеженням за допомогою атрибута `sandbox`. За замовчуванням цей атрибут не застосовується, що означає, що обмеження не діють.
Коли використовується, атрибут `sandbox` накладає кілька обмежень:
* Вміст розглядається так, ніби він походить з унікального джерела.
* Будь-яка спроба надсилання форм блокується.
* Виконання скриптів заборонено.
* Доступ до певних API вимкнено.
* Запобігає взаємодії посилань з іншими контекстами перегляду.
* Використання плагінів через `