前言
作者:Ho1aAs
博客:https://blog.csdn.net/xxy605
一、漏洞演示
进入后台,选择插件
新建一个php文件,写入一句话木马,压缩成zip,点击插件上传
访问http://URL/application/plugins/a.php
,上传成功
二、漏洞分析
在上传界面抓个包,提供上传功能在/application/admin/controller/Index.php
public function uploadplugin()
{
$this->checkPermissions(3);
$file = request()->file('file');
$validate = [
'ext' => 'zip'
];
$file->validate($validate);
$tmpdir = ROOT_PATH . 'runtime' . DS . 'plugins';
$this->delFolder($tmpdir);
$info = $file->move($tmpdir, '');
if($info){
$fileName = $info->getSaveName();
$tmpFile = $tmpdir . DS . $fileName;
if(is_file($tmpFile)){
try{
$zip = new \ZipArchive();
if($zip->open($tmpFile, \ZipArchive::OVERWRITE || \ZIPARCHIVE::CREATE) === true){
$zip->extractTo(APP_PATH . 'plugins');
$zip->close();
echo 'ok';
}
else{
echo Lang::get('The uploaded zip file is not available');
}
}
catch(\Exception $e){
echo Lang::get('Upload failed');
}
}
if(is_file($tmpFile)){
@unlink($tmpFile);
}
}
else{
echo $file->getError();
}
exit();
}
首先确认了是否有上传权限,接着就调用try解压压缩包,这里只对是否是压缩包进行了检测,即检测后缀名,**而未检查其中的内容,**之后就是正常的解压,存入/application/plugins/
,访问即可
三、利用
任意文件压缩成zip上传
四、修复
增加对上传非插件文件的处理函数
五、总结
由于以下问题导致该漏洞的产生:
- 没有对非插件文件的判断
- 缺失必要的安全过滤