0


第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']??'./';// 定义获取文件列表的函数functiongetlist($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;}?>
标签: 安全 php 开发语言

本文转载自: https://blog.csdn.net/weixin_48613011/article/details/138094603
版权归原作者 CS0_IceCream 所有, 如有侵权,请联系我们删除。

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

还没有评论