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);
}
Итак, мои два очевидных вопросы таковы:
- Мне не хватает каких-либо тегов или атрибутов, которые могут вызывать события?
- Существует ли какой-либо вектор атаки, который не подпадает под действие этих правил?
После долгих испытаний, размышлений и исследований я придумал следующую (довольно простую) реализацию, которая, по-видимому, невосприимчива к любому вектору атаки XSS, который я мог бы бросить на нее.
Я высоко ценю все ваши ценные ответы, спасибо.
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></textarea><script>alert(1337)</script></textarea>
Средство визуализации с ошибками может вывести содержимое этого как:
<textarea></textarea><script>alert(1337)</script></textarea>
Который содержит элемент сценария.
(Полный раскрытие информации: Я написал фрагменты обоих HTML-дезинфицирующих средств, упомянутых выше.)
Гаруда уже дал то, что я бы назвал "правильным" ответом, и его ссылки очень полезны, но он опередил меня!
Я даю свой ответ только для того, чтобы подкрепить.
В наше время, когда расширяются возможности спецификаций 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, выражений фоновых изображений
-
frame
s иiframe
s -
embed
и, вероятно,object
иapplet
- Серверная часть включает
- Теги PHP
- Любые другие инъекции (инъекция SQL, инъекция исполняемого файла и т.д.)
Кстати, я уверен, что это не имеет значения, но атрибуты camelCased являются недопустимыми xhtml и должны быть в нижнем регистре. Я уверен, что это не повлияет на вас.
Возможно, вы захотите проверить эти 2 ссылки для получения дополнительной информации:
Http://adamcecc.blogspot.com/2011/01/javascript.html (это применимо только в том случае, если ваш "отфильтрованный" ввод когда-либо окажется между тегами скрипта на странице)
Http://ha.ckers.org/xss.html (в котором перечислено множество триггеров событий, зависящих от браузера)
Я использовал очиститель HTML, как и вы, по этой причине тоже в сочетании с wysiwyg-редактором. Что я did different использует очень строгий белый список с несколькими доступными базовыми тегами разметки и атрибутами и расширяет его, когда возникает необходимость. Это предохраняет вас от нападения очень неясных векторов (например, по первой ссылке выше), и вы можете по одному копаться в новом необходимом теге/атрибуте.
Только мои 2 цента..
Не забывайте об обработчиках событий HTML5 JavaScript
Http://www.w3schools.com/html5/html5_ref_eventattributes.asp