第一步 明确需求 再进行漏洞挖掘
明确要挖的漏洞类型:必须getshell,那就只有任意命令执行、任意代码执行等其他漏洞
在ConfigController.class.php有个任意文件上传漏洞:
public function avatar(){
$user = session('user_auth');
if ( IS_POST ) {
$result = array();
$result['success'] = false;
$success_num = 0;
$msg = '上传失败';
//上传目录
$dir = "./Uploads/Avatar/".setavatardir($user['uid']);
// 处理原始图片开始------------------------------------------------------------------------>
//默认的 file 域名称是__source,可在插件配置参数中自定义。参数名:src_field_name
$source_pic = $_FILES["__source"];
$filename = 'avatar_';
//如果在插件中定义可以上传原始图片的话,可在此处理,否则可以忽略。
if ($source_pic){
if ( $source_pic['error'] > 0 ){
$msg .= $source_pic['error'];
}else{
//原始图片的文件名,如果是本地或网络图片为原始文件名、如果是摄像头拍照则为 *FromWebcam.jpg
$sourceFileName = $source_pic["name"];
//原始文件的扩展名(不包含“.”)
$sourceExtendName = substr($sourceFileName, strripos($sourceFileName, "."));
//保存路径
$savePath = $dir."/".$filename."real".$sourceExtendName;
//当前头像基于原图的初始化参数(只有上传原图时才会发送该数据,且发送的方式为POST),用于修改头像时保证界面的视图跟保存头像时一致,提升用户体验度。
//修改头像时设置默认加载的原图url为当前原图url+该参数即可,可直接附加到原图url中储存,不影响图片呈现。
$init_params = $_POST["__initParams"];
$result['sourceUrl'] = $savePath.$init_params;
move_uploaded_file($source_pic["tmp_name"], $savePath);
$success_num++;
}
}
//处理原始图片结束处理头像图片开始
//头像图片(file 域的名称:__avatar1,2,3...)。
$avatars = array("__avatar1", "__avatar2", "__avatar3");
$avatars_length = count($avatars);
for ( $i = 0; $i < $avatars_length; $i++ ){
$avatar = $_FILES[$avatars[$i]];
$avatar_number = $i + 1;
$avatar_name = array(
'1' => 'big',
'2' => 'middle',
'3' => 'small',
);
if ( $avatar['error'] > 0 ){
$msg .= $avatar['error'];
}else{
$savePath = "$dir" .$filename.$avatar_name[$avatar_number]. ".jpg";
$result['avatarUrls'][$i] = $savePath;
move_uploaded_file($avatar["tmp_name"], $savePath);
$success_num++;
}
}
$result['msg'] = $msg;
if ($success_num > 0){
$result['success'] = true;
} //返回图片的保存结果(返回内容为json字符串)
echo json_encode($result);
}else{
$avatar = avatar($user['uid'],'real');
$data = array(
'avatar' => $avatar,
);
$this->assign($data);
$this->display();
}
}
可以看到下面那个是不行的因为不管你上传什么都会给你拼接.jpg后缀,但是通过上面那一串可以看到他在执行下面这行代码的时候就已经把原文件上传了。
然后要找到这个控制器路由:
这个控制器属于User的,User前台已经删了,但是后端代码还能访问:
http://xxxx.com.cn/index.php/User/Config/avatar
当你直接访问这个控制器会报错,让你登录,因为这个功能是需要登录才可以访问的:
所以我们的思路是先注册或者想个其他办法弄个前台用户,然后请求登录接口获取cookie,然后替换cookie在访问这个文件上传功能,但是这里前台页面已经删除了,而且前台的控制器已经关闭了注册,我们可以看看:
继续跟进:
继续跟进:
到这里就结束退出了。所以我们要么寻找其他漏洞,要么找个前台用户,要么找找越权等。
这里我们看看有文件上传的那个控制器:
他是继承UserController,跟进看看这个控制器:
这里可以看到如果uid不存在的话就会登录失败,只要uid存在就可以绕过身份认证,
我们继续跟进看看FrontController控制器的_initialize()方法:
只是做了一个检查,不影响总体功能。
所以我们只要在请求里加一个uid就可以绕过,达到任意文件上传了:
公众号长期更新安全类文章,关注公众号,以便下次轻松查阅
觉得文章对你有帮助 请转发 点赞 收藏