好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

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

因为[提交],所以提交。

详细说明:

 

缺陷代码:

 

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

查看更多关于新浪微博私信处存储型XSS及修复 - 网站安全 - 自的详细内容...

  阅读:48次