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

这篇具有很好参考价值的文章主要介绍了第25天:安全开发-PHP应用&文件管理&包含&写入&删除&下载&上传&遍历&安全。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

第二十五天

第25天:安全开发-PHP应用&文件管理&包含&写入&删除&下载&上传&遍历&安全,小迪安全V2023,安全,php,开发语言,web安全,网络安全,自动化,运维

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

1.文件上传:

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

2.文件删除:

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

3. 文件下载:

修改HTTP头实现文件读取解析下载:文章来源地址https://www.toymoban.com/news/detail-861485.html

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;
}
?>

到了这里,关于第25天:安全开发-PHP应用&文件管理&包含&写入&删除&下载&上传&遍历&安全的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32F429 Discovery开发板应用:实现SPI-SD Card文件写入(搭载FatFS文件系统)

    MCU:STM32F429ZIT6 开发环境:STM32CubeMX+MDK5   外购了一个SPI接口的SD Card模块,想要实现SD卡存储数据的功能。 首先需要打开STM32CubeMX工具。输入开发板MCU对应型号,找到开发板对应封装的MCU型号,双击打开(图中第三)。   此时,双击完后会关闭此界面,然后打开一个新界面。

    2024年02月08日
    浏览(49)
  • PHP包含读文件写文件

    php://filter/read=convert.base64-encode/是编码 http://192.168.246.11/DVWA/vulnerabilities/fi/?page=php://filter/read=convert.base64-encode/resource=x.php ?php @eval($_POST[\\\'chopper\\\']);? 利用包含漏洞所在点,进行读文件,bp抓包后能看到文件的内容 将抓包读取到的文件内容解密 执行netuser命令在bp抓包里面写,构造一

    2024年02月07日
    浏览(42)
  • php://input文件包含

    通过本实验,了解php封装伪协议,掌握php://input文件包含的用法 操作机:kali 靶机:Windows 实验地址:http://靶机ip/exp/include2/input/input2/ 工具:burpsuite 用户名:college 密码:360College php内置又很多内置URL风格的封装为协议,利用这些伪协议可以命令执行等操作。 登录“data和fil

    2024年02月13日
    浏览(34)
  • Python 文件处理指南:打开、读取、写入、追加、创建和删除文件

    文件处理是任何Web应用程序的重要部分。Python有多个用于创建、读取、更新和删除文件的函数。 在Python中处理文件的关键函数是open()函数。open()函数接受两个参数:文件名和模式。 有四种不同的方法(模式)可以打开文件: \\\"r\\\" - 读取 - 默认值。打开一个文件以进行读取,如

    2024年02月05日
    浏览(67)
  • Java 文件处理完全指南:创建、读取、写入和删除文件详细解析

    文件处理是任何应用程序的重要部分。Java 提供了许多用于创建、读取、更新和删除文件的方法。 Java 文件处理 Java 中的文件处理主要通过 java.io 包中的 File 类完成。该类允许我们处理文件,包括创建、读取、写入和删除文件。 要使用 File 类,我们首先需要创建该类的对象,

    2024年03月18日
    浏览(57)
  • 基于php应用的文件管理器eXtplorer部署网站并内网穿透远程访问

    通过互联网传输文件,是互联网最重要的应用之一,无论是网上观看的视频、图片、小说,甚至协同办公和商业文件传递,都是这项应用的延伸。而之前火热一时的云存储概念,就数据存储服务器加互联网传输形成的。不过,云存储接连爆出事故,让公有云存储服务备受质疑

    2024年02月02日
    浏览(51)
  • 第27天:安全开发-PHP应用&TP框架&路由访问&对象操作&内置过滤绕过&核心漏洞

    1.TP框架-开发-配置架构路由MVC模型 参考:https://www.kancloud.cn/manual/thinkphp5_1 配置架构-导入使用 路由访问-URL访问 数据库操作-应用对象 文件上传操作-应用对象 前端页面渲染-MVC模型 1.TP框架-安全-不安全写法版本过滤绕过 1.内置代码写法 不合要求的代码写法-ThinkPHP5-自写 2.框架

    2024年04月25日
    浏览(55)
  • php内置函数-文件包含的函数

    目录 1.include 2.require  3.include_once 4. require_once 可以将别的文件直接引用过来(被引用的文件含有打印代码的话,会直接打印),如果失败了,会返回一条警告,文件会继续执行下去,通常用于动态包含。 如下,我建两个 php 文件,一个写有函数声明的文件,一个函数调用的文

    2024年01月15日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包