事情是这样的,在某次省hw的时候,对目标进行打点的时候,发现ip下存在四个域名,在一个域名中发现了beifen.zip文件,而网址的功能是一个社区类型的网址。
下载后打开,发现是程序的源码,sql文件都在里面。
找程序中找到的数据库的ip、账号、密码等信息,试试能不能连接。
审计源码,发现漏洞
既然连接不上,那么只能审计一下源码了,先拿工具扫一下。
经过查看,发现/application/index/controller/system/SystemUpgradeclient.php中的setcopydel方法可以任意提交参数。
可以看到以post方式接收了俩个参数,一个是id,一个是ids
if (is_array($post['ids'])) { foreach ($post['ids'] as $file) { $fileservice->del_dir(ROOT_PATH . 'public' . DS . 'copyfile' . $file); } } if ($post['id']) { $copyFile = ROOT_PATH . 'public' . DS . 'copyfile' . $post['id']; // echo $copyFile;exit; $fileservice->del_file($copyFile); }
ids是需要数组的,然后拼接路径,传入$fileservice->del_dir()方法中。id没有类型判断,直接拼接路径传入$fileservice->del_file()方法中。那来看看这俩个方法中做了什么事情。$fileservice->del_dir()方法是删除目录
删除目录,看来这是一个任意文件删除漏洞,分析下源码。
static function del_dir($dirName) { if (!file_exists($dirName)) # 判断文件或目录是否存在,不存在就返回false { return false; } $dir = opendir($dirName); # 打开一个目录,读取它的内容 while ($fileName = readdir($dir)) { $file = $dirName . '/' . $fileName; if ($fileName != '.' && $fileName != '..') { if (is_dir($file)) # 判断是不是目录,是目录就在调用一次本身方法 { self::del_dir($file); } else { unlink($file); # 删除文件 } } } closedir($dir); return rmdir($dirName); # 删除目录 }
$fileservice->del_file()方法是删除文件
这就没有什么好说的了,判断文件是否存在,然后删除。但是,这是hw啊,这漏洞什么用都没有啊,只能继续找其他漏洞了。
经过漫长的查找终于在applicationadmincontrollersettingSystemConfig.php中的发现了view_upload上传的方法。