Browser Security Handbook. Глава 1, пункт 6

Browser Security Handbook. Глава 1, пункт 6

Руководство по безопасности браузеров (Browser Security Handbook). Глава 1

6. Язык разметки гипертекста ( HTML )

Язык разметки гипертекста - основной формат документов, предоставляемых современным браузерам, который произошел от StandardGeneralizedMarkupLanguage (SGML) - стандарта для машиночитаемых документов.

Официальной спецификации HTML 1.0 не существует. До 1995 года существовало множество неофициальных стандартов HTML. Чтобы стандартная версия отличалась от них, ей сразу присвоили второй номер. Версия 3 была предложена Консорциумом всемирной паутины (W3C) в марте 1995 года и обеспечивала много новых возможностей, таких как создание таблиц, обтекание изображений текстом и отображение сложных математических формул. Даже притом, что этот стандарт был совместим со второй версией, реализация его была сложна для браузеров того времени. Следующей версией стандарта HTML стала 3.2 (версия 3.1 официально не утверждалась), в которой были опущены многие нововведения версии 3.0, но добавлены нестандартные элементы, поддерживаемые браузерами Netscape Navigatorи Mosaic. W3C и WHATWG стремились «навести порядок» в стандарте и сделать HTML строгим и качественным. Им это почти удалось реализовать в HTML 4 и XHTML (вариант HTML, который строго соответствует XML-синтаксису). Также продолжаются работы по HTML 5 .

На сегодняшний день распространены следующие браузерные движки для отображения веб-страниц:
- Trident (MSHTML) - используется в Internet Explorer, начиная с версии 4.0 и выше;
- Gecko - используется в Firefox, Netscape и т.п.;
- WebKit - используется в Safari, Chrome и мобильных платформах для смартфонов и планшетов;
- Presto - используется в Opera.

Способность приложений правильно отображать в браузере структуру HTML-документа является важным атрибутом безопасности. Наличие различных версий HTML в сочетании с кодом (JavaScript, Flash, Java-applets) и отображаемыми данными делают стандарт уязвимым, что также отражается и на безопасности сайта (см. статьи о веб-безопасности ).

К сожалению, из-за совместимости, синтаксических анализаторов, работающих не в режиме XML, и собственных функций трудно предвидеть, как будет интерпретироваться сторонний HTML-документ или его отдельные части. Следующие примеры могут быть истолкованы как скрипты для вывода окна с сообщением:

01:<B <SCRIPT>alert(1)</SCRIPT>>
02:<B="<SCRIPT>alert(1)</SCRIPT>">
03:<IMG SRC=`javascript:alert(1)`>
04:<S[0x00]CRIPT>alert(1)</S[0x00]CRIPT>
05:<A """><IMG SRC="javascript:alert(1)">
06: <IMG onmouseover =alert(1)>
07: <A/HREF="javascript:alert(1)">
08: <!-- Hello -- world > <SCRIPT>alert(1)</SCRIPT> -->
09: <IMG ALT="><SCRIPT>alert(1)</SCRIPT>"(EOF)
10: <![><IMG ALT="]><SCRIPT>alert(1)</SCRIPT>">
Другое интересное свойство HTML - сross-sitescripting (XSS) - уязвимость позволяет подменить кодировку в заголовке страницы:

<title>
+ADw-/title+AD4APA-meta http-equiv+AD0-'content-type' content+AD0-'text/html+ADs-charset+AD0-utf-7'+AD4-
</title>
<meta http-equiv="content-type" content="text/html; charset=utf-8">

Не все атрибуты HTTP-EQUIVобязательны, например, синтаксический анализатор HTML к тому времени уже определял Content-Type, Content-Length, Location или Content-Disposition, но мы увидели, что некоторые значения могут быть настроены выше представленным способом.

Стратегия для решения HTTP-HTML-конфликтов не указана в W3C-стандарте. На практике, значимые http-заголовки, имеют приоритет над HTTP-EQUIV; с другой стороны, HTTP-EQUIVимеет приоритет над непризнанными значениями HTTP-заголовков. HTTP-EQUIV-теги также будут иметь преимущество, когда страница открывается локально с диска, а не загружается с веб-сервера.

В Internet Explorer присутствуют следующие уникальные особенности:
- В то время как все другие браузеры принимают значение параметра строки в кавычках, только если кавычка стоит перед параметром, MSIE ищет закрывающую кавычку подстроки где-нибудь в середине:<imgsrc=test.jpg?value=">Yes, we are still inside a tag!">
- Распознавание условных комментариев: <!­­--[if IE]> Специальные инструкции для IE <![endif]-->
- Тэг<comment>: <p>Это<comment>не</comment> IE.</p>
- Распознавание url-кодирования.

Другие различия между браузерными движками, влияющие на безопасность, приведены в таблице №7:
Таблица №7
Описание теста
MSIE7
MSIE8
FF3
Safari
Opera
Chrome
Android
Синтаксический анализатор восстанавливает вложенные теги (<FOO <BAR...)?
НЕТ
НЕТ
ДА
НЕТ
НЕТ
НЕТ
НЕТ
Рекурсивное восстановление вложенных тегов (FOO и BAR интерпретируются)?
НЕТ
НЕТ
ДА
НЕТ
НЕТ
НЕТ
НЕТ
Синтаксический анализатор сбрасывает поврежденные имена тегов (<FOO="<BAR...)?
НЕТ
НЕТ
ДА
НЕТ
НЕТ
НЕТ
НЕТ
Отслеживание на отсутствие тега закрытия
(<FOO BAR="><BAZ>"(EOF))?
ДА
ДА
НЕТ
НЕТ
ДА
НЕТ
НЕТ
Отслеживание на отсутствующий параметр закрытия (<FOO BAR="><JSV>(EOF))?
НЕТ
НЕТ
ДА
НЕТ
ДА
НЕТ
НЕТ
SGML-разметки комментариев допускаются в строгом режиме (--и >могут применяться по отдельности)?
НЕТ
НЕТ
ДА
НЕТ
НЕТ
НЕТ
НЕТ
Блоки CDATAподдерживаются в обычных HTML-документах?
НЕТ
НЕТ
ДА
НЕТ
ДА
НЕТ
НЕТ
!– и ?-типы тегов анализируются отличным от HTML образом (<!FOO BAR="-->"...разрывы)?
НЕТ
НЕТ
ДА
НЕТ
ДА
НЕТ
НЕТ
Символы принимаются как имя тега/параметр разделителя (за исключением t r n x20)
x0B x0C /
НЕТ
/
x0B x0C
x0B x0C xA0
x0B x0C
x0B x0C
Символы игнорируются между именем параметра, знаком равенства, и значением (за исключением t r n)
x0B x0C x20
x0B x0C x20
x20
x0B x0C x20
x20 xA0
x0B x0C x20
x0B x0C x20
Символы принимаются вместо кавычек для HTML-параметров (за исключением ")
' `
' `
'
'
'
'
'
Символы принимаются в имена тегов (за исключением A-Z / ? !)
%
%
нет
нет
нет
нет

Об этих и других особенностях HTML можно прочитать в книге "WebApplicationObfuscation" .

Примечание 1: специальные правила HTML-обработки иногда применяться к определенным разделам документа, например, в определенном контексте символ x00игнорируется InternetExplorer, символ x08– Firefox (в особенности, они игнорируются в тегах значения параметра).

Примечание 2: поведение синтаксического анализатора HTML, в частности у WebKit, быстро меняется в связи с разработкой HTML5.

Мнемоники в HTML

В HTML предопределено большое количество спецсимволов. Чтобы вставить определённый символ в разметку, нужно вставить определенную ссылку-мнемонику в HTML-структуру. Целью ссылки-мнемоники является замена определенного спецсимвола (например, < > &), а также безопасное выполнение символов старшего бита над 7-битными мультимедийными данными.

Допустимо три типа записи ссылок-мнемоник:
- в формате &<имя>;,например, &lt; - символ «<», &gt; - символ «>», &rarr; - символ «
Alt text

Сергей Сторчак

Персональный блог Сергея Сторчака