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

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

缺陷编号: WooYun-2014-65613

漏洞标题: 微信某示例代码函数使用不当可能会导致第三方厂商躺枪

相关厂商: 腾讯

漏洞作者: 索马里的海贼

提交时间: 2014-06-20 15:40

公开时间: 2014-09-18 15:42

漏洞类型: 默认配置不当

危害等级: 中

自评Rank: 15

漏洞状态: 厂商已经确认

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

Tags标签: 无

3人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

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

简要描述:

起了一个坏头,潜在影响包括最新版discuzx3.2等

详细说明:

从官方下了最新的微信开放平台接入示例文件(php)

http://**.**.**.**/mpres/htmledition/res/wx_sample.zip



wx_sample.php行27

code 区域
$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
//extract post data
if (!empty($postStr)){
$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
$fromUsername = $postObj->FromUserName;
$toUsername = $postObj->ToUserName;
$keyword = trim($postObj->Content)



使用了simplexml_load_string函数来解析post过来的xml 这个函数存在xxe威胁

再来看看权限检查的过程

http://**.**.**.**/wiki/index.php?title=%E6%8E%A5%E5%85%A5%E6%8C%87%E5%8D%97

code 区域
private function checkSignature(){
$signature = $_GET["signature"];
$timestamp = $_GET["timestamp"];
$nonce = $_GET["nonce"];
$token = TOKEN;
$tmpArr = array($token, $timestamp, $nonce);
sort($tmpArr, SORT_STRING);
$tmpStr = implode( $tmpArr );
$tmpStr = sha1( $tmpStr );

if( $tmpStr == $signature ){
return true;
}else{
return false;
}
}
}





code 区域
$tmpArr = array($token, $timestamp, $nonce);



如果TOKEN未初始化 因为$timestamp和$nonce又来自用户提交 所以可以构造出合法的signature绕过函数的检查。



漏洞证明:

http://**.**.**.**/bugs/wooyun-2010-064637

http://**.**.**.**/bugs/wooyun-2010-064678

这两个phpyun的虽然没公开 但根据厂家回复基本能确定就是微信api出的问题



另外最新版discuzx3.2也是 默认安装就带有微信插件,但是未启用。换而言之 未初始化TOKEN。

/source/plugin/wechat/wechat.lib.class.php行153

code 区域
$postdata = file_get_contents("php://input");
if ($postdata) {
if (!$this->_checkSignature()) {
return;
}
$postObj = simplexml_load_string($postdata, 'SimpleXMLElement', LIBXML_NOCDATA);
$postObj = $this->_handlePostObj($postObj);
$this->_activeHook('receiveAllStart', $postObj);



这里先调用了_checkSignature()检查权限,在未初始化状态下,可以用上面说的提交timestamp、nonce和对应的signature绕过检查进入下面的simplexml_load_string

不过很可惜未启用插件的话$hook也一样没初始化 所以_activeHook将找不到对应的class去操作。这里没法形成安全漏洞。不过如果有后台权限可以配置插件的话就另说了。

反正DZ跟你们是一家 就在这说了一样。

修复方案:

慎用simplexml_load_string

检查权限之前判断是否初始化了token



示例代码要用心啊。。人家都是很放心的用你的代码的。

版权声明:转载请注明来源 索马里的海贼@乌云


漏洞回应

厂商回应:

危害等级:低

漏洞Rank:1

确认时间:2014-06-23 16:53

厂商回复:

非常感谢您的报告,问题已着手处理,感谢大家对腾讯业务安全的关注。如果您有任何疑问,欢迎反馈,我们会有专人跟进处理。

最新状态:

暂无


漏洞评价:

对本漏洞信息进行评价,以更好的反馈信息的价值,包括信息客观性,内容是否完整以及是否具备学习价值

漏洞评价(共0人评价):
登陆后才能进行评分

评价

  1. 2014-06-20 16:06 | 疯狗 认证白帽子 ( 实习白帽子 | Rank:44 漏洞数:2 | 阅尽天下漏洞,心中自然无码。)
    0

    挺有想法 挖这个 网上很多示例代码或者现成的类都有可能有问题 一些拿来主意很容易被坑

  2. 2014-06-20 16:52 | 索马里的海贼 ( 普通白帽子 | Rank:264 漏洞数:25 | http://tieba.baidu.com/f?kw=WOW)
    0

    @疯狗 狗哥回来啦?蜜月去哪了?

  3. 2014-09-18 20:17 | sutdy ( 普通白帽子 | Rank:101 漏洞数:35 | 0.0)
    0

    @疯狗 狗哥回来啦?蜜月去哪了?

登录后才能发表评论,请先 登录