概述
能显示表情图片成了现在的聊天软件必备基本功能,这就需要支持展示富文本的控件。
聊天软件主要用到两种富文本格式:RTF和HTML格式。
RTF可以采用RichEdit、HTML可以选择浏览器内核,比如Windows自带的IE内核。
淘宝旺旺用的就是IE内核作为聊天内容展示区,QQ使用的则是RichEdit。
用浏览器内核作为展示的聊天软件,可能就存在被注入JS的风险。
一年前的帖子:http://topic.csdn.net/u/20100908/23/41ac25c9-3b4c-4b55-b1b7-0903ba23ca7e.html
漏洞早已经修复,现在发出细节,好让大家注意防范。
软件一但在别人的机器了运行,状态就不在你的控制范围。
起因
当时一个朋友在询问我:如何用旺旺自动发送带彩色的文字。
经我分析:输入框是用的是richedit,正好之前做过跨进程访问richedit的探索:http://blog.csdn.net/zswang/article/details/2645555
研究了会发现:展示区是IE内核,字体名可以自由控制,并且也没对字体名进行编码。
确定存在“浏览器内核聊天软件通过字体名注入脚本的漏洞”。
经过
操作系统会提供当前已经安装的字体列表,比如:宋体、黑体、Verdana等等。
这些字体名一般不会出现特殊符号,但通过修改内存、跨进程控制控件的方式可以修改字体名,比如可以添加一个字体名为:“><b>test</b”。
如果展示的代码是:
append("<font name=" + fontname + ">" + htmlencode(context) + "</font>")那么添加到展示区的就是:
如果看到粗体的test,恭喜第一步成功。
但字体名有长度是有限的,旺旺里限制24个字符。
24个字符要写比较复杂的攻击脚本还是挺难。
还好旺旺里一段聊天内容可以支持多个字体,这样就可以拼接在一起,注入理想长度的攻击脚本。
比如:
append("<font name=" + fontname1 + ">" + htmlencode(context1) + "</font>")
append("<font name=" + fontname2 + ">" + htmlencode(context2) + "</font>")fontname1设置为:“><script>/*”
context1设置为:“*/alert('hello');/*”
fontname2设置为“*/</script”
那么添加到展示区的就是:
“<font name=><script>/**/alert('hello');/*</font><font name=*/</script>context2</font>”
结果
找几个小白鼠试了一下,证实攻击有效,向官方报告了漏洞并得到及时的修复。
参见第一个链接。
总结
1、“不要信赖客户端的提交的数据”包括通过系统api获取的数据;
2、展示时,动态拼接的内容都经过编码处理;
3、发现漏洞及时报告,因为你能发现了,别人也能发现,早点修复漏洞避免无辜的人受到损失。