XSS - Какие HTML-теги и атрибуты могут вызывать события Javascript? - PullRequest
21 голосов
/ 08 августа 2011

Я пытаюсь кодировать безопасный и легкий очиститель 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, который я мог бы бросить в него.

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

Ответы [ 4 ]

10 голосов
/ 08 августа 2011

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

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

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

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

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

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

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

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

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

4 голосов
/ 08 августа 2011

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

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

В наши дни возрастает количество функций в спецификациях 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 с и iframe с
  • embed и, вероятно, object и applet
  • Серверная часть включает
  • теги PHP
  • Любые другие инъекции (SQL-инъекция, инъекция исполняемых файлов и т. Д.)

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

2 голосов
/ 08 августа 2011

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

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

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

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

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

0 голосов
/ 08 августа 2011

Не забудьте обработчики событий HTML5 JavaScript

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...