php代码审计-文件安全(1)
php代码审计
cnvd梦想cms文件删除漏洞
漏洞描述中说的是Ba*** 存在任意文件删除漏洞
在源码中可以看到在后台中只存在两个ba开头的文件,那漏洞就一定存在于其中之一了
我的思路是直接搜一波删除,在备注中发现back****文件中删除的功能较多,优先审计这边
这边先给出php中删除的函数
在 PHP 中,删除文件的函数主要有以下几种:
1.unlink() 函数:使用 unlink() 函数可以删除指定路径下的文件。例如:
1 |
|
2.rmdir() 函数:使用 rmdir() 函数可以删除指定路径下的空目录。例如:
1 |
|
3.unlink() 和 rmdir() 的结合使用:如果要删除非空目录,则需要先递归地删除目录中的所有文件和子目录,然后再删除该目录本身。可以使用 unlink() 和 rmdir() 的结合使用来实现这个功能。例如:
1 |
|
搜索了一下,发现有四处存在unlink函数,上面三个函数都太大了,先从小的开始分析一波
1 |
|
这段代码看起来是一个 PHP 类中的私有方法,用于删除指定文件名 $filename 所代表的文件。
具体来说,这个方法首先使用 ROOT_PATH 常量拼接出要删除的文件的完整路径,即 ROOT_PATH.’file/back/‘.$filename。然后,使用 file::unLink() 静态方法,调用 PHP 内置的 unlink() 函数来删除该文件。
该函数名为delOne,在本文件中查找那些地方调用了该函数
我们先来看第一个delbackdb函数
1 |
|
这段代码看起来是一个 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文件我们来看一下能不能删掉
http://127.0.0.1:8081/lmxcms1.4/admin.php?m=Backdb&a=delbackdb&filename=../../other/1.txt
再回来看,1.txt已经被删除了
到此这个1day就审计结束了