XSS - Какие HTML-теги и атрибуты могут вызывать события Javascript?


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

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

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

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

  • onAbort
  • onBlur
  • onChange
  • onClick
  • onDblClick
  • onDragDrop
  • onError
  • onFocus
  • onKeyDown
  • onKeyPress
  • onKeyUp
  • onLoad
  • onMouseDown
  • onMouseMove
  • onMouseOut
  • onMouseOver
  • onMouseUp
  • onMove
  • onReset
  • onResize
  • onSelect
  • onSubmit
  • onUnload

Существуют ли какие-либо другие нестандартные или проприетарные атрибуты событий, которые могут вызывать события 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);
}

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

  1. Мне не хватает каких-либо тегов или атрибутов, которые могут вызывать события?
  2. Существует ли какой-либо вектор атаки, который не подпадает под действие этих правил?

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

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

Author: Alix Axel, 2011-08-08

4 answers

Вы упоминаете href и action как места, где могут отображаться URL-адреса javascript:, но вам не хватает атрибута 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 содержит краткое описание типов атрибутов. В нем не упоминаются некоторые условные вещи, такие как <input type=URL value=...>, но если вы отсканируете этот список для допустимый URL и друзья, вы должны получить хорошее представление о том, что добавляет HTML5. Набор атрибутов HTML 4 с типом %URI также информативен.

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

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

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

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

Средство визуализации с ошибками может вывести содержимое этого как:

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

Который содержит элемент сценария.

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

 10
Author: Mike Samuel, 2011-08-18 02:44:00

Гаруда уже дал то, что я бы назвал "правильным" ответом, и его ссылки очень полезны, но он опередил меня!

Я даю свой ответ только для того, чтобы подкрепить.

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

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

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

.

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

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

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

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

 4
Author: Explosion Pills, 2011-08-08 02:20:04

Возможно, вы захотите проверить эти 2 ссылки для получения дополнительной информации:

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

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

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

Только мои 2 цента..

 2
Author: Garuda, 2011-08-07 22:11:54

Не забывайте об обработчиках событий HTML5 JavaScript

Http://www.w3schools.com/html5/html5_ref_eventattributes.asp

 0
Author: Pierre Ernst, 2011-08-08 12:48:38