漏洞概要
关注数(24 )
关注此漏洞
漏洞标题:新浪某界面dom型xss(二)
相关厂商:新浪
漏洞作者: 香草
提交时间:2014-05-08 19:11
修复时间:2014-06-22 19:11
公开时间:2014-06-22 19:11
漏洞类型:xss跨站脚本攻击
危害等级:低
自评Rank:5
漏洞状态:厂商已经确认
Tags标签:
无
漏洞详情 披露状态:
2014-05-08: 细节已通知厂商并且等待厂商处理中 2014-05-09: 厂商已经确认,细节仅向厂商公开 2014-05-19: 细节向核心白帽子及相关领域专家公开 2014-05-29: 细节向普通白帽子公开 2014-06-08: 细节向实习白帽子公开 2014-06-22: 细节向公众公开
简要描述: 前两天提交的该界面的一个漏洞,新浪很快就修复了,但是并没有完全修复,另外一处代码也存在问题。(说明,由于乌云会把\替换为\\,所以下文中的\都只有一半)。
详细说明: 为了方便大家分析,我在此先贴出javascript代码:
var par = location.search.substr(1), ary = par.split("${}"); var type = ary[0], src = sinaadToolkit.string.encodeHTML(decodeURIComponent(ary[1])), link = sinaadToolkit.string.encodeHTML(sinaadToolkit.url.ensureURL(decodeURIComponent(ary[2]))), width = parseInt(ary[3], 10) + 'px', height = parseInt(ary[4], 10) + 'px', monitor = ary[5] ? sinaadToolkit.string.encodeHTML(decodeURIComponent(ary[5]).replace(/</g, '').replace(/>/g, '')) : ''; var srcAllowDomain = ['sina\\.com\\.cn','weibo\\.com','sinaimg\\.cn'], urlAllowDomain = ['sina\\.com\\.cn','weibo\\.com','allyes\\.com', 'admaster\\.com\\.cn', 'miaozhen\\.com']; function checkDomain(url, allowDomain) { var reg = new RegExp('^(http|https):\\/\\/([^\\/\\?#]+\\.)*(' + allowDomain.join('|') + ')(\\/|\\?|#|$)'); return reg.test(url); } if ((type === 'flash' || type === 'image' || type === 'adbox') && checkDomain(link, urlAllowDomain) && checkDomain(src, srcAllowDomain)) { document.write(sinaadToolkit.ad.createHTML( type, src, width, height, link, monitor ? monitor.split('|') : [] )); } window.blur();
对于参数链接合法性的检查是通过checkDomain函数进行的。但是此正则表达式有一个很经典的错误:
var reg = new RegExp('^(http|https):\\/\\/([^\\/\\?#]+\\.)*(' + allowDomain.join('|') + ')(\\/|\\?|#|$)');
这个正则的问题在于:
http://www.baidu.com\.sina.com.cn/
是可以匹配成功的,原因是\在javascript里面是转义字符,在正则表达式里面也是转义字符,正确的写法应该是:
var reg = new RegExp('^(http|https):\\/\\/([^\\\\/?#]+\\.)*(' + allowDomain.join('|') + ')(\\/|\\?|#|$)');
根据这段代码 if ((type === 'flash' || type === 'image' || type === 'adbox') 可以看出,type的取值可以是flash,image,adbox三个值之一。 当我们的type是flash的时候,第二次参数(arry[1])src会出现在embed的src里面,但是由于embed模式allowScriptAccess是someDomain也不能执行js。于是我继续测试type为adbox的时候。发现第二个参数会出现在iframe的src里,于是我们构造如下链接,绕过正则表达式过滤:
http://d1.sina.com.cn/litong/zhitou/sinaads/release/pbv5.html?adbox${}http://xxx.xxxx.com\.sina.com.cn/aaa.htm${}http://xx.xxx.com\.sina.com.cn/${}1370${}750${}x\x22
可以加载任意框架,可用作欺骗钓鱼,如图:
漏洞证明: 可钓鱼:
加载百度:
http://d1.sina.com.cn/litong/zhitou/sinaads/release/pbv5.html?adbox${}http://www.baidu.com\.sina.com.cn/aaa.htm${}http://xxx.sina.com.cn/${}1370${}750${}x\x22
修复方案: 修改验证代码为:
function checkDomain(url, allowDomain) { var reg = new RegExp('^(http|https):\\/\\/([^\\\\/\\\\?#]+\\.)*(' + allowDomain.join('|') + ')(\\/|\\?|#|$)'); return reg.test(url); }
版权声明:转载请注明来源 香草 @乌云
漏洞回应 厂商回应: 危害等级:低
漏洞Rank:4
确认时间:2014-05-09 11:13
厂商回复: 感谢关注新浪安全,马上通知相应开发人员进行处理
最新状态: 暂无