Есть ли XSS уязвимости в самописном санитайзере?
Есть код на PHP.
Если коротко - он чистит пользовательский ввод перед сохранением в базу.
<?php $payload = '...'; $sanitizedText = strip_tags($payload, '<br><b>'); $sanitizedText = preg_replace('/(s)s+/m', '\1', $sanitizedText); $sanitizedText = preg_replace("/<([a-z][a-z0-9]*)[^<|>]*?(/?)>/si",'<$1$2>', $sanitizedText); $sanitizedText = nl2br($sanitizedText); echo $sanitizedText; |
<?php $payload = '...'; $sanitizedText = strip_tags($payload, '<br><b>'); $sanitizedText = preg_replace('/(s)s+/m', '\1', $sanitizedText); $sanitizedText = preg_replace("/<([a-z][a-z0-9]*)[^<|>]*?(/?)>/si",'<$1$2>', $sanitizedText); $sanitizedText = nl2br($sanitizedText); echo $sanitizedText;
Try online: https://onlinephp.io/c/6a70a
Это код моего коллеги. Сам я Front-end разработчик.
Сначала тут не было третьей строки - она удаляет атрибуты. После того, как я показал коллеге пейлоад, который эксплуатирует недостаточную фильтрацию - он дописал регулярку, которая вырезает аттрибуты.
Но во-первых, он бекенд разработчик и у него нет опыта написания XSS зондов/эксплойтов. А во вторых, он сам говорит, что плохо знает регулярные выражения.
Итак, после некоторого анализа, я обнаружил, что регулярку с легкостью проходит следующий классический пейлоад:
<b a="><b onclick="alert(1)">click me</b>
Но strip_tags режет атрибуты, в которых есть <.
Потом я нашел ещё один интересный момент в strip_tags:
Input:
<b/some>bold</b>
Output:
bold</b>
Но вот что-то интересное из этого я вытянуть не смог пока что.
Подскажите, есть ли ещё тут что-то интересное для обхода? Спасибо!
Дополнительно:
Прогоните примеры отсюда:
https://cheatsheetseries.owasp.org/cheatsheets/XSS...
Ответы:
Если говорить с практической точки зрения, то лично я бы не стал ковыряться в этом говнокоде, а выкинул его целиком. И сделал нормально:
- перед сохранением в базу текст вообще не трогал
- (опционально - валидация, которая не трогает текст, а может только выдать ошибку, что он не соответствует требованиям)
- перед выводом:
- сделать ему htmlspecialchars()
- и отрендерить в маркдаун, чтобы вместо этих пещерных <b> и <br> поддерживалось натуральное форматирование переводов строк, списков, выделения, и прочего.
- С практической точки да, я с вами согласен на 110%.
Но этот legacy модуль используется везде. И в админке и на веб морде для клиентов и в API интеграциях. Переделывать его для поддержки Markdown не представляется возможным. Уже само присутствие такого кода в core production приложения свидельствует о том, что в компании всё на вчера и за небольшие деньги. Никто не будет тратить ресурсы на обеспечение какой-то там секьюрити или тем более best practices.
К сожалению, пока база клиентов не поедет на теневые форумы, никто пальцем об палец не ударит.
К тому-же, у нас куча мест, где поддерживается заголовок `Accept: text/html`, а он просто рендерит шаблоны из данных из базы. Я не знаю, есть ли там вообще хоть какая-то санитизация.
В общем, вопрос скорее не о том, "как нужно", а об эксплойте. И, скорее не для улучшения ситуации (зачем мне это нужно, если никому не нужно? Серьезность я объяснял всем по 100 раз. Они сделали выбор), а из азарта.
-
К сожалению, пока база клиентов не поедет на теневые форумы, никто пальцем об палец не ударит.
Так давай же ускорим этот момент, раз вам с другом бекендером так скучно, выкладывай урл))
- Uno, хорошая попытка, молодой человек (с)
Если речь про очистку html то могу посоветовать только 2 проверенных решения
1. https://github.com/ezyang/htmlpurifier
2. https://symfony.com/doc/current/html_sanitizer.html
Все остальные велосипеды - до первого взлома.
- Нет, речь про взлом конкретного санитайзера
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Для начала, важно понимать, что XSS (Cross-Site Scripting) - это тип атаки, при которой злоумышленник внедряет вредоносный скрипт на веб-страницу, который выполняется в браузере пользователя. Существует несколько типов XSS: хранимый (stored), отраженный (reflected) и DOM-based.
Самописный санитайзер предназначен для защиты от XSS-атак путем фильтрации и очистки входных данных от потенциально вредоносного контента. Однако, даже самописные санитайзеры могут иметь уязвимости, которые могут быть использованы злоумышленниками для обхода защиты.
Основные причины возникновения XSS-уязвимостей в самописных санитайзерах могут быть следующими:
1. Неполное понимание спецификаций и принципов работы XSS-атак. Разработчики могут недооценить сложность и разнообразие способов, которыми злоумышленники могут пытаться обойти санитайзер.
2. Недостаточное тестирование и анализ безопасности. Некорректное тестирование санитайзера может привести к пропуску уязвимостей, которые могут быть использованы для XSS-атак.
3. Отсутствие регулярного обновления и поддержки. Без постоянного обновления и анализа новых методов атаки санитайзер может стать уязвимым к новым угрозам.
Для того чтобы минимизировать риск возникновения XSS-уязвимостей в самописных санитайзерах, следует придерживаться следующих рекомендаций:
1. Использовать проверенные библиотеки и фреймворки для защиты от XSS-атак. Такие библиотеки обычно имеют более широкий спектр защитных мер и регулярно обновляются.
2. Проводить регулярное тестирование и аудит безопасности самописных санитайзеров. Это поможет выявить и устранить потенциальные уязвимости до того, как они будут использованы злоумышленниками.
3. Обновлять и поддерживать самописные санитайзеры. Только постоянное обновление и анализ новых угроз могут обеспечить надежную защиту от XSS-атак.
Таким образом, хотя самописные санитайзеры могут быть эффективны в защите от XSS-атак, они все равно могут иметь уязвимости, которые необходимо постоянно обновлять и анализировать для обеспечения безопасности веб-приложения.