网站地图    收藏   

主页 > 后端 > 网站安全 >

新浪微博私信处存储型XSS及修复 - 网站安全 - 自

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

[导读] 因为提交,所以提交。详细说明:缺陷文件:http://js.t.sinajs.cn/t4/webim/js/webim.js?v=683ba479e29b6483缺陷代码:1. 微博私信中,点击图片,查看大图时,触发以下事件。bindDomEvent: function() { ......

因为“提交”,所以提交。
详细说明:
缺陷文件:http://js.t.sinajs.cn/t4/webim/js/webim.js?v=683ba479e29b6483
 
缺陷代码:
 
1. 微博私信中,点击图片,查看大图时,触发以下事件。
 
bindDomEvent: function() {
            var o = this;
            f.core.evt.delegatedEvent(this._root).add("wbim_img_preview", "click", 
            function(r) {
                var q = r.el,
                s = q.getAttribute("fid"),
                t = q.getAttribute("preview"),
                p = q.getAttribute("name");
                if (!n) {
                    n = new f.wbim.ui.PreviewBox();
                    n.render(f.E("wbim_box"))
                }
                t && g.fire("previewBox.changeUrl", {
                    src: t,
                    fid: s,
                    name: p
                });
                f.core.evt.stopEvent()
            })
        },
 
 
2. 可以看到, p = q.getAttribute("name"); 取出了图片元素的name属性。然后作为参数传递给了previewBox.changeUrl事件。
 
3. 再看事件被fire时的行为。
 
bindDataEvents: function() {
            var j = this;
            f.add("previewBox.changeUrl", 
            function(k, l) {
                j.show();
                var m = l.src;
                if (j._lastImgUrl && j._lastImgUrl == m) {
                    j.rotation(0)
                } else {
                    if (j.img) {
                        j.boxNode.removeChild(j.img);
                        j.img = null
                    }
                    j.img = document.createElement("img");
                    j.boxNode.appendChild(j.img);
                    j.initArea = {
                        w: j.img.offsetWidth,
                        h: j.img.offsetHeight
                    };
                    j.resetStyle();
                    j.img.src = j._lastImgUrl = m;
                    j.downBT.href = m;
                    j.checkImgSize();
                    j.pictureName.innerHTML = l.name
                }
            });
 
 
其中 function(k,l){ } 为事件回调函数, l 为 步骤1中的
 
{
      src: t,
      fid: s,
      name: p  <-- q.getAttribute("name")
 }
 
 
4. j.pictureName.innerHTML = l.name 这句实际的运行链条是:
 
j.pictureName.innerHTML = l.name = p = q.getAttribute("name")
 
----------------------------------------
 
由于获取图片的name属性后,没有做二次过滤,就直接输出到了innerHTML,从而导致XSS。
 
POC:
 
将一个图片的文件名修改为:baidu_sylogo1.gif#&quot;&lt;img src=1 onerror=alert(document.cookie)&gt;.gif
 
 
 
在WEBIM处的聊天窗口里,上传这个图片并发送。
 
对方点击图片后,即可触发XSS。
 
----------------------------------------
 
代入到上面的缺陷过程走一遍。
 
<img title="图片" alt="baidu_sylogo1.gif#&quot;&lt;img src=1 onerror=alert(document.cookie)&gt;.gif" src="http://vdisk-thumb-1.wcdn.cn/maxsize.191/data.vdisk.me/29995023/6477c6794eecaca3f31c125f7b16b1cad56af0ea?ip=1350836400,172.16.105.125&amp;ssig=reE%2BtbnAoV&amp;Expires=1350835200&amp;KID=sae,l30zoo1wmz&amp;source=209678993" onerror="this.src='http://img.t.sinajs.cn/t4/appstyle/webim/images/file.gif';" action-type="wbim_img_preview" fid="176029019" preview="http://upload.api.weibo.com/2/mss/msget?source=209678993&amp;fid=176029019" name="baidu_sylogo1.gif#&quot;&lt;img src=1 onerror=alert(document.cookie)&gt;.gif">
 
 
p=q.getAttribute("name")= 自动转义("baidu_sylogo1.gif#&quot;&lt;img src=1 onerror=alert(document.cookie)&gt;.gif") = baidu_sylogo1.gif#"<img src=1 onerror=alert(document.cookie)>;.gif 
 
然后.innerHTML=p 就会运行alert(document.cookie)
 
------------------------------------------
 
运行效果如下:
 

 
修复方案:
1. 在取出q.getAttribute("name")后,进行二次过滤,再输出到innerHTML
2. 当然也可以和你们现在这样,把&改为x

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

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

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

添加评论