1、安全开发-原生PHP-文件安全操作
2、安全开发-原生PHP-上传读取删除包含等
3、安全开发-原生PHP-代码审计文件安全
本质->任意文件读取/删除/修改/上传/下载等漏洞存在的原因->本质上是存在“可控变量”来传递参数->如果过滤不严->这些可控变量原则上可通过../等方式绕过->从而导致可控变量可以是任意目录位置的文件->造成漏洞
一、文件上传->任意文件上传漏洞
$_FILES:PHP中一个预定义的超全局变量,用于在上传文件时从客户端接收文件,并将其保存到服务器上。它是一个包含上传文件信息的数组,包括文件名、类型、大小、临时文件名等信息。
通过以下调用,可使用上传文件信息的数组中的信息,做数据传输
$_FILES["表单值"]["name"] 获取上传文件原始名称
$_FILES["表单值"]["type"] 获取上传文件MIME类型
$_FILES["表单值"]["size"] 获取上传文件字节单位大小
$_FILES["表单值"]["tmp_name"] 获取上传的临时副本文件名
$_FILES["表单值"]["error"] 获取上传时发生的错误代码
move_uploaded_file() 将上传的文件移动到指定位置的函数
二、文件显示(可显示目录结构)->目录遍历漏洞
1.打开目录读取文件列表
2.递归循环读取文件列表
3.判断是文件还是文件夹
4.PHP.INI目录访问控制
is_dir() 函数用于检查指定的路径是否是一个目录
案例1:opendir()+readdir()
opendir() 函数用于打开指定的目录,返回句柄,用来读取目录的文件和子目录
readdir() 函数用于从打开的目录句柄中,读取目录中的文件和子目录
open_basedir:PHP.INI中的设置用来控制脚本程序访问目录
案例2:scandir()
①scandir() 函数返回指定目录中的文件和目录列表,以数组形式返回
ini_set('open_basedir',__DIR__); 设置配置文件中,只能访问本目录
②目录遍历漏洞触发点->下图$path这个变量,如果该变量可以控制,则可以遍历任意目录
三、文件删除->任意文件删除漏洞
1、unlink() 文件删除函数
2、调用系统命令删除:system、shell_exec、exec等
如果文件名可控,则易出现任意文件删除漏洞
四、文件下载->任意文件下载漏洞
修改相应包的HTTP头实现文件读取解析为下载协议->从而实现文件下载
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename=\"" . $file . "\"");
header("Content-Length: " . filesize($file));
readfile($file);
如果文件名可控,则易出现任意文件下载漏洞
五、文件读取->任意文件读取漏洞
1、file_get_contents() 读取文件内容
2、fopen() +fread() 文件打开读入
如果文件名可控,则易出现任意文件读取漏洞
六、文件包含
可利用文件包含执行恶意脚本,前提恶意脚本可以通过1.txt等格式上传成功
include()、require、include_once、require_once等
七、文件管理器案例->直观演示漏洞
包含文件上传、修改、读取、删除等功能
八、代码审计案例
1、Rrzcms遍历读取
https://xz.aliyun.com/t/10932
验证审计出的漏洞点
上图使用../../index.php->为什么知道这个index.php?->这个是我们看代码中有的,所以拿这个文件来验证漏洞->实战中可以用字典来枚举一些常见的文件名来验证漏洞
2、Metinfo文件下载
https://mp.weixin.qq.com/s/te4RG0yl_truE5oZzna3Eg
找到文件下载涉及关键函数->readfile()
漏洞验证:
3、Xhcms文件包含
https://xz.aliyun.com/t/11310
漏洞验证:
为什么此处拼接?r=../1->在文件中include()定位到files/目录下,而1.php在根目录下,所以需要用../向上跳一级;另外include()中是$action.php,所以不需要传参1.php,传参r=../1即可