74cms 两处二次注入

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

发表评论