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

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

缺陷编号:wooyun-2015-0121049

漏洞标题:74cms 两处二次注入

相关厂商:74c,s.com

漏洞作者: answer

提交时间:2015-06-18 21:12

修复时间:2015-09-22 15:27

公开时间:2015-09-22 15:27

漏洞类型:SQL注射漏洞

危害等级:高

自评Rank:20

漏洞状态:漏洞已经通知厂商但是厂商忽略漏洞

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2015-06-18: 细节已通知厂商并且等待厂商处理中
2015-06-24: 厂商主动忽略漏洞,细节向第三方安全合作伙伴开放
2015-08-18: 细节向核心白帽子及相关领域专家公开
2015-08-28: 细节向普通白帽子公开
2015-09-07: 细节向实习白帽子公开
2015-09-22: 细节向公众公开

简要描述:

rt

详细说明:

漏洞文件:
user/user_download_resume.php 331-356行

elseif ($act=="download_save")
{
$ruser=get_user_info($resumeshow['uid']);
$pms_notice=intval($_GET['pms_notice']);
if($_SESSION['utype']==1){
if ($_CFG['operation_mode']=="2")
{
if ($resumeshow['talent']=='2')
{
if ($setmeal['download_resume_senior']>0 && add_down_resume($id,$_SESSION['uid'],$resumeshow['uid'],$resumeshow['resume_name']))
{
action_user_setmeal($_SESSION['uid'],"download_resume_senior");
$setmeal=get_user_setmeal($_SESSION['uid']);
write_memberslog($_SESSION['uid'],1,9002,$_SESSION['username'],"下载了 {$ruser['username']} 发布的高级简历,还可以下载 {$setmeal['download_resume_senior']} 份高级简历",2,1005,"下载高级简历","1","{$setmeal['download_resume_senior']}");
write_memberslog($_SESSION['uid'],1,4001,$_SESSION['username'],"下载了 {$ruser['username']} 发布的简历");
//站内信
if($pms_notice=='1'){
$company=$db->getone("select id,companyname from ".table('company_profile')." where uid ={$_SESSION['uid']} limit 1");
$resume_url=url_rewrite('QS_resumeshow',array('id'=>$id));
$company_url=url_rewrite('QS_companyshow',array('id'=>$company['id']),false);
$message=$_SESSION['username']."下载了您发布的简历:<a href=\"{$resume_url}\" target=\"_blank\">{$resumeshow['resume_name']}</a>,<a href=\"$company_url\" target=\"_blank\">点击查看公司详情</a>";
write_pmsnotice($resumeshow['uid'],$ruser['username'],$message);
}
exit("ok");
}
}


这里有用到两个函数,write_memberslog和write_pmsnotice.而且都传进了参数 $ruser['username'],而$ruser['username']来自于333行直接查询数据库而来,并且没有做转义操作。若果write_memberslog和write_pmsnotice也没有做出转义,那么久造成了注入。我们跟进这两个函数

function write_memberslog($uid,$utype,$type,$username,$str,$mode,$op_type,$op_type_cn,$op_used,$op_leave)
{
global $db,$online_ip,$ip_address;
$sql = "INSERT INTO ".table('members_log')." (log_uid,log_username,log_utype,log_type,log_addtime,log_ip,log_address,log_value,log_mode,log_op_type,log_op_type_cn,log_op_used,log_op_leave) VALUES ( '{$uid}','{$username}','{$utype}','{$type}', '".time()."','{$online_ip}','{$ip_address}','{$str}','{$mode}','{$op_type}','{$op_type_cn}','{$op_used}','{$op_leave}')";
return $db->query($sql);
}


function write_pmsnotice($touid,$toname,$message){
global $db;
$setsqlarr['message']=trim($message);
$setsqlarr['msgtype']=1;
$setsqlarr['msgtouid']=intval($touid);
$setsqlarr['msgtoname']=trim($toname);
$setsqlarr['dateline']=time();
$setsqlarr['replytime']=time();
$setsqlarr['new']=1;
inserttable(table('pms'),$setsqlarr);
}


可以看见,两个函数对传入的数据都没有做转义。所以造成注入。
下面开始利用

漏洞证明:

这里演示由write_memberslog函数造成的注入,因为write_pmsnotice在它的后面,如果我们前面已的用户名已经注册成恶意字符,后面的的这个函数sql语句会执行不成功,因为插入的字段数目和本身的SQL语句的字段数目不匹配(不知道说清楚没有)
1.首先注册一个企业账号,并且发布一个职位。
2.注册一个普通用户,我们的用户名要注册成:1','1','1',user(),'1','9')#(虽然有全局转义,但是代入数据库之后,会被还原的)。

1-1.png


3.填好一份简历,然后申请刚刚我们发布的那个职位

2-2.png


4.登陆企业账号,来到职位管理的地方,我们点击下载简历

3-3.jpg


5.看看数据库监控语句,成功执行。

4-4.png


顺便看看,write_pmsnotice函数的sql语句

5-5.png


看到没有,还是直接带入语句的,只是因为我们的字段数不匹配,所以不成功执行而已,但确实是注入,所以一并修复哦
6.来到我的账户,

6-6.png


OK ,找到出来的的地方了。

修复方案:

你懂的

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


漏洞回应

厂商回应:

危害等级:无影响厂商忽略

忽略时间:2015-09-22 15:27

厂商回复:

漏洞Rank:15 (WooYun评价)

最新状态:

暂无