初次接触PHP代码审计,靠自己的眼神审到第一个垃圾洞还是有点小激动...
执行删除功能的链接:
http://127.0.0.1/bluecms_v1.6_sp1/uploads/admin/database.php?act=del&file_name=test.txt
需要登录后台
先分析一下代码:
act参数:
删除功能实现代码:
当act参数为del时,进行删除备份文件操作。
有一个$_GET['file_name']参数是用户输入,传给$file_name,这里只是做了trim()函数处理,去除字符串首尾处的空白字符,并没有做其他的过滤。
然后下面 BLUE_ROOT.DATA."backup/".$file_name 就是后面要删除文件的路径,使用了拼接的方式,它的意思是删除 主目录下->data->backup 下的文件
然后 后面就执行unlink($file)操作。
这就是整体的一个思路
但是它没有对用户的输入做过滤,也就是$_GET['file_name']是用户可控的,这就造成了 ../ 遍历任意文件删除了
测试:
我在主目录下创建了一个测试文件:test.txt
执行删除的payload:
http://127.0.0.1/bluecms_v1.6_sp1/uploads/admin/database.php?act=del&file_name=../../test.txt
通过../../就可以删除主目录下的test.txt文件
通过遍历就可以删除任意文件。
因为实现这个功能的代码点是 admin 目录下的 database.php 文件,admin目录需要管理员权限,所以需要先登录后台才能进行遍历目录删除文件