Bootstrap

第32天:Web开发-PHP应用&文件操作安全&上传下载&任意读取删除&目录遍历&文件包含

#知识点

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即可

;