当前位置:WooYun >> 漏洞信息

漏洞概要 关注数(24) 关注此漏洞

缺陷编号:wooyun-2014-059940

漏洞标题:新浪某界面dom型xss(二)

相关厂商:新浪

漏洞作者: 香草

提交时间:2014-05-08 19:11

修复时间:2014-06-22 19:11

公开时间:2014-06-22 19:11

漏洞类型:xss跨站脚本攻击

危害等级:低

自评Rank:5

漏洞状态:厂商已经确认

漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 [email protected]

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

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


可以加载任意框架,可用作欺骗钓鱼,如图:

_10.jpg

漏洞证明:

可钓鱼:

_10.jpg


加载百度:

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


_11.jpg

修复方案:

修改验证代码为:

function checkDomain(url, allowDomain) {
var reg = new RegExp('^(http|https):\\/\\/([^\\\\/\\\\?#]+\\.)*(' + allowDomain.join('|') + ')(\\/|\\?|#|$)');
return reg.test(url);
}

版权声明:转载请注明来源 香草@乌云


漏洞回应

厂商回应:

危害等级:低

漏洞Rank:4

确认时间:2014-05-09 11:13

厂商回复:

感谢关注新浪安全,马上通知相应开发人员进行处理

最新状态:

暂无