当前位置: 首页 > article >正文

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


http://www.kler.cn/a/501246.html

相关文章:

  • Mysql--基础篇--约束(主键,外键,唯一,检查,枚举及复合约束等)
  • 模拟SpringIOCAOP
  • Spring Boot中的依赖注入是如何工作
  • 《DOM NodeList》
  • 在 WSL 中使用 Jupyter Notebook 的 TensorBoard 启动问题与解决方法
  • Three.js教程015:全面讲解Three.js的UV与应用
  • SpringCloud:gateway分发服务报302,Network Error
  • Rabbit Rocket kafka 怎么实现消息有序消费和延迟消费的
  • css 布局及动画应用(flex+transform+transition+animation)
  • 【Rust】切片类型
  • 【Pandas】pandas Series rtruediv
  • CentOS 和 Ubantu你该用哪个
  • 微信小程序mp3音频播放组件,仅需传入url即可
  • C++:string
  • 鸿蒙UI(ArkUI-方舟UI框架)
  • Python爬虫-爬取汽车之家全部汽车品牌的brandid(品牌ID)
  • 在 C# 中使用预处理器指令
  • VB.NET 正则表达式完全指南
  • 机器学习之避免过拟合的验证方法
  • HTML - 其他标签
  • ​​​​​​芯盾时代以数据为核心的车联网业务安全解决方案
  • Unity教程(二十)战斗系统 角色反击
  • 3. ML机器学习
  • 安卓app抓包总结(精)
  • 金山WPS Android面试题及参考答案
  • LLMs之VDB:LanceDB的简介、安装和使用方法、案例应用之详细攻略