Iframes in XSS, CSP and SOP
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Є 3 способи вказати вміст iframe-сторінки:
Через src
, вказуючи URL (URL може бути крос-доменним або того ж домену)
Через src
, вказуючи вміст, використовуючи протокол data:
Через srcdoc
, вказуючи вміст
Доступ до змінних батьківського та дочірнього контексту
Якщо ви отримуєте доступ до попереднього html через http сервер (наприклад, python3 -m http.server
), ви помітите, що всі скрипти будуть виконані (оскільки немає CSP, що цьому перешкоджає). батьківський контекст не зможе отримати доступ до змінної secret
всередині жодного iframe і тільки iframes if2 та if3 (які вважаються такими ж сайтами) можуть отримати доступ до секрету в оригінальному вікні.
Зверніть увагу, що if4 вважається таким, що має null
походження.
Зверніть увагу, що в наступних обходах відповідь на iframe-сторінку не містить жодного заголовка CSP, який заважає виконанню JS.
Значення self
для script-src
не дозволить виконання JS коду, використовуючи протокол data:
або атрибут srcdoc
.
Однак навіть значення none
для CSP дозволить виконання iframes, які вказують URL (повний або лише шлях) в атрибуті src
.
Отже, можливо обійти CSP сторінки за допомогою:
Зверніть увагу, що попередній CSP дозволяє виконання лише вбудованого скрипту.
Однак, будуть виконані лише скрипти if1
та if2
, але лише if1
зможе отримати доступ до секрету батьківського елемента.
Отже, можливо обійти CSP, якщо ви можете завантажити JS файл на сервер і завантажити його через iframe, навіть з script-src 'none'
. Це можливо також зробити, зловживаючи кінцевою точкою JSONP того ж сайту.
Ви можете протестувати це за наступним сценарієм, де куки викрадаються навіть з script-src 'none'
. Просто запустіть додаток і отримайте до нього доступ через ваш браузер:
Вміст в iframe може підлягати додатковим обмеженням за допомогою атрибута sandbox
. За замовчуванням цей атрибут не застосовується, що означає, що обмеження не діють.
Коли використовується, атрибут sandbox
накладає кілька обмежень:
Вміст розглядається так, ніби він походить з унікального джерела.
Будь-яка спроба надсилання форм блокується.
Виконання скриптів заборонено.
Доступ до певних API вимкнено.
Запобігає взаємодії посилань з іншими контекстами перегляду.
Використання плагінів через <embed>
, <object>
, <applet>
або подібні теги заборонено.
Навігація верхнього рівня контексту перегляду вмістом сама по собі заборонена.
Функції, які запускаються автоматично, такі як відтворення відео або автоматичне фокусування елементів форм, блокуються.
Значення атрибута можна залишити порожнім (sandbox=""
), щоб застосувати всі вищезазначені обмеження. Альтернативно, його можна встановити на список специфічних значень, розділених пробілами, які звільняють iframe від певних обмежень.
Перевірте наступні сторінки:
Bypassing SOP with Iframes - 1Bypassing SOP with Iframes - 2Blocking main page to steal postmessageSteal postmessage modifying iframe locationВивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)