Может ли эта защита XSS с помощью HttpOnly Cookies работать?

Я провел некоторое исследование файлов cookie HttpOnly и проблемы, которая существует с возможностью использования запроса XHR в сочетании с методом TRACE для получения значения файла cookie, возвращаемого с сервера.

Для безопасного веб-приложения в настоящее время у меня есть следующая настройка:

  • Файл cookie сеанса отправляется при входе в систему с установленными свойствами secure и httpOnly.
  • HTTP-метод TRACE отключен для всего домена (возвращается «Метод 405 не разрешен»)

Чтобы избежать подделки межсайтовых запросов, я добавил в формы случайный ключ в скрытом поле. Этот ключ должен быть возвращен в каждом запросе POST, чтобы запрос был принят.

Кроме того, весь HTML экранируется по умолчанию с использованием белого списка для выбора разрешенных тегов и атрибутов, но чтобы проиллюстрировать, почему этого недостаточно: ранее мы разрешали использовать атрибут стиля для диапазона (например, для окрашивания текста), который можно использовать для передачи javascript в Internet Explorer следующим образом:

<span style="width: expression(alert('Example'));"> </span>

И затем последний вопрос: может ли кто-нибудь указать на какие-либо недостатки или предложения по возможным недостаткам в этой настройке? Или вы используете одинаковые или совершенно разные подходы?

Известные проблемы:

  • Не все браузеры поддерживают httpOnly
  • Фильтровать css JS-выражения недостаточно, @import(external-style-sheet) тоже может работать

person Tomas    schedule 16.02.2010    source источник


Ответы (2)


Основываясь на вашем сообщении (заголовок немного вводит в заблуждение), я предполагаю, что вы понимаете, что атрибут Httponly предотвращает доступ к cookie через document.cookie и не делает ничего другого для защиты от других неприятных вещей, которые XSS разрешает, включая выдачу себя за пользователя (т.е. не нужно украсть файлы cookie и может использовать полученный токен CSRF), проверку наличия уязвимых плагинов в браузере для установки вредоносных программ, установку кейлоггера javascript, сканирование вашей внутренней сети и т. д., перезапись страницы и т. д.

Как вы говорите, тегов и атрибутов белого списка для каждого тега недостаточно. Вы должны применять более строгую проверку значений атрибутов, возможно, с помощью регулярного выражения белого списка.

Неполный список других вещей, которые следует учитывать, некоторые из которых не имеют прямого отношения к XSS или CSRF:

  • Как вы справляетесь с неполным html, например, с отсутствующими закрывающими тегами?
  • Как вы обрабатываете одинарную кавычку, двойную кавычку и обратную косую черту в пользовательском вводе?
  • How do you handle user input that is output in different contexts - such as in url links, attribute values, etc.?
  • Do you check that input actually matches input charset encoding?
  • Вы явно устанавливаете Content-Type в заголовке ответа и в метатеге?
  • Для умеренно чувствительных пользовательских страниц, обслуживаемых через HTTP, если таковые имеются, вы устанавливаете соответствующий заголовок Cache-Control?
  • Как вы гарантируете, что пользовательский ввод изолирован? В частности, если вы разрешаете CSS, как вы гарантируете, что стиль применяется только к ограниченной области и не может изменять другие области?
  • У вас есть сторонний javascript, включая рекламу на сайте?
  • Защищен ли файл cookie сеанса от несанкционированного доступа, если он должен быть защищен?
  • Вы очищаете все входные данные, включая заголовки HTTP, которые могут быть изменены пользователем?
  • Является ли токен CSRF действительно случайным? Если да, то как вы генерируете случайный токен? Если нет, то как вы его строите?
  • Используете ли вы подготовленные операторы и параметры привязки?
  • Могут ли пользователи загружать файлы?
  • Обслуживаете ли вы загружаемый пользователями контент, такой как изображения и т. д.? Если да, то как вы проверяете содержимое файла (ошибка GIFAR) и обслуживается ли файл из того же домена?
  • Предоставляете ли вы доступ к API, и если да, то размещается ли он в том же домене? Какое междоменное ограничение у вас есть?
person mar    schedule 17.02.2010
comment
Хороший список! Большинство из них мы уже реализовали, проблемы с кодировкой занимают первое место в нашем общем списке тестирования. Известны ли вам какие-либо белые списки значений атрибутов, которые считаются безопасными? Потому что, как объяснялось, мы считали стиль безопасным в течение короткого времени, что на самом деле вовсе не безопасно. Обзор свойств и регулярных выражений проверки был бы отличным источником для многих веб-разработчиков. - person Tomas; 18.02.2010
comment
Мы разрешили теги и селекторы CSS, разрешили атрибуты для каждого тега и допустимые значения для каждого из этих атрибутов/селекторов на основе спецификации (например, цвет и размер шрифта имеют разные значения). регулярное выражение белого списка) и наш уровень comfort (может разрешать href только для определенных доменов). Регулярное выражение применяется после того, как мы проходим через каждый введенный символ с помощью библиотеки, такой как icu или iconv, и пользовательского синтаксического анализатора html — определенные символы преобразуются в закодированные значения escaped/htmlentity. Наконец, мы выводим только ввод, который мы понимаем. К сожалению, исходный код еще не находится в открытом доступе. - person mar; 19.02.2010

HttpOnly Cookies — это хорошая мера безопасности, но она не предназначена для остановки XSS, а просто затрудняет использование злоумышленниками уязвимостей xss. Позвольте мне уточнить.

Систему безопасности xsrf на основе токенов можно обойти с помощью XSS, поэтому злоумышленнику не нужно знать файл cookie, чтобы использовать уязвимость xss.

Чтобы избежать подделки межсайтовых запросов, я добавил в формы случайный ключ в скрытом поле. Этот ключ должен быть возвращен в каждом запросе POST, чтобы запрос был принят.

Например, используя XSS, злоумышленник может выполнить JavaScript, который может прочитать любую страницу в домене с помощью xmlhttprequest. Таким образом, используя xmlhttprequest, злоумышленник может прочитать токен XSRF, а затем использовать его для подделки запроса POST. Это связано с тем, что одним из свойств XSS является то, что он допускает разрыв в Та же политика происхождения. Например, Вот написанный мной реальный эксплойт, который делает то, что я только что объяснил.

Лучший способ предотвратить XSS — преобразовать неприятные символы, такие как <>, в соответствующие им html-объекты. В PHP я рекомендую:

$var=htmlspeicalchars($var,ENT_QUOTES);

Это исправит одинарные и двойные кавычки, чтобы он мог остановить большинство xss. Даже если полученное жало находится в html-теге. Например, злоумышленник не сможет использовать этот эксплойт, если вы замените кавычки. Это связано с тем, что злоумышленник должен выйти из кавычек, чтобы выполнить «onload=».

$var="' onload='alert(document.cookie)'";

в этот html:

print("<img src='http://HOST/img.php?=".$var."'>");

ОДНАКО конкретный случай, который вы указали с помощью тега <span>, по-прежнему является потенциальной проблемой, поскольку злоумышленнику не нужны кавычки! У вас также будет уязвимость xss, если вы поместите внутри тег <script>. Просто будьте осторожны с тем, где размещается пользовательский ввод, не существует «универсального решения» или «серебряной пули» для всех уязвимостей.

Атака «XST», использующая метод HTTP «TRACE», на практике не является реальной атакой. Причина в том, что злоумышленник не может заставить веб-браузер сделать HTTP-запрос TRACE. Злоумышленники могут форсировать методы «GET» и «POST», используя JavaScript или тег <img> в случае «GET», но остальная часть заголовка HTTP недоступна. Имейте в виду, что TRACE включен по умолчанию почти во всех системах Apache, и если бы это было действительно опасно, его бы вообще удалили. Многие инструменты тестирования безопасности, такие как Nessus, выдают ошибку, если Apache поддерживает TRACE, его также можно легко отключить.

person rook    schedule 17.02.2010
comment
Я предполагаю, что OP хочет разрешить рендеринг пользовательского ввода html и css. Такие приложения, как yahoo mail или gmail, которые позволяют использовать электронную почту в формате html, попадают в эту категорию. Если нет, то проигнорируйте мой ответ и остальную часть этого комментария (в основном согласен с Майклом). Если вы хотите разрешить использование html и css html, созданных пользователем, кодирование всего ввода не подходит. Например, a href во входных данных будет преобразован в a. Белые списки тегов и имен атрибутов. Очистите значения атрибутов (например, href не должен разрешать использование javascript). То же самое для CSS (песочницы). - person mar; 18.02.2010
comment
Мар: Вы правы, мы хотим отображать пользовательский ввод в формате html (некоторые из электронной почты, поэтому мы не можем заставить пользователей использовать что-то вроде BB-кода). - person Tomas; 18.02.2010
comment
Майкл: TRACE действительно можно легко отключить, это уже сделано. Ваше утверждение, что TRACE с использованием XHR невозможно, неверно, попробуйте: xhr.open('trace', '/', false); Но преобразование символов html в объекты и экранирование кавычек не является жизнеспособным решением из-за необходимости отображать пользовательский ввод, содержащий базовый HTML. - person Tomas; 18.02.2010
comment
@ Том, верно, но для использования XHR вы должны выполнять JavaScript в том же контексте, что и домен. В противном случае это было бы нарушением политики единого происхождения. code.google.com/p/browsersec/wiki/ Это спорный вопрос, и поэтому он все еще включен на 99% серверов. Вы МОЖЕТЕ отправлять запросы GET и POST из любого домена в любой домен, используя JS и HTML, и поэтому XSRF все еще остается серьезной проблемой. - person rook; 19.02.2010
comment
@Tom, более того, дополнительные записи html являются наиболее распространенным методом защиты от xss, потому что, в отличие от striptags (), сообщение по-прежнему удобочитаемо для человека, а также предотвращает больше крайних случаев xss. Чтобы приготовить омлет, вам нужно разбить несколько яиц, а безопасность заключается в том, чтобы сделать программное обеспечение менее полезным. Кстати, TRACE отключен на моих серверах, потому что он не нужен. - person rook; 19.02.2010
comment
@Rook Не могли бы вы подробнее рассказать о http://www.milw0rm.com/exploits/7922? (я сажусь?) - person user3529850; 22.10.2019
comment
@ user3529850 Ссылка обновлена, это полезная нагрузка XSS, которая считывает токен CSRF. Я объяснил это полностью. - person rook; 24.10.2019