Вопрос по php, html, xss, javascript, security – Страница не найдена ..

21

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

HTML комментарии удаленыscript а такжеstyle метки счищаются все вместетолько дочерние узлыbody тег будет возвращенвсе атрибуты HTML, которые могут вызывать события Javascript, будут либо проверены, либо удалены

Я много читал о XSS-атаках и предотвращении, и я надеюсь, что я не слишком наивен (если я, пожалуйста, дайте мне знать!), Предполагая, что если я буду следовать всем правилам, которые я упомянул выше, я буду Сейф от XSS.

Проблема в том, что я не уверен, какие другие теги и атрибуты (в любой версии [X] HTML и / или в версиях / реализациях браузера) могут вызывать события Javascript, кромеатрибуты события Javascript по умолчанию:

onAbortonBluronChangeonClickonDblClickonDragDroponErroronFocusonKeyDownonKeyPressonKeyUponLoadonMouseDownonMouseMoveonMouseOutonMouseOveronMouseUponMoveonResetonResizeonSelectonSubmitonUnload

Существуют ли какие-либо другие нестандартные или проприетарные атрибуты событий, которые могут инициировать события Javascript (или VBScript и т. Д.) Или выполнение кода? Я могу думать оhref, style а такжеaction, например:

<a href="javascript:alert(document.location);">XSS</a> // or
<b style="width: expression(alert(document.location));">XSS</b> // or
<form action="javascript:alert(document.location);"><input type="submit" /></form>

Я, вероятно, просто удалюstyle атрибуты в тегах HTML,action а такжеhref Атрибуты представляют большую проблему, но я думаю, что следующего кода достаточно, чтобы убедиться, что их значение является относительным или абсолютным URL, а не каким-то неприятным кодом Javascript:

$value = $attribute->value;

if ((strpos($value, ':') !== false) && (preg_match('~^(?:(?:s?f|ht)tps?|mailto):~i', $value) == 0))
{
    $node->removeAttributeNode($attribute);
}

Итак, два моих очевидных вопроса:

Я пропускаю какие-либо теги или атрибуты, которые могут вызывать события?Есть ли вектор атаки, который не подпадает под эти правила?

После долгих испытаний, размышлений и исследований я придумалследующая (довольно простая) реализация который, кажется, неуязвим для любого вектора атаки XSS, который я мог бы бросить в него.

Я высоко ценю все ваши ценные ответы, спасибо.

@Henning: я должен был сделать это более ясным ... Теги всегда должны быть в белом списке (script а такжеstyle всегда будет удален однако). Атрибуты тега могут быть в белом списке или нет (разрешить все атрибуты, которые должны бытьвнутренне продезинфицированный или внесенный в черный список). Если вы позволитеa тег, вам, вероятно, также необходимо разрешитьhref и у вас по-прежнему та же проблема - вот почему я решил использовать черный список с вторым проходом, поскольку внесение в белый список всех возможных значений атрибута тега было бы слишком громоздким и очень восприимчивым к человеческим ошибкам. Alix Axel
Ну, есть много возможных вариантов оценки JavaScript, таких как кодирование и декодирование. eval, внешний файл javascript и т. д. ... в принципе, не существует известного метода, который бы предотвращал плохие действия пользователя. Вы можете попытаться экранировать теги, слова, кавычки, но все еще возможно ввести xss с помощью интересных методов. Я бы предложил почитатьБезопасность WhiteHat для этого вопроса, может быть, вы можете найти что-то полезное? Igoris Azanovas
Это не звучит "на основе белого списка". Подход на основе белого списка будет копировать только те теги и атрибуты, которые вы знаете, чтобы бытьбезвредный, Для этого вам не нужен список атрибутовmage_ful_. Henning Makholm
@hakre: Пока не выполняется Javascript, мне все равно, если ссылка не работает. Из моих ограниченных тестов (а у меня нет множества ОС, браузеров) этот фрагмент (и некоторые другие варианты) не будет работать. Alix Axel
Ваша проверка URI может быть обманута, если браузер поддерживает некорректные URL-адреса, такие какhttp:jascript:alert(.... hakre

Ваш Ответ

4   ответа
10

href а такжеaction как местаjavascript: URL могут появиться, но вы упускаетеsrc атрибут среди множества других атрибутов загрузки URL.

Строка 399 из OWASP Java HTMLPolicyBuilder является определением атрибутов URL в HTML-дезинфицирующем устройстве белого списка.

private static final Set<String> URL_ATTRIBUTE_NAMES = ImmutableSet.of(
  "action", "archive", "background", "cite", "classid", "codebase", "data",
  "dsync", "formaction", "href", "icon", "longdesc", "manifest", "poster",
  "profile", "src", "usemap");

HTML5 Index содержит сводку типов атрибутов. Здесь не упоминаются некоторые условные вещи, такие как<input type=URL value=...> но если вы сканируете этот список длядействительный URL и друзья, вы должны получить представление о том, что добавляет HTML5. НаборАтрибуты HTML 4 с типом%URI также информативно.

Ваш белый список протоколов выглядит очень похоже наOWASP дезинфицирующее средство один. Добавлениеftp а такжеsftp выглядит достаточно безобидным.

Хорошим источником информации о схеме безопасности для элемента и атрибутов HTML являетсяБелый список Caja JSON которые используются CajaJS HTML дезинфицирующее средство.

Как вы планируете рендеринг полученного DOM? Если вы не будете осторожны, то даже если вы удалите все<script> элементы, злоумышленник может получить рендереру с ошибками для создания контента, который браузер интерпретирует как содержащий<script> элемент. Рассмотрим допустимый HTML, который не содержит элемент script.

<textarea><&#47;textarea><script>alert(1337)</script></textarea>

Глючный рендерер может выводить содержимое этого как:

<textarea></textarea><script>alert(1337)</script></textarea>

который содержит элемент скрипта.

(Полное раскрытие: я написал фрагменты обоих HTML-дезинфицирующих средств, упомянутых выше.)

О, что касается рендеринга DOM, мой код все еще довольно острый, но я использовал встроенный PHPstrip_tags() с белыми тегами (чтобы взять некоторую работу изdom расширение), а затем обойти оставшиеся узлы HTML сDOMDocument удаление узлов тегов или атрибутов, если они не занесены в белый список или постоянно занесены в черный список. Я думаю, что я заметил некоторые ошибки вstrip_tags() поэтому я перепишу все это, используя толькоdom расширение. Я все еще тестирую, если мне нужно использоватьtidy до или, еслиdom достаточно умен один. Alix Axel
Ваш ответ - золото, +10, если бы я мог! Я заглянул в OWASP PHP Sanitizer, но там был только абстрактный класс, однако версия Java кажется очень полной. Я не совсем уверен, как проверить, выполняется ли Javascript внутри некоторых из упомянутых вами атрибутов, если вы знаете, пожалуйста, дайте мне знать. Белые списки Google Caja также довольно аккуратны. Alix Axel
4

что я бы назвал «правильным» ответом, и его ссылки очень полезны, но он опередил меня!

Я даю свой ответ только для подкрепления.

В наши дни возрастает количество возможностей в спецификациях html и ecmascript, и становится все труднее избегать внедрения скриптов и других подобных уязвимостей в html. С каждым новым дополнением вводится целый мир возможных инъекций. Это связано с тем, что разные браузеры, вероятно, имеют разные представления о том, как они собираются реализовывать эти спецификации, поэтому вы получаете еще больше возможных уязвимостей.

Взгляните на краткий список векторов, представленныхHTML 5

Лучшее решение - выбрать то, что вы позволите, а не то, что вы будете отрицать. Гораздо проще сказать: «Эти теги и эти атрибуты только для этих данных тегов разрешены. Все остальное будет соответственно очищено или выброшено».

Было бы очень безответственно для меня составить список и сказать: «Хорошо, вот, пожалуйста, вот список всех пропущенных векторов инъекций. Вы можете спать спокойно». На самом деле, вероятно, существует много векторов инъекций, которые даже не известны ни черным, ни белым шляпам. Как говорится на сайте ha.ckers, внедрение скриптов ограничено только разумом.

Я хотел бы ответить на ваш конкретный вопрос хотя бы немного, поэтому вот несколько вопиющих упущений из вашего черного списка:

img src приписывать. Я думаю, что важно отметить, чтоsrc является допустимым атрибутом для других элементов и может быть потенциально опасным.img такжеdynsrc а такжеlowsrcможет быть, даже больше.type а такжеlanguage атрибутыCDATA в дополнение только к комментариям HTML.Неправильно санированные входные значения. Это не может быть проблемой в зависимости от того, насколько строгим является ваш html-анализ.Никаких неоднозначных спецсимволов. На мой взгляд, даже однозначные должны быть закодированы.Отсутствующие или неправильные кавычки в атрибутах (например, серьезные кавычки).Преждевременное закрытие тегов textarea.UTF-8 (и 7) закодированные символы в скриптахДаже если вы вернете только дочерние узлы тега body, многие браузеры будут по-прежнему оцениватьhead, а такжеhtml элементы внутриbodyи большинствоhead-только элементы внутриbody во всяком случае, так что это, вероятно, не очень поможет.В дополнение к выражениям CSS, фоновые изображения выраженийframeс иiframesembed и, вероятно,object а такжеappletСерверная часть включает в себяТеги PHPЛюбые другие инъекции (SQL-инъекция, исполняемая инъекция и т. Д.)

Кстати, я уверен, что это не имеет значения, но атрибуты camelCased недопустимы в формате xhtml и должны быть в нижнем регистре. Я уверен, что это не влияет на вас.

@ Майк да; изм. У плаката уже были те, однако. Explosion Pills
Хороший ответ, +1. Ссылка, которую вы упоминаете, опирается наonfocus атрибут, если это удаляется новыйautofocus атрибут сам по себе не представляет опасности, поэтому я не считаю, чтоновый вектор атаки, он только «усиливает» существующий. Alix Axel
Когда вы говорите «выражение xss», вы имели в виду «выражение CSS», как в<div style="height: expression(alert(1337))"> для IE иmoz-binding а похожий для других браузеров? Mike Samuel
Что касается упомянутых вами моментов, некоторые из них могут быть проблемой, но опять же я использую подход, основанный на белом списке - я просто пытаюсь составить черный список, который будет всегда использоватьсявнутренне (т.е. не настраивается).src Атрибут особенно беспокоит, я протестирую все, что вы упомянули, и посмотрю, как оно идет. Alix Axel
2

http://adamcecc.blogspot.com/2011/01/javascript.html (это применимо только в том случае, если вы «фильтровали» ввод, когда-либо попадут между тегами скрипта на странице)

http://ha.ckers.org/xss.html (в котором много специфичных для браузера триггеров событий)

Я использовал HTML Purifier, как и вы, по этой же причине в сочетании с wysiwyg-редактором. То, что я сделал по-другому, - это использование очень строгого белого списка с парой базовых тегов разметки и доступных атрибутов и расширение его по мере необходимости. Это удерживает вас от нападения очень непонятных векторов (как первая ссылка выше), и вы можете поочередно покопаться в новом необходимом теге / атрибуте.

Просто мои 2 цента ..

Вы абсолютно правы в избыточном весе :) Хотя мне еще не приходилось испытывать явные задержки при загрузке страниц из-за очистки с помощью HTML-очистителя. Поскольку это довольно хорошо разработанный фреймворк, я уверен, что разработчики знают о проблемах производительности и, скорее всего, сделали его максимально легким и быстрым. Если это все еще проблема для вас лично, я хотел бы рекомендовать вам изучить кэширование PHP-кода (например, APC) или из движка Zend. Garuda
вся страница не найдена mpgn
Спасибо, я знал о Шпаргалке XSS. Первая ссылка выглядит интересной, однако в одном предложении именно то, чего я пытаюсь избежать, в одном предложении: «Правильно, это предупреждение ()если он приземлится где-нибудь в исполняемом разделе JavaScript / DOM это выскакивает cookie ". Очиститель HTML являетсяде-факто стандарт для очистки HTML в PHP, но это также тяжело, я надеюсь, что если я сделаю небольшие компромиссы, я смогу придумать что-то гораздо более легкое. Alix Axel
0
Страница не найдена .. mpgn
Пожалуйста, не ссылайтесь на w3schools, используйте более авторитетные источники. Видетьw3fools.com molnarg
+1, я не знал об этих новых атрибутах. Я проверил, и кажется, что единственные атрибуты, которые начинаются сon все триггеры событий Javascript. Я, вероятно, просто удалю все, что соответствует этому шаблону. Alix Axel

Похожие вопросы