среда, 13 марта 2013 г.

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


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

 

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

Язык разметки гипертекста - основной формат документов, предоставляемых современным браузерам, который произошел от Standard Generalized Markup Language (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-site scripting (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 ищет закрывающую кавычку подстроки где-нибудь в середине: <img src=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)
\0 \x0B \x0C \x20
\0 \x0B \x0C \x20
\x20
\0 \x0B \x0C \x20
\x20 \xA0
\0 \x0B \x0C \x20
\0 \x0B \x0C \x20
Символы принимаются вместо кавычек для HTML-параметров (за исключением ")
' `
' `
'
'
'
'
'
Символы принимаются в имена тегов (за исключением A-Z / ? !)
\0 %
\0 %
нет
нет
\0
нет
нет

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

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

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

Мнемоники в HTML

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

Допустимо три типа записи ссылок-мнемоник:
- в формате &<имя>;, например, &lt; - символ «<», &gt; - символ «>», &rarr; - символ «→»;
- в десятичном коде &#<nn>; с номером соответствующим нужному символу в Unicode, например, &#60; - символ «<», &#8594; - символ «→» и т.д.;
- в шестнадцатеричном коде &#x<nn>; Примеры: &#x3c; - символ «<», &#x2192; - символ «→».

В браузере ссылки-мнемоники декодируются только в значениях параметров и в отдельном тексте между тегами. Они не влияют на общую структуру документа  и не меняют смысла в таких блоках как <SCRIPT>. Возможность понимать и анализировать синтаксис является важным составляющим для правильного понимания значений параметров HTML. Например, как упоминалось в одном из предыдущих разделов, <A HREF="javascript&#09;:alert (1)"> может быть  воспринята как абсолютная ссылка на javascript<TAB>:alert (1) вместо ссылки на строку #09; alert (1), которая находится внутри страницы javascript&.

К сожалению, каждый браузер использует собственный набор правил для обозначения ссылок-мнемоник; все браузерные движки распознают ссылки-мнемоники без разделителя «и допускают длинные ссылки-мнемоники, и дополненные нулями условные символы; употребляется в следующих сочетаниях (таблица №8):
Таблица №8
Описание теста
MSIE7
MSIE8
FF3
Safari
Opera
Chrome
Android
Максимальная длина правильно определенной ссылки-мнемоники, представленной  в десятичном коде
7
7
Максимальная длина неправильно определенной ссылки-мнемоники, представленной  в десятичном коде
7
7
Максимальная длина правильно определенной ссылки-мнемоники, представленной  в шестнадцатеричном коде
6
6
Максимальная длина неправильно определенной ссылки-мнемоники, представленной  в шестнадцатеричном коде
0
0
Имеется ли ссылка-мнемоника со значением  2^32?
(Does entity value wraps around 2^32?)
НЕТ
НЕТ
НЕТ
ДА
НЕТ
ДА
ДА
Символы, разрешенные в формате &<имя>; (за исключением A-Z a-z 0-9)
нет
нет
- .
нет
нет
нет
нет

В движке WebKit после определенной длины ссылки-мнемоники неверно использовались для получения анализа, например, &#000000065; станет последовательностью из трех символов: \x06 5 ;. Эта ошибка уже исправлена. 

Интересная особенность, согласно требованиям кодирования ссылок-мнемоник, такие ссылки как http://example.com/?p1=v1&p2=v2 технически должны быть всегда закодированы в таких HTML-параметрах (но не в JavaScript) как <a href="http://example.com/?p1=v1&amp;p2=v2">Нажмите здесь</a>. Однако на практике веб-разработчики никогда не следовали этой «договоренности», и браузеры  компенсировали это путем обработки недопустимых ссылок-мнемоник как  строки, содержащие литерал &.

Комментариев нет:

Отправить комментарий