TL; DR: Усі добре написані веб-сайти (/ програми) повинні випускати заголовок X-XSS-Protection: 0
і просто забувати про цю функцію. Якщо ви хочете отримати додатковий захист, який можуть надавати кращі користувацькі агенти, використовуйте суворий Content-Security-Policy
заголовок.
Довга відповідь:
HTTP-заголовок X-XSS-Protection
- це одна з тих речей, яку Microsoft представила в Internet Explorer 8.0 (MSIE 8), яка мала підвищити безпеку неправильно написаних веб-сайтів.
Ідея полягає у застосуванні якоїсь евристики, щоб спробувати виявити відбиття XSS-атаки та автоматично стерти атаку.
Проблемною частиною цього є «евристика» та «кастрування». Евристика призводить до помилкових позитивних результатів, а кастрація не може бути безпечно виконана, оскільки це призводить до побічних ефектів, які можуть бути використані для здійснення XSS-атак та DoS-атак на абсолютно безпечні веб-сайти.
Погано в тому, що якщо веб-сайт не випускає заголовок, X-XSS-Protection
то браузер буде вести себе так, як ніби заголовок X-XSS-Protection: 1
був видалений. Гірша частина полягає в тому, що це значення є найменш безпечним значенням усіх можливих значень для цього заголовка!
Для даного захищеного веб-сайту (тобто на сайті немає відображення вразливості XSS) ця функція "захисту від XSS" дозволяє здійснювати наступні атаки:
X-XSS-Protection: 1
дозволяє зловмиснику вибірково блокувати частини JavaScript і підтримувати решту сценаріїв. Це можливо, тому що евристика цієї функції є просто "якщо значення будь-якого параметра GET знайдено в сценарійній частині джерела сторінки, сценарій буде автоматично змінено залежним від агента користувача способом". На практиці зловмисник може, наприклад, додати параметр, disablexss=<script src="framebuster.js"
і браузер автоматично видалить рядок <script src="framebuster.js"
із фактичного джерела сторінки. Зауважте, що решта сторінки продовжується, а зловмисник просто зняв цю частину безпеки сторінки. На практиці будь-який JS у джерелі сторінки може бути змінений. У деяких випадках сторінка без вразливості XSS, що відображає вміст, може бути використана для запуску вибраного JavaScript на сторінці внаслідок нетерпіннянеправильне перетворення простих текстових даних у виконуваний код JavaScript .
X-XSS-Protection: 1; mode=block
дозволяє зловмиснику просочувати дані з джерела сторінки, використовуючи поведінку сторінки як бічного каналу. Наприклад, якщо сторінка містить код JavaScript по рядках var csrf_secret="521231347843"
, зловмисник просто додає додатковий параметр, наприклад, leak=var%20csrf_secret="3
якщо сторінка НЕ заблокована, 3
перша помилка була неправильною. Зловмисник намагається знову, на цей раз leak=var%20csrf_secret="5
завантаження сторінки буде перервано. Це дозволяє зловмисникові знати, що перша цифра секрету 5
. Потім зловмисник продовжує відгадувати наступну цифру.
Врешті-решт, якщо ваш сайт наповнений атаками відбиття XSS, використання значення за замовчуванням 1
трохи зменшить поверхню атаки. Однак якщо ваш сайт захищений і ви не випускаєте його X-XSS-Protection: 0
, він буде вразливим для будь-якого браузера, який підтримує цю функцію. Якщо ви хочете отримати захист у глибині підтримки браузерів від ще невідомих уразливостей XSS на вашому сайті, використовуйте суворий Content-Security-Policy
заголовок. Це не відкриває ваш сайт для відомих уразливостей.
Наразі ця функція за замовчуванням увімкнена в MSIE, Safari та Google Chrome. Це було ввімкнено в Edge, але Microsoft вже видалила цю неправильну функцію з Edge . Mozilla Firefox цього не реалізував.
Дивитися також:
https://homakov.blogspot.com/2013/02/hacking-facebook-with-oauth2-and-chrome.html
https://blog.innerht.ml/the-misunderposed-x-xss-protection/
http: / /p42.us/ie8xss/Abusing_IE8s_XSS_Filters.pdf
https://www.slideshare.net/masatokinugawa/xxn-en
https://bugs.chromium.org/p/chromium/isissue/detail?id=396544
https: // bugs.chromium.org/p/chromium/isissue/detail?id=498982