Методы обхода защитных средств веб-приложений при эксплуатации XSS-векторов18.04.2017 14:03
Несмотря на большое количество рекомендаций по защите веб-приложения от клиент-сайд атак, таких как XSS (cross site scripting) многие разработчики ими пренебрегают, либо выполняют эти требования не полностью. В статье будут рассмотрены способы обхода средств фильтрации и при эксплуатации xss-векторов.
Сейчас существует довольно много способов предотвращения XSS-уязвимостей, включая защитные средства современных браузеров, пытающихся предотвратить выполнение вредоносного кода, воздействующего на пользователя. Тем не менее XSS уязвимости на протяжении последних лет уверенно входят в первую тройку OWASP. XSS уязвимости встречаются как на малопосещаемых проектах, так и на крупных — например можно посмотреть подборку последних public disclosed уязвимостей проекта hackerone — львиную долю из них занимают как раз xss уязвимости. Это касается и довольно распространенных CMS — последняя (на момент публикации статьи) версия Wordpress 4.7.3. закрывает несколько XSS уязвимостей.
Защита
Основные превентивные меры:
валидация данных
преобразование вывода
На практике это должно быть реализовано в виде:
исключения всех недоверенных данных из контекста (body, атрибуты, JavaScript, CSS или URL);
использование «белых списков» на строне сервера (проверка длины, формата, логики и.д.);
использование специализированных средств очистки данных (OWASP AntiSamy или Java HTML Sanitizer Project);
использование атрибута HttpOnly;
использование Content Security Policy.
Не давайте использовать недоверенные данные:
в script
в HTML комментарии
в имени атрибута
<...XSS...... href="/test" /> в имени тега
в CSS
Не давайте использовать недоверенные данные в содержимом HTML элемента:
Методов защиты довольно много, но одним из самых эффективных является использование Content Security Policy.
Content Security Policy
Ранее, одним из главных принципов безопасности браузеров являлась политика Same Origin Policy. Ее суть заключается в проверке трех компонентов, из которых состоит origin: протокол, хост и порт. Однако при внедрении пейлода с одного сайта на другой SOP будет бесполезен для сайта с внедренным пейлоадом. Поэтому на смену SOP пришел CSP, основное предназначение которого состоит в том, чтобы защитить пользователя от угроз межсайтового выполнения сценариев. CSP описывает безопасные источники загрузки ресурсов, устанавливает правила использования встроенных стилей, скриптов, а также динамической оценки JavaScript. Самое главное — загрузка с ресурсов, не входящих в «белый список», блокируется.
Поддерживаемые директивы:
Default-src: определение политики загрузки для всех типов ресурсов в случае, если определенная директива типа ресурса не определена (резервная);
Script-src: какие скрипты могут использовать защищенный ресурс;
Object-src: откуда ресурс может загружать плагины;
Style-src: какие стили (CSS) пользователь применяет к защищенному ресурсу;
Img -src: откуда защищенный ресурс может загружать изображения;
Media-src: откуда защищенный ресурс может загружать видео и аудио;
Frame-src: где защищенный ресурс может вставлять кадры;
Font-src: где защищенный ресурс может загружать шрифты;
Connect-src: какие URI могут быть загружены защищенным ресурсом;
Form-action: какие URI могут использоваться как результат работы HTML-формы;
Sandbox: определяет политику «песочницы HTML»;
Script-nonce: выполнение сценария, требуя наличия указанного nonce для элементов сценария;
Plugin-types: набор плагинов, которые могут быть вызваны защищенным ресурсом, путем ограничения типов ресурсов, которые могут быть встроены;
Reflection-xss: активировать или деактивировать любые проверки, используемые для фильтрации или блокирования отраженных атак между сайтами, эквивалентные нестандартному заголовку X-XSS-Protection;
Report-uri: указывает URI, на который агент пользователя отправляет отчеты о нарушении правил.
Выявление XSS уязвимостей
В качестве проверки наличия уязвимости можно использовать XSS-локаторы или зонды:
Простейший зонд:
'';!--"=&{()}
Простейший JavaScript XSS:
Пример нескольких пейлоадов для обхода возможной фильтрации:
'">>">|\>
@gmail.com'-->">
">
'">
Директива JavaScript:
Регистронезависимый вектор:
Обработчики событий могут быть использованы для внедрения XSS-пейлоада: