about utf7-BOM string injection

在一次和大牛Mario Heiderich的交流中,他问我知不知道“+/v8”,那时候我对这个一无所知,于是他就发我大牛Gareth Heyes的一paper《XSS Lightsabre techniques》,在ppt的34页里:

CSS expressions with UTF-7
• UTF-7 BOM character can force UTF-7 in a external style sheet
• Would you let me upload a style sheet?
• @charset „UTF-7‟; works
• But you don‟t need it
• +/v8 is all you need
+/v8
body {
font-family:
+AHgAJwA7AHgAcwBzADoAZQB4AHAAcgBlAHMAcwBpAG8AbgAoAGEAbA
BlAHIAdAAoADEAKQApADsAZgBvAG4AdAAtAGYAYQBtAGkAbAB5ADoAJw-;
}

于是我知道了“+/v8” :)于是就想到利用这个可以很好的xss百度空间,就有了用ie访问我的blog就弹框“/Happy New Year! thx mario./”的效果了!!

这个利用基本上还是Gareth Heyes的ppt里提到的攻击原型,那么还有那些地方可以利用呢?经过测试在开头为UTF-7 BOM character的html在ie访问下自动转为UTF-7,只要我们可以控制文件的开头的几个字节,那么我就有可能通过过注射UTF-7 BOM character来进行xss了。到这里很自然的想到json callback里,立即用《Cross Site Scripting mhtml-file string injection》里的列子测试一下:

?icode=enQCgQKJTDs&callback=%2B%2Fv8%20%2BADwAaAB0AG0APgA8AGIAbwBkAHkAPgA8AHMAYwByAGkAcAB0AD4AYQBsAGUAcgB0ACgAM

QApADsAPAAvAHMAYwByAGkAcAB0AD4APAAvAGIAbwBkAHkAPgA8AC8AaAB0AG0APg-%20xsadas

很完美! :)赶快用google搜索一把 ...

于是“heige(@hi_heige) 呵呵,又一个跨片全世界的 xss利用方式”诞生了,可惜没有找到google可利用的地方[我的美金阿~~]。那在hi群里调戏各大甲方的朋友好了,于是就有里linx牛的blog文《IE是怎么处理meta steam的编码的  && 那100+个xss》分析的很透彻,还纠正了我的一个错误 很cool!

至于防御的问题,对于json的问题可以参考我以前blog文:《不要忘记数据本身的解析》:

那么解决这个问题的方案有2点:
   1. 严格控制数据文件,返回的Content-Type。
   2. 数据存储时,使用编码。

当时甲方的朋友们看到json里直接插入html标签进行xss后,都基本所用了“2. 数据存储时,使用编码”了,而且没有去限制“Content-Type”,基本很在继续的“text/html”,这个也为这次的utf7-BOM string injection埋下了罪恶种子,如果这次再不修改Content-Type,我想有可能种子还有机会发芽开花!! :) 我想如果上面的2点方案同时用上,应该是一个不错的选择。

对于可以自己定义style sheet的地方,目前只有采用过滤的办法了或者定义css文件的开始的字节。因为这时候你指定的charset是不靠谱的! 在这个角度上来说,这个应该属于ie的问题。我尝试联系过ms的官方,可惜:

Delivery to the following recipient failed permanently:

    security@microsoft.com

Technical details of permanent failure:
Google tried to deliver your message, but it was rejected by the recipient domain. We recommend contacting the other email provider for further information about the cause of this error. The error that the other server returned was: 550 550 5.4.1 security@microsoft.com: Recipient address rejected: Access Denied (state 14).

通过上面的分析,utf7-BOM string injection的利用的主要意义在于bypass filter,比如百度空间对于“expression”等关键词都是采用暴力的态度的! 说到bypass filter我们应该提一下ie8的ie8 xss filter,所以我们也可以这样提:“bypass ie8 xss filter using utf7-BOM string injection”


另外要提到的一个问题,utf7遇到bom自动转码的问题,不仅仅存在于ie,也存在于其他的应用程序里,如下图:

about utf7


最后提一下这个漏洞在xss worm上的利用,在我以前的blog文里《About Xss Worm》提到的"实现多域或者说无域的worm",这个漏洞方式绝对是一个完美的实现机会!

感谢:
thanks Mario Heiderich for u tell me what is "+/v8" :)
thanks Gareth Heyes for u the nice paper.
还有hi群朋友们的精彩讨论! :)

参考:《Byte order mark》