文件删除漏洞

介绍

文件删除漏洞可让攻击者随意删除服务器上的任意或指定文件。

原理

同样是被删除文件的变量用户可控,且没有进行严格的校检,所以导致任意文件删除,再配合目录遍历,删除硬盘上的其他文件。

分析技巧

查找分析文件删除漏洞的方法与上一节“文件读取下载漏洞”的方法相似。对PHP脚本搜索unlink函数,对JavaScript脚本搜索file.deletedeletedelFiledelDir等函数关键词,定位关键位置,再进一步分析关键位置的上下文代码,重点分析是否存在可控文件参数,是否有校验或者校验可绕过。

危害

这个漏洞的危害还是很大的,别人可以删除你电脑上的私密文件等。可能哪天重启服务器发现服务器崩溃了,都有可能是这个漏洞造成的。

另外,许多CMS在安装后会相应生成一个install.lock文件,后期在安装页面时会判断install.lock是否存在,不存在就可覆盖重装。可以利用任意文件删除漏洞导致任意重装覆盖。

文件删除与目录删除函数

unlink() 函数删除文件。若成功,则返回 true,失败则返回 false。

1
2
3
4
5
6
7
8
9
10
<?php
header("Content-Type:text/html;charset=utf-8");
$filename = $_GET['file'];
if(file_exists($filename)){
unlink($filename);
echo "<script>alert('删除成功')</script>";
}else{
echo "<script>alert('删除失败')</script>";
}
?>

payload:

  • delFile.php?file=../install/install.lock
  • delFile.php?file=file:///var/www/html/install/install.lock

rmdir() 函数

rmdir() 函数删除空的目录。若成功,则该函数返回 true。若失败,则返回 false。

注意,目录必须为空

1
2
3
4
5
6
7
8
9
10
<?php
header("Content-Type:text/html;charset=utf-8");
$dirname = $_GET['dir'];
if(file_exists($dirname) && is_dir($dirname)){
rmdir($dirname);
echo "<script>alert('删除成功')</script>";
}else{
echo "<script>alert('删除失败')</script>";
}
?>

payload:

  • delFile.php?file=../install/test/

漏洞防御修复

  • 过滤 . 点,使用户在url中不能回溯上级目录
  • php.ini配置open_basedir限定文件访问范围
  • 正则严格判断用户输入的参数

参考资料