原理和之前的《读取已登陆用户163/126 邮件的》(www.wooyun.org/bugs/wooyun-2015-0106908)一样。
存在漏洞的 flash 文件:
http://mail.qq.com/zh_CN/htmledition/swf/uploader1d35b7.swf
其中有个 uploader.UploadSchedule 类开放了 URLLoader 操作的接口,使用自己的 flash 将其反射出来,按照其规范调用,即可访问 crossdomain.xml 中授权了 *.qq.com 的站点。并且请求是 POST 的,使得利用更为顺利。
例如访问 QQ 邮箱。首先获取 SID,这个貌似有多种登录方式,这里以自己为例,访问:http://mail.qq.com/cgi-bin/login?fun=psaread 可获得已登录的 SID。
有了 SID 即可各种操作。访问邮件列表:
http://set1.mail.qq.com/cgi-bin/mail_list?sid={SID}&page=0
访问 QQ 好友列表:
http://set1.mail.qq.com/cgi-bin/laddr_lastlist?sid={SID}&t=addr_datanew&category=hot
发邮件:
http://set1.mail.qq.com/cgi-bin/compose_send?sid={SID}
。。。
自己的 flash:
其中有几个细节:
1.uploader1d35b7.swf 构造函数里用到了 stage 属性,由于被嵌套的 swf 初始化时是没有 stage 的(在 ADD_TO_STAGE 事件之后才有),所以加载这个 flash 时会报错。
但万幸的是,在访问 stage 之前,已经执行了 Security.allowDomain('*'),所以即使主类构造失败,但这个 swf 的权限已经打开,不影响后期利用。(调试模式下报错点继续执行即可)
2.URLLoader 返回是数据默认是字符型的,遇到中文会乱码。因此这里使用 binary 传输,收到后分析页面中 <meta> 指定的编码,再转码成相应的字集,即可避免乱码。
3.UploadSchedule 类没有提供下载完成的回调,因此使用不断轮询的方式,探测是否下载完成。
具体的操控逻辑写在网页里。这里以读取邮件列表为例:
不同的登录方式 sid 的位置也不同,但不少页面里都可以获取到。
