文件遍历上传下载删除编辑包含等

$_FILES:PHP中一个预定义的超全局变量,用于在上传文件时从客户端接收文件,并将其保存到服务器上。它是一个包含上传文件信息的数组,包括文件名、类型、大小、临时文件名等信息。

$_FILES"表单值" 获取上传文件原始名称

$_FILES"表单值" 获取上传文件MIME类型

$_FILES"表单值" 获取上传文件字节单位大小

$_FILES"表单值" 获取上传的临时副本文件名

$_FILES"表单值" 获取上传时发生的错误代码

move_uploaded_file() 将上传的文件移动到指定位置的函数

#文件显示:

1.打开目录读取文件列表

2.递归循环读取文件列表

3.判断是文件还是文件夹

4.PHP.INI目录访问控制

is_dir() 函数用于检查指定的路径是否是一个目录

opendir() 函数用于打开指定的目录,返回句柄,用来读取目录的文件和子目录

readdir() 函数用于从打开的目录句柄中读取目录中的文件和子目录

open_basedir:PHP.INI中的设置用来控制脚本程序访问目录

scandir() 函数返回指定目录中的文件和目录列表,以数组形式返回

ini_set('open_basedir',DIR); 设置配置文件中,只能访问本目录

 scandir 函数遍历目录

用opendir 加 readdir 函数遍历文件目录 用两个“\\” 防止一个\时识别为转义字符

 

#文件删除:

unlink() 文件删除函数

调用命令删除:system shell_exec exec等

 unlink() 函数 1.txt和file.php 在同一级 访问地址后1.txt被删除,输出文件名

用系统命令删除文件

#文件下载:

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

header("Content-Type: application/octet-stream");

header("Content-Disposition: attachment; filename="" . $file . """);

header("Content-Length: " . filesize($file));

readfile($file);

这里正常访问1.php 是可以正常显示内容的

当访问file.php 时就变成下载1.php文件了,这里可以打开f12 查看数据包响应头内容 ,就会出现代码中的那几句修改头参数的值 的内容

#文件读取:

1、file_get_contents() 读取文件内容

2、fopen() fread() 文件打开读入

 右键 点击查看页面源代码

#文件包含:

include、require、include_once、require_once等

直接访问写有php代码的txt文件时,只会讲php代码输出出来,而不会执行

当访问file.php 时,1.txt中的php代码就会被执行

require

include_once

require_once

实践:

让ai写一个文件编辑,下载,读取,删除的功能

<?php
// 设置默认路径
$directory = isset($_GET['dir']) ? $_GET['dir'] : './';
 
// 文件操作
if (isset($_POST['action'])) {
    if ($_POST['action'] == 'create_folder' && !empty($_POST['folder_name'])) {
        // 创建文件夹
        mkdir($directory . '/' . $_POST['folder_name']);
    } elseif ($_POST['action'] == 'delete' && isset($_POST['file'])) {
        // 删除文件或文件夹
        $path = $directory . '/' . $_POST['file'];
        if (is_dir($path)) {
            rmdir($path); // 删除文件夹
        } else {
            unlink($path); // 删除文件
        }
    } elseif ($_POST['action'] == 'rename' && isset($_POST['file']) && isset($_POST['new_name'])) {
        // 重命名文件或文件夹
        rename($directory . '/' . $_POST['file'], $directory . '/' . $_POST['new_name']);
    } elseif ($_POST['action'] == 'save_edit' && isset($_POST['file']) && isset($_POST['file_content'])) {
        // 保存文件内容
        file_put_contents($directory . '/' . $_POST['file'], $_POST['file_content']);
    }
}
 
// 下载文件
if (isset($_GET['download']) && !empty($_GET['download'])) {
    $file = $directory . '/' . $_GET['download'];
    if (file_exists($file)) {
        // 设置下载头
        header('Content-Type: application/octet-stream');
        header('Content-Disposition: attachment; filename="' . basename($file) . '"');
        header('Content-Length: ' . filesize($file));
        readfile($file);
        exit;
    } else {
        echo '文件不存在!';
    }
}
 
// 读取文件内容
$content = '';
if (isset($_GET['read']) && !empty($_GET['read'])) {
    $file = $directory . '/' . $_GET['read'];
    if (file_exists($file)) {
        $content = file_get_contents($file);
    } else {
        $content = '文件不存在!';
    }
}
 
// 列出目录中的文件和文件夹
$files = scandir($directory);
$files = array_diff($files, array('.', '..')); // 排除 . 和 ..
 
?>
 
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>PHP 文件管理器</title>
    <style>
        body {
            font-family: Arial, sans-serif;
        }
        .file-manager {
            max-width: 800px;
            margin: 0 auto;
            padding: 20px;
        }
        table {
            width: 100%;
            border-collapse: collapse;
        }
        th, td {
            padding: 10px;
            border: 1px solid #ddd;
        }
        th {
            text-align: left;
        }
        .action-buttons {
            margin-top: 20px;
        }
        .action-buttons form {
            display: inline-block;
            margin-right: 10px;
        }
        .content-area {
            margin-top: 20px;
        }
        textarea {
            width: 100%;
            height: 300px;
        }
    </style>
</head>
<body>
<div class="file-manager">
    <h2>文件管理器</h2>
    <h3>当前目录:<?php echo $directory; ?></h3>
 
    <!-- 文件和文件夹列表 -->
    <table>
        <thead>
        <tr>
            <th>名称</th>
            <th>类型</th>
            <th>操作</th>
        </tr>
        </thead>
        <tbody>
        <?php foreach ($files as $file): ?>
            <tr>
                <td>
                    <?php if (is_dir($directory . '/' . $file)): ?>
                        <a href="?dir=<?php echo urlencode($directory . '/' . $file); ?>"><?php echo $file; ?>/</a>
                    <?php else: ?>
                        <?php echo $file; ?>
                    <?php endif; ?>
                </td>
                <td><?php echo is_dir($directory . '/' . $file) ? '文件夹' : '文件'; ?></td>
                <td>
                    <!-- 删除操作 -->
                    <form action="" method="POST" style="display:inline;">
                        <input type="hidden" name="action" value="delete">
                        <input type="hidden" name="file" value="<?php echo $file; ?>">
                        <button type="submit" onclick="return confirm('确定要删除此文件吗?');">删除</button>
                    </form>
                    <!-- 下载操作 -->
                    <?php if (!is_dir($directory . '/' . $file)): ?>
                        <a href="?download=<?php echo urlencode($file); ?>">下载</a>
                    <?php endif; ?>
                    <!-- 重命名操作 -->
                    <form action="" method="POST" style="display:inline;">
                        <input type="hidden" name="action" value="rename">
                        <input type="hidden" name="file" value="<?php echo $file; ?>">
                        <input type="text" name="new_name" placeholder="新名称" required>
                        <button type="submit">重命名</button>
                    </form>
                    <!-- 编辑操作 -->
                    <?php if (!is_dir($directory . '/' . $file)): ?>
                        <a href="?read=<?php echo urlencode($file); ?>">编辑</a>
                    <?php endif; ?>
                </td>
            </tr>
        <?php endforeach; ?>
        </tbody>
    </table>
 
    <!-- 创建新文件夹 -->
    <div class="action-buttons">
        <h3>创建新文件夹</h3>
        <form action="" method="POST">
            <input type="hidden" name="action" value="create_folder">
            <input type="text" name="folder_name" placeholder="文件夹名称" required>
            <button type="submit">创建</button>
        </form>
    </div>
 
    <!-- 文件内容区 -->
    <?php if (!empty($content)): ?>
        <div class="content-area">
            <h3>编辑文件</h3>
            <form action="" method="POST">
                <input type="hidden" name="action" value="save_edit">
                <input type="hidden" name="file" value="<?php echo $_GET['read']; ?>">
                <textarea name="file_content"><?php echo htmlspecialchars($content); ?></textarea><br>
                <button type="submit">保存更改</button>
            </form>
        </div>
    <?php endif; ?>
 
</div>
</body>
</html>

效果

点击目录时会进到该目录下,上面会有一个参数,通过修改参数实现跳级 %2F 就是 /

在后面加一个../ 就跳一级,就到了上级目录 这里跳不了盘,可能有限制 这里是文件显示

当点击编辑某个文件时,上面的参数名变了 那这里是不是可以实现对上级文件的编辑呢,从而拿到代码

在这个目录上级中有一个upload.html 文件,这里尝试读取它,发现可以成功读取, 当目标有这个编辑功能时,可以测试一下,黑盒中用fuzz工具去跑文件名,拿到文件名再来测试

删除文件,这里先测试一下,先删除了1.txt 在f12 下的负载中看到delete 字样 ,下面还有一个1.txt,猜想,如果我把1.txt 改成上级目录下的某个文件,是否可以对其进行删除呢?

打开butp 拦截 删除操作数据包 ,将1.txt 修改成../upload.html 然后把数据包放出去,在回到浏览器中点击确认删除,再去上级目录查看一下,upload.html 文件是否被删除了,这里测试是可以删除的

上述测试,可以对任意文件进行修改,删除,读取

#代码审计案例

1、Rrzcms遍历读取

https://xz.aliyun.com/t/10932

先安装一下

这里其实是一个伪静态的页面

登录一下后台页面

进来后找到有关文件的地方,这里演示时虽然是在后台管理员里面操作,但是实战时只要普通用户也有文件操作的功能也可以作为测试点,这里分黑盒和白盒,黑盒就尝试是否可以跳级等等,白盒就直接从代码里面看

黑盒测试

打开burp 拦截数据包,然后修改参数值在放出去

这里看到一个参数 path ,尝试修改它,看是否能跳级

将path值改成 ../ 再放出去,发现不行

白盒中,先按照url找到对应的文件

然后进到文件里面找调用的方法,直接搜索,发现这里是要带 template 如果参数值没有这个就会报错

这里保留template 然后输入,,/index.php 成功读取到上级目录的index.php 文件

2、Metinfo文件下载

任意文件下载+读取+删除

3、Xhcms文件包含

https://xz.aliyun.com/t/11310

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

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

相关文章

系统集成项目管理工程师【第十一章 规划过程组】规划风险应对、规划采购管理篇

系统集成项目管理工程师【第十一章 规划过程组】规划风险应对、规划采购管理篇 一、规划风险应对&#xff1a;为项目穿上"防护衣" 1. 什么是规划风险应对&#xff1f; 规划风险应对是基于风险量化分析结果&#xff0c;制定可选方案、选择应对策略并商定具体行动的过程…

20250813比赛总结

题目T1.volumeT2.storyT3.treeT4.game预计分数6060030实际分数306000T1.volume 确实是暴力&#xff0c;但我是用数组统计每个可能出现的数&#xff0c;于是3AC 3WA 4TLE。拿到全部分应该直接按照题目模拟。 T2.story 暴力dfs&#xff0c;由于忘记优化所以60pts&#xff0c;而且…

适合物流/应急/工业的对讲机,AORO M6 Pro构建高效指挥调度方案

在物流调度、应急救援与工业协同等对通信可靠性要求极高的领域中&#xff0c;专业对讲设备的技术迭代直接关系到任务执行效率与安全保障。AORO M6 Pro对讲机作为新一代融合通信终端&#xff0c;正以多模融合技术与国产化自主创新&#xff0c;为复杂场景下的高效调度提供坚实的技…

类和对象----中

这里写目录标题<font color"#FF00FF">1. 类和对象(中)<font color"#FF00FF">2. 构造函数<font color"#FF00FF">3. 析构函数<font color"#FF00FF">4. 拷⻉构造函数1. 类和对象(中) 类的默认成员函数&#xff1…

CAD 的 C# 开发中,对多段线(封闭多边形)内部的点进行 “一笔连线且不交叉、不出界

本质上是约束条件下的路径规划问题&#xff0c;核心是找到一条连续路径遍历所有点&#xff0c;同时满足&#xff1a; 路径不与自身交叉&#xff1b; 路径全程在多段线&#xff08;多边形&#xff09;内部&#xff1b; 路径连续&#xff08;一笔画&#xff09;。核心思路与算法步…

ZED 2i相机调试

1. 测试 ZED SDK /usr/local/zed/tools/ZED_Diagnostic/usr/local/zed/tools/ZED_Explorer2. 安装SDK How to Install ZED SDK on Linux - Stereolabs 安装命令&#xff1a; sudo apt install zstd./ZED_SDK_Ubuntu20_cuda12.1_tensorrt8.6_v5.0.5.zstd.run

Go语言select并发编程实战指南

一、select作用Go 语言中的 select 语句是处理多通道&#xff08;Channel&#xff09;操作的核心控制结构&#xff0c;专为高效并发通信而设计。通过巧妙运用 select 语句&#xff0c;开发者能够高效实现并发控制、超时处理和非阻塞通信等功能&#xff0c;使其成为 Go 语言并发…

OpenCV常见问题汇总

1、深度拷贝的问题我对整张图像通过裁剪分别进行识别&#xff0c;出现识别结果与期望不同的问题&#xff0c;经过大量排查是OpenCV深度拷贝问题&#xff0c;我原来有问题的写法cv::Mat matCrop matZoom(roi); cv::Mat matCrop1 matCrop(roi1); cv::Mat matCrop2 matCrop(roi2)…

【Unity开发】Unity核心学习(一)

一、2D相关1、图片导入相关设置 &#xff08;1&#xff09;Unity支持的图片格式 支持BMP、TIF、JPG、PNG、TGA、PSD 常用格式具体介绍&#xff1a; JPG&#xff1a;指JPGE格式&#xff0c;属于有损压缩格式&#xff0c;无透明通道 PNG&#xff1a;无损压缩格式&#xff0c;有透…

Python自定义异常类的写法与使用场景

在软件开发的生命周期中&#xff0c;异常处理是保障程序健壮性与可维护性的关键环节。Python作为一门高级编程语言&#xff0c;内置了丰富的异常机制&#xff0c;能够高效、优雅地应对运行时的各种错误。然而&#xff0c;面对复杂业务场景和多层架构时&#xff0c;内置异常往往…

为 Promethus 配置https访问

一、序言 本篇将介绍如何使用数字证书为Promethus 访问提供加密功能&#xff0c;由于是实验环境证书由openssl生成&#xff0c;操作指南来自官网手册&#xff1a;https://prometheus.io/docs/guides/tls-encryption/在生产环境中prometheus可能会放在后端&#xff0c;证书一般配…

摆脱例行 SQL 报表的隐性成本:用 n8n 构建四节点自动化报告流程

例行 SQL 报表的隐藏成本 各类组织的数据团队都面临同样的反复难题:利益相关方需要定期报告,但手工 SQL 报表占用了本可用于分析的宝贵时间。无论公司规模如何,流程几乎一致——连接数据库、执行查询、格式化结果,并将结论分发给决策者。 数据从业者经常要处理并不需要高…

HCIP——OSPF综合实验

一、实验拓扑二、实验要求1、R4为ISP&#xff0c;其上只配置IP地址&#xff1b;R4与其他所直连设备间均使用公有IP&#xff1b; 2、R3-R5、R6、R7为MGRE环境&#xff0c;R3为中心站点&#xff1b; 3、整个OSPF环境IP基于172.16.0.0/16划分&#xff1b;除了R12有两个环回&#x…

GitHub 趋势日报 (2025年08月12日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图1397gpt4all442system-prompts-and-models-of-ai-tools331umami307full-stack-fast…

Linux网络性能调优终极指南:深度解析与实践

Linux网络性能调优终极指南&#xff1a;深度解析与实践 一、性能调优核心原理体系 1.1 数据包生命周期与性能瓶颈 #mermaid-svg-TsvnmiGx1WeTerK2 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-TsvnmiGx1WeTerK2 .…

串口超时参数深度解析:ReadTotalTimeoutMultiplier、ReadIntervalTimeout等

一、参数定义与作用 1.1 ReadIntervalTimeout&#xff08;字符间隔超时&#xff09; 定义&#xff1a;指定两个连续字符到达之间的最大允许时间&#xff08;毫秒&#xff09;作用&#xff1a;当接收两个字符的时间间隔超过该值时&#xff0c;ReadFile操作立即返回已缓冲的数据特…

ubuntu20.04下C++实现点云的多边形区域过滤(2种实现:1、pcl的CropHull滤波器;2、CUDA上实现射线法)

在点云目标检测中&#xff0c;经常会有一系列的误识别&#xff0c;为了减小误识别的概率&#xff0c;可以通过区域过滤来删除不需要的点云&#xff0c;如下图所示 本例中点云的场景为路口交通场景&#xff0c;已经把雷达坐标系的xoy面转换至点云中的地平面&#xff0c;具体原理…

Java 大视界 -- Java 大数据在智能家居场景联动与用户行为模式挖掘中的应用(389)

Java 大视界 -- Java 大数据在智能家居场景联动与用户行为模式挖掘中的应用(389) 引言: 正文: 一、传统智能家居的 “剧本困境”:按流程走,不管人需 1.1 设备与用户的 “理解差” 1.1.1 场景联动 “太机械” 1.1.2 行为识别 “太粗糙” 1.1.3 技术落地的 “体验坑” 二、…

7 ABP Framework 支持的 UI 框架

ABP Framework 支持的 UI 框架 该页面详细介绍了 ABP Framework 支持的三种 UI 框架&#xff08;Angular、Blazor、MVC/Razor Pages&#xff09;&#xff0c;以及它们的架构、依赖、项目结构和共享基础设施。 框架概述 ABP 提供三种独立又可组合使用的 UI 框架&#xff0c;它们…

C++中的`if`语句多操作条件执行及顺序保证技术指南

C中的if语句多操作条件执行及顺序保证技术指南 1. 引言 在C编程中&#xff0c;if语句是控制程序流程的基本结构。随着C17引入if语句的初始化部分&#xff0c;开发者获得了在条件判断前执行初始化操作的能力。然而&#xff0c;实际开发中常遇到更复杂的场景&#xff1a;​在条件…