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

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

缺陷编号: WooYun-2014-64509

漏洞标题: PHPYUN最新版SQL注入及多处越权操作终结篇

相关厂商: php云人才系统

漏洞作者: xfkxfk认证白帽子

提交时间: 2014-06-11 17:40

公开时间: 2014-09-09 17:42

漏洞类型: SQL注射漏洞

危害等级: 高

自评Rank: 15

漏洞状态: 厂商已经确认

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

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

2人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

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

简要描述:

PHPYUN最新版(phpyun_v3.1.0604_gbk)SQL注入及多处越权操作
虽然PHPYUN在注入防御上已经做得很不错了,方的很严格,像吃掉引号,宽字节的基本上很少了,但是不需要跟引号斗争的地方还有很多,得好好检查,好好修复了!!!
越权方面做的也很不错了,有些是因为SQL注入引起,有些是你们忘了加thins->uid的限制,这里再来一处前台SQL注入及多处越权操作,还有后台大面积的注入(给出文件,厂商自行修复)!!!

详细说明:

第一处SQL注入漏洞及越权操作

文件/model/ajax.class.php:

code 区域
function Refresh_job_action()
{
$num=count($_POST['ids']);
$statis=$this->obj->DB_select_once("company_statis","`uid`='".$this->uid."'");
if($statis['vip_etime']<time())
{
if($statis['breakjob_num']>=$num)
{
$value="`breakjob_num`=`breakjob_num`-$num";
}else{
if($this->config['com_integral_online']=="1")
{
$integral=$this->config['integral_jobefresh']*($num-$statis['breakjob_num']);
if($statis['integral']<$integral)
{
echo "会员刷新职位数,和".$this->config['integral_pricename']."不足!";die;
}else{
$value="`breakjob_num`='0',`integral`=`integral`-$integral";
}
}else{
echo "会员刷新职位数不足!";die;
}
}
$this->obj->DB_update_all("company_statis",$value,"`uid`='".$this->uid."'");
}
echo $_POST['ids'];
$ids=@implode(",",$_POST['ids']);
echo $ids;
$nid=$this->obj->DB_update_all("company_job","`lastupdate`='".time()."'","`id` in (".$ids.") and `uid`='".$this->uid."'");
$this->obj->DB_update_all("company","`jobtime`='".$_POST['lastupdate']."'","`uid`='".$this->uid."'");
if($nid)
{
echo 1;die;
}else{
echo "刷新失败!";die;
}
}



这里$ids=@implode(",",$_POST['ids']);

然后没有经过引号的保护,直接进入了SQL语句DB_update_all中,导致注入了。

然后通过截断后面的uid,就可以update任意uid用户的职位信息了,当然这里的update的内容无足轻重!



下面的越权操作基本上都是因为在update或者insertinto时,没有控制此次操作时候的用户属性this->uid,而且使uid可控,导致update或者insertinto任意用户的内容。

第二处越权操作

文件/model/ajax.class.php:

code 区域
function atn_company_action(){
if((int)$_POST['id']>0){
if($this->uid){
if($_COOKIE["usertype"]!='1'){
echo '4';die;
}
$atninfo = $this->obj->DB_select_once("atn","`uid`='".$this->uid."' AND `sc_uid`='".intval($_POST["id"])."'");
$comurl = $this->config['sy_weburl']."/company/index.php?id=".$_POST["id"];
$company=$this->obj->DB_select_once("company","`uid`='".(int)$_POST['id']."'","`name`");
$name = $company['name'];
if(is_array($atninfo)&&$atninfo){
$this->obj->DB_delete_all("atn","`uid`='".$this->uid."' AND `sc_uid`='".intval($_POST['id'])."'");
$this->obj->DB_update_all('company',"`ant_num`=`ant_num`-1","`uid`='".(int)$_POST['id']."'");
echo "2";die;
}else{
$this->obj->DB_insert_once("atn","`uid`='".$this->uid."',`sc_uid`='".intval($_POST['id'])."',`usertype`='".$_COOKIE["usertype"]."',`sc_usertype`='2',`time`='".time()."'");
$this->obj->DB_update_all('company',"`ant_num`=`ant_num`+1","`uid`='".(int)$_POST['id']."'");
$content="关注了<a href=\"".$comurl."\">".$name."</a>";
$this->addstate($content,2);
$msg_content = "用户 ".$this->username." 关注了你!";
$this->automsg($msg_content,(int)$_POST['id']);
echo "1";die;
}
}else{
echo "3";die;
}
}
}



这里的DB_update_all时,uid=$_POST['id'],用户可控导致越权update。



第三处越权操作

文件/model/ajax.class.php:

code 区域
function Atn_action(){
......
if(is_array($atninfo)&&!empty($atninfo)){
$this->obj->DB_delete_all("atn","`uid`='".$this->uid."' AND `sc_uid`='".intval($_POST['id'])."'");
$this->obj->DB_update_all($table,"`ant_num`=`ant_num`-1","`uid`='".(int)$_POST['id']."'");
echo "2";die;
}else{
$this->obj->DB_insert_once("atn","`uid`='".$this->uid."',`sc_uid`='".intval($_POST['id'])."',`usertype`='".$_COOKIE['usertype']."',`sc_usertype`='".$user['usertype']."',`time`='".time()."'");
$this->obj->DB_update_all($table,"`ant_num`=`ant_num`+1","`uid`='".(int)$_POST['id']."'");



这里的DB_update_all时,uid=$_POST['id'],用户可控导致越权update。



第四处越权

文件/model/ajax.class.php:

code 区域
function order_type_action(){
if($this->uid && $this->username && $_COOKIE['usertype']==2)
{
$nid=$this->obj->DB_update_all("company_order","`order_type`='".(int)$_POST['paytype']."'","`order_id`='".(int)$_POST['order']."'");
echo $nid?1:2;
}
}



这里的DB_update_all用户订单时,没有控制uid,而是通过仅有的order_id来更新,导致越权update,而这里的order_id是可以简单得到的。



第五处越权

文件/wap/member/com.class.php

code 区域
function job_action()
{
if($_GET['status'])
{
$this->obj->update_once('company_job',array('status'=>intval($_GET['status'])),array('id'=>intval($_GET['id'])));
$this->wapheader('index.php?c=job&','设置成功!');
}
$urlarr=array("c"=>"job","page"=>"{{page}}");
$pageurl=$this->url("index","index",$urlarr);
$this->get_page("company_job","`uid`='".$this->uid."'",$pageurl,"10");
$this->waptpl('job');
}



这里在更新企业用户职位信息时,没有控制用户uid,直接通过职位信息的id进行update,导致越权操作,更新任意职位信息。

漏洞证明:

0.png



SQL执行记录:

1.png





后台大面积注入,给出文件,厂商修复下吧:

2.png



3.png



当然还有很多其他的。

修复方案:

1、越权的加上uid=this->uid

2、注入的加上引号包含

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


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:20

确认时间:2014-06-11 17:43

厂商回复:

感谢支持,我们会尽快完善!

最新状态:

暂无


漏洞评价:

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

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

评价

  1. 2014-06-15 23:29 | 小人物Reno ( 普通白帽子 | Rank:482 漏洞数:117 | X)
    0

    已被你刷烂!求带!

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