分类 代码审计 下的文章

74cms最新版4.1.15任意文件删除

闲逛补天,就喜欢看标题去猜谜语,新鲜的
在文件D:\wamp\www\74cms_v4.1.15\upload\Application\Home\Controller\PersonalController.class.php中的ajax_resume_attach函数

public function ajax_resume_attach(){
    if(false === $resume = $this->_is_resume()) $this->ajaxReturn(0,'简历不存在!');

    $img_mod = M('ResumeImg');
    $data['resume_id'] = $resume['id'];
    $data['uid'] = C('visitor.uid');
    $data['title'] = I('post.title','','trim,badword');
    $data['img'] = I('post.img','','trim,badword');
    $data['id'] = I('post.id',0,'intval');

    if($data['id']==0){
        $count = M('ResumeImg')->where(array('resume_id'=>$resume['id'],'uid'=>C('visitor.uid')))->count('id');
        if($count >= 6) $this->ajaxReturn(0,'简历附件最多只可上传6张!');
    }
    $reg = D('ResumeImg')->save_resume_img($data);
    if($reg['state'])
    {
        D('Resume')->check_resume(C('visitor.uid'),intval($data['resume_id']));//更新简历完成状态
        $this->ajaxReturn(1,'附件添加成功!',$reg['id']);
    }
    $this->ajaxReturn(0,$reg['error']);
}

其中$data['img'] = I('post.img','','trim,badword');会获取img变量,然后带入到

$reg = D('ResumeImg')->save_resume_img($data);

看函数名字,本来以为是直接insert了,结果跟一下SQL语句发现是update,结果只能先在其他地方插数据,再用这个update成install.lock等我们要删除文件的路径。

触发任意文件删除的文件还是在这个文件,在ajax_resume_img_del函数

 public function ajax_resume_img_del(){
    if(IS_POST){
        $img_id = I('request.id',0,'intval');
        !$img_id && $this->ajaxReturn(0,'请选择要删除的图片!');
        $uid = C('visitor.uid');
        $img_mod = M('ResumeImg');
        $row=$img_mod->where(array('id'=>$img_id,'uid'=>$uid))->field('img,resume_id')->find();
        $size = explode(',',C('qscms_resume_img_size'));
        @unlink(C('qscms_attach_path')."photo/".$row['img']);
        foreach ($size as $val) {
            @unlink(C('qscms_attach_path')."photo/{$row['img']}_{$val}x{$val}.jpg");
        }
        if(false === $img_mod->where(array('id'=>$img_id,'uid'=>$uid))->delete()) $this->ajaxReturn(0,'删除失败!');
        //写入会员日志
        write_members_log(C('visitor'),2029,intval($row['resume_id']));
        D('Resume')->check_resume(C('visitor.uid'),intval($row['resume_id']));//更新简历完成状态
        $this->ajaxReturn(1,'删除成功!');
    }else{
        $tip='删除后将无法恢复,您确定要删除该条数据吗?';
        $this->ajax_warning($tip);
    }
}

其中这里

$row=$img_mod->where(array('id'=>$img_id,'uid'=>$uid))->field('img,resume_id')->find();

会获取img字段的值,然后带入到

@unlink(C('qscms_attach_path')."photo/".$row['img']);

这里,进行文件删除
其中上面几个变量id都是可控的,所以无影响

先注册用户,再填写简历,再上传图片,QQ图片20170217150832.pngQQ图片20170217150914.png
再update
QQ图片20170217151025.png

QQ图片20170217151116.png

可以删除了
QQ图片20170217151245.png
可以重装