第25天:安全开发-PHP应用文件管理包含写入删除下载上传遍历安全

第二十五天

Untitled

一、PHP文件管理-下载&删除功能实现

1.文件上传:

  1. 无过滤机制
  2. 黑名单过滤机制
  3. 白名单过滤机制
  4. 文件类型过滤机制

2.文件删除:

  1. unlink() 文件删除函数
  2. 调用命令删除:system shell_exec exec等

3. 文件下载:

修改HTTP头实现文件读取解析下载:

header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename="");
header("Content-Length: " . filesize($file));
readfile($file);

二、PHP文件管理-编辑&包含功能实现

1.文件包含:

include() 在错误发生后脚本继续执行
require() 在错误发生后脚本停止执行
include_once() 如果已经包含,则不再执行
require_once() 如果已经包含,则不再执行

2.架构:

  1. 上传至服务器本身的存储磁盘(源码在一起)
  2. 云产品OSS存储对象去存储文件(泄漏安全)
  3. 把文件上传到其他域名,如:www.xiaodi8.com->upload.xiaodi8.com
$_FILES:PHP中一个预定义的超全局变量,用于在上传文件时从客户端接收文件,并将其保存到服务器上。它是一个包含上传文件信息的数组,包括文件名、类型、大小、临时文件名等信息。
$_FILES["表单值"]["name"] 获取上传文件原始名称
$_FILES["表单值"]["type"] 获取上传文件MIME类型
$_FILES["表单值"]["size"] 获取上传文件字节单位大小
$_FILES["表单值"]["tmp_name"] 获取上传的临时副本文件名
$_FILES["表单值"]["error"] 获取上传时发生的错误代码
move_uploaded_file() 将上传的文件移动到指定位置的函数

3.文件显示:

  1. 打开目录读取文件列表
  2. 递归循环读取文件列表
  3. 判断是文件还是文件夹
  4. PHP.INI目录访问控制
is_dir() 函数用于检查指定的路径是否是一个目录
opendir() 函数用于打开指定的目录,返回句柄,用来读取目录中的文件和子目录
readdir() 函数用于从打开的目录句柄中读取目录中的文件和子目录
open_basedir:PHP.INI中的设置用来控制脚本程序访问目录
ini_set('open_basedir',__DIR__); 设置配置文件中,只能访问本目录

4.文件编辑:

  1. file_get_contents() 读取文件内容
  2. fopen() fread() 文件打开读入

5.安全问题

  1. 打开upload.js文件可能会泄露accessid和accesskey,如果有这两个东西,就可以使用OSS浏览器进行访问
  2. 两个漏洞核心第一是可以控制的值,二是使用了什么函数去调用这个值。使用了包含文件的函数就是包含文件漏洞,使用了文件上传的函数就是文件上传漏洞,以此类推
  3. 如果命令无回显,可以使用带外回显的方式来确认命令是否执行成功。例:del 1.txt || ping 127.0.0.1

三、环境复现

1.文件显示

<?php
// 获取路径参数,如果未提供则默认为当前目录
$path = $_GET['path'] ?? './';// 定义获取文件列表的函数
function getlist($path) {// 打开目录句柄$hd = opendir($path);// 初始化文件列表数组$list = array();// 循环读取目录中的文件名while (($file_name = readdir($hd)) !== false) {// 排除当前目录和父目录if ($file_name != '.' && $file_name != '..') {// 构建文件完整路径$file_path = "$path/$file_name";// 获取文件类型$file_type = filetype($file_path);// 输出文件类型echo $file_type;// 将文件信息存入列表数组$list[$file_type][] = array('file_name' => $file_name,          // 文件名存储键值'file_path' => $file_path,          // 文件路径存储键值'file_size' => round(filesize($file_path) / 1024),  // 通过换算文件大小存储键值'file_time' => date('Y/m/d H:i:s', filemtime($file_path)) // 获取文件时间并存储键值); // Ending bracket for array declaration} // Ending bracket for if statement} // Ending bracket for while loop// 关闭目录句柄closedir($hd);// 返回文件列表数组return $list;
}// 调用函数获取文件列表
$list = getlist($path);
?>
<?php if (isset($list['dir']) && is_array($list['dir'])): ?>
<?php foreach ($list['dir'] as $v): ?><!-- 开始循环输出文件夹目录行 --><tr><td><img src="./img/list.png" width="20" height="20"></td><!-- 显示目录图标 --><td><?php echo $v['file_name']?></td><!-- 输出文件夹名 --><td><?php echo $v['file_time']?></td><!-- 输出文件夹修改时间 --><td>-</td><!-- 占位符,因为目录没有文件大小 --><td><?php echo $v['file_path']?></td><!-- 输出文件夹路径 --><td><a href="?path=<?php echo $v['file_path']?>">打开</a></td><!-- 在表格中创建“打开”链接,链接到目录的路径 --></tr><!-- 结束循环输出目录行 -->
<?php endforeach;?>
<?php endif; ?><?php if (isset($list['file']) && is_array($list['file'])): ?>
<?php foreach ($list['file'] as $v): ?><!-- 开始循环输出文件行 --><tr><td><img src="./img/file.png" width="20" height="20"></td><!-- 显示文件图标 --><td><?php echo $v['file_name']?></td><!-- 输出文件名 --><td><?php echo $v['file_time']?></td><!-- 输出文件修改时间 --><td><?php echo $v['file_size']?> KB</td><!-- 输出文件大小 --><td><?php echo $v['file_path']?></td><!-- 输出文件路径 --><td><a href="?a=edit&path=<?php echo $v['file_path']?>">编辑</a><!-- 创建编辑链接 --><a href="?a=down&path=<?php echo $v['file_path']?>">下载</a><!-- 创建下载链接 --><a href="?a=del&path=<?php echo $v['file_path']?>">删除</a><!-- 创建删除链接 --></td></tr><!-- 结束循环输出文件行 -->
<?php endforeach; ?>
<?php endif; ?>

2.文件下载

<?php
// 接受方法 判断是怎么操作
switch ($action){case 'del':unlink($file);// 如果操作为删除,则调用unlink函数删除指定文件break;case 'down':header("Content-Type: application/octet-stream");// 设置响应内容的类型为二进制流,告知浏览器这是一个文件下载header("Content-Disposition: attachment; filename=\"" . $file . "\"");// 设置浏览器提示下载,并指定下载文件的名称(使用 $file 变量)header("Content-Length: " . filesize($file));// 设置响应内容的长度为文件大小,告知浏览器文件的实际大小readfile($file);// 读取并输出文件内容,将文件内容发送给浏览器break;
}
?>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/639965.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python3--lxml pytoml.core.TomlError expected_equals报错解决

文章目录 一、问题二. 解决方法&#xff1a;三. 参考&#xff1a;四. 总结 一、问题 在ubuntu的armbian上的python3中安装lxml时报错了 安装命令是 pip3 install lxml报错简略信息如下图 File "/usr/share/python-wheels/pytoml-0.1.2-py2.py3-none-any.whl/pytoml/par…

Linux debian gdb dump

1.开发背景 记录 debian 下应用程序崩溃调试方法 2.开发需求 程序越界可以定位到越界的位置附近 3.开发环境 debian 操作系统&#xff0c;如果不支持需要查看是否存在对应的可执行文件 4.实现步骤 4.1 设置 dump 输出大小 ulimit -c unlimited # 设置输出大小 生成core 文…

稀碎从零算法笔记Day56-LeetCode:组合总和 Ⅳ

题型&#xff1a;DP、数组 链接&#xff1a;377. 组合总和 Ⅳ - 力扣&#xff08;LeetCode&#xff09; 来源&#xff1a;LeetCode 题目描述 给你一个由 不同 整数组成的数组 nums &#xff0c;和一个目标整数 target 。请你从 nums 中找出并返回总和为 target 的元素组合的…

Qt中的Qmainwindow和Qwidget区别

Qmainwindow是有菜单栏的&#xff0c;如图 Qwidget是没有菜单栏的&#xff0c;如图

《网络安全-frida初探-付费应用简单逆向》

文章目录 一、目标应用二、分析流程声明文章仅供学习参考,严禁非法使用,如非法使用,而导致的一切后果,由使用者自负 一、目标应用 aHR0cHMlM0EvL3d3dy53YW5kb3VqaWEuY29tL2FwcHMvODI4NjIxMy9oaXN0b3J5X3Y5 二、分析流程 反编译apk查看相关信息 功能使用的通过该处判断的需…

C# 窗体应用程序 Chart控件显示实时曲线

IDE: VS2019 项目模板&#xff1a;C# windows 窗体应用(.NET Framework) 【参考】 B站上教程C#Chart控件画折线图的使用&#xff0c;关于Chart控件的属性&#xff0c;介绍得非常详细。B站上教程C#上位机Chart控件实时曲线终极讲解&#xff0c;对鼠标滚轮事件等&#xff0c;多…

今日arXiv最热NLP大模型论文:浙江大学:蒸一蒸,多Agent变成单一模型,效果更好

“团结就是力量”&#xff0c;面对复杂多变的现实环境&#xff0c;multi-agent应运而生。相较于单打独斗的single-agent&#xff0c;multi-agent集结了多个功能各异的LLM&#xff0c;共同攻克难关。然而&#xff0c;这种协同作战的方式也带来了沉重的推理负担&#xff0c;限制了…

【GDAL-Python】3-在Python中使用GDAL处理数字高程模型DEM

文章目录 1-介绍1.1 主要内容1.2 坡度、坡向、山体阴影 2-代码实现2.1 数据介绍2.2 代码实现2.3 效果显示 3.参考资料3.1 使用richdem库中的TerrainAttribute计算坡度、坡向、山体阴影 1-介绍 1.1 主要内容 &#xff08;1&#xff09;教程内容&#xff1a;使用GDAL处理数字高…

20240422,C++文件操作

停电一天之后&#xff0c;今天还有什么理由不学习呜呜……还是没怎么学习 一&#xff0c;文件操作 文件操作可以将数据持久化&#xff0c;对文件操作时须包含头文件<fstream> 两种文件类型&#xff1a;文本文件&#xff1a;文件以文本的ASCII码形式存储&#xff1b;二进…

Oracle21C 引入HR实例(linux)

1、下载资源 https://github.com/oracle-samples/db-sample-schemas点击code&#xff08;代码&#xff09;下载 2、上传Sql文件 解压之后将human_resources里的文件复制到demo\schema\目录&#xff08;具体目录前面的路径是你安装的路径&#xff09;下&#xff0c;如下图 3、…

李廉洋:4.23黄金休市之后大幅下跌,原油小幅度上涨。走势分析!

今年以来推动金价上涨的因素是亚洲的需求&#xff0c;很可能来自各国央行。最近又有零售买盘和一些金融买盘作为补充。目前的问题是&#xff0c;不断上升的债券收益率正在争夺资金。美国2年期国债的收益率接近5%&#xff0c;在美联储降息导致收益率开始下降之前&#xff0c;这仍…

软件公司:饥一顿饱一顿,咋办?试一试外部柔性产能。

有人开玩笑&#xff0c;软件公司最理想状态就是&#xff1a;项目来了&#xff0c;公司有足够的人力消化产能&#xff1b;项目没了&#xff0c;人员都走了&#xff0c;不会造成产能搁置。 以上是个理想状态&#xff0c;事实上单纯依靠一个公司是做不到的&#xff0c;所以一定建立…