74cms 两处二次注入

  • A+
所属分类:漏洞时代
摘要

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

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')#(虽然有全局转义,但是代入数据库之后,会被还原的)。
74cms 两处二次注入
3.填好一份简历,然后申请刚刚我们发布的那个职位
74cms 两处二次注入
4.登陆企业账号,来到职位管理的地方,我们点击下载简历
74cms 两处二次注入
5.看看数据库监控语句,成功执行。
74cms 两处二次注入
看到没有,还是直接带入语句的,只是因为我们的字段数不匹配,所以不成功执行而已,但确实是注入,所以一并修复哦
6.来到我的账户,
74cms 两处二次注入

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: