IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    74cms 两处二次注入

    没穿底裤发表于 2015-10-03 13:00:27
    love 0

    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



沪ICP备19023445号-2号
友情链接