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')#(虽然有全局转义,但是代入数据库之后,会被还原的)。
3.填好一份简历,然后申请刚刚我们发布的那个职位
4.登陆企业账号,来到职位管理的地方,我们点击下载简历
5.看看数据库监控语句,成功执行。
看到没有,还是直接带入语句的,只是因为我们的字段数不匹配,所以不成功执行而已,但确实是注入,所以一并修复哦
6.来到我的账户,
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论