一、源码地址以及版本http//down.chinaz.com/soft/39353.htm[](https//shs3…
一、源码地址以及版本
http://down.chinaz.com/soft/39353.htm
二、审计工具
Seay源代码审计系统,phpstrom2020.1.3
三、审计步骤
1.利用Seay自动审计功能观察到到一处可能存在任意文件上传漏洞
2.跟进FIle.php代码进行分析,发现在一个move方法里,大致分析下代码,传入参数为一个移动路径,然后验证文件后缀,check()函数验证用户是否登录,验证是否存在同名文件,检查目录是否可写,然后返回FILE对象实例,包括它的路径以及上传对象本身。
public function move($path, $savename = true, $replace = true)
{
// 文件上传失败,捕获错误代码
if (!empty($this->info['error'])) {
$this->error($this->info['error']);
return false;
}
// 检测合法性
if (!$this->isValid()) {
$this->error = 'upload illegal files';
return false;
}
// 验证上传
if (!$this->check()) {
return false;
}
$path = rtrim($path, DS) . DS;
// 文件保存命名规则
$saveName = $this->buildSaveName($savename);
$filename = $path . $saveName;
// 检测目录
if (false === $this->checkPath(dirname($filename))) {
return false;
}
// 不覆盖同名文件
if (!$replace && is_file($filename)) {
$this->error = ['has the same filename: {:filename}', ['filename' => $filename]];
return false;
}
/* 移动文件 */
if ($this->isTest) {
rename($this->filename, $filename);
} elseif (!move_uploaded_file($this->filename, $filename)) {
$this->error = 'upload write error';
return false;
}
// 返回 File 对象实例
$file = new self($filename);
$file->setSaveName($saveName)->setUploadInfo($this->info);
return $file;
}
3.跟进move方法,找到了index.php下有很多方法里使用了该方法,于是逐一定位,发现在pluginlist()处为压缩文件上传以及解压,且方法大致为上传一个压缩文件,放入move方法中获取需要移动到哪个目录,然后进行解压缩到该目录,通过正则匹配压缩内容进行获取插件作者,内容之类的信息返回前端。其中对解压缩的目录访问权限并未设置,可以直接访问,对压缩文件内容也未判断,也就是说可以直接上传带有任意文件的压缩文件,进行上传解压缩,且可以访问。
4.在该插件功能处,发现下方还存在插件删除功能,且未对删除路径参数做任何过滤,可以实现任意文件删除。
四、漏洞复现
1.任意文件上传复现(需要管理员有插件上传功能模块)
1.上传一个test.zip的压缩包,其中test文件夹里有一个phpinfo.php的文件。
2.直接访问网站根目录+plugins/压缩文件夹名字(test)/压缩文件内容(phpinfo.php)
2.任意文件删除复现
1.点击删除抓包。
2.在网站根目录下创建一个testdel的测试文件。
3.修改plugin的文件路径为../testdel,点击放包,成功删除。
4.testdel文件已经删除。
- 本文作者: soufaker
- 本文来源: 奇安信攻防社区
- 原文链接: https://forum.butian.net/share/288
- 版权声明: 除特别声明外,本文各项权利归原文作者和发表平台所有。转载请注明出处!