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

目录

PHP文件操作安全

文件包含

文件删除

文件编辑

文件下载

云产品OSS存储对象去存储文件(泄漏安全)

思维导图


PHP知识点

功能:新闻列表,会员中心,资源下载,留言版,后台模块,模版引用,框架开发等

技术:输入输出,超全局变量,数据库操作,逻辑架构,包含上传&下载删除;

技术:JS&CSS混用,Cookie,Session操作,MVC架构,ThinkPHP引用等。

PHP文件操作安全

文件包含,文件上传,文件下载,文件删除,文件写入,文件遍历

文件上传存储位置:

  1. 上传至服务器本身的存储磁盘(源码在一起
  2. 云产品OSS存储对象去存储文件(泄漏安全)
  3. 把文件上传到其他域名,如:www.xiaodi8.com->upload.xiaodi8.com

这次上课主要是完善文件管理模块的其余部分,下载,删除,编辑,包含。这次代码就全放开头了。filemanage.php 代码如下:

<?php
ini_set('open_basedir',__DIR__);
$path=$_GET['path'] ?? './';
$action = isset($_GET['a'])?$_GET['a']:'';  // 删除,下载 等行为
$path = isset($_GET['path'])?$_GET['path']:'.';  // 文件路径
if(is_file($path)) // 是文件
{
    //获得文件名
    $file = basename($path);
    //获得路径
    $path = dirname($path);
}
//判断,不是目录
elseif(!is_dir($path))  // 不是目录
{
    echo '我只会吃瓜!';
}

// 取指定目录下的文件列表,并以数组的形式返回。
// 文件列表按照文件类型(目录或文件)进行分类,并包含文件名、文件路径、文件大小和文件修改时间等信息
function getlist($path){  // 拿到文件所在路径
    $hd=opendir($path);
    while(($file_name=readdir($hd) )!== false){
        if($file_name != '.' && $file_name != '..'){
            $file_path = "$path/$file_name";
            $file_type = filetype($file_path);
        }
        // 一个二维数组,用于存储文件列表。根据文件类型将文件存储在对应的键名 $file_type 下。
        $list[$file_type][] = array( //$file_type = dir 和 file $list['dir'] 和  $list['file']
            'file_name'=>$file_name, //文件名存储键值file_name
            'file_path'=>$file_path, //文件路径存储键值file_path
            'file_size'=>round(filesize($file_path)/1024), //通过换算文件大小存储键值file_path
            'file_time'=>date('Y/m/d H:i:s',filemtime($file_path)), //获取文件时间并存储键值file_path
        );

    }
    // PHP 内置函数,用于关闭目录句柄。
    closedir($hd);
    return $list;
}

$list=getlist($path);


//接受方法 判断是怎么操作
//echo $action;
switch ($action){
    case 'del':
        unlink($file);
        //$cmd="del $file";
        //system($cmd);
        //echo $cmd;
        break;
    case 'down':
        // 设置响应头,指定下载文件的 MIME 类型为 application/octet-stream,表示通用的二进制流
        header("Content-Type: application/octet-stream");
        // 设置响应头,指定下载时的文件名,并将其设置为变量 $file 的值。
        header("Content-Disposition: attachment; filename=\"" . $file . "\"");
        // 设置响应头,指定下载文件的大小,使用 filesize() 函数获取文件的大小。
        header("Content-Length: " . filesize($file));
        // PHP 内置函数,用于将指定文件的内容输出到浏览器,实现文件下载。
        readfile($file);
        break;
    case 'edit':
        // PHP 内置函数,用于读取文件的内容并返回。
        $content=file_get_contents($file);
        echo '<form name="form1" method="post" action="">';
        echo "文件名:".$file."<br>";
        echo "文件内容:<br>";
        echo '<textarea name="code" style="resize:none;" rows="100" cols="100"">'.$content.'</textarea><br>';
        echo '<input type="submit" name="submit" id="submit" value="提交">';
        echo '</form>';
        break;
}

//检测编辑后提交的事件 进入文件重新写入
if(isset($_POST['code'])){
    // 'w+' 是以写入方式打开文件,并将文件指针指向文件的开头。
    $f=fopen("$path/$file",'w+');
    fwrite($f,$_POST['code']);
    fclose($f);
}




?>

<table width="100%" style="font-size: 10px;text-align: center;">
    <tr>
        <th>图标</th>
        <th>名称</th>
        <th>日期</th>
        <th>大小</th>
        <th>路径</th>
        <th>操作</th>
    </tr>
        <?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  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']?></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;?>


</table>

PHP代码执行规则:从数据包提取参数,对参数有所回应的代码就会被执行,并不是严格顺序执行。通过访问文件,执行对应文件的代码,PHP代码在后端被执行,HTML等代码的PHP变量会被替换,再把剩下的东西给到浏览器。

总的来说,文件管理由于目录权限控制不当等问题,可能导致遍历漏洞、任意文件读取、任意文件删除、上传后门等一系列问题

文件包含

文件包含漏洞(File Inclusion Vulnerability)是一种安全漏洞,通常发生在应用程序中使用用户提供的文件名或路径而未正确验证的情况下。攻击者利用这个漏洞可以包含恶意文件,导致潜在的安全问题,如远程代码执行、敏感信息泄露等。

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

在 upload.php 中开头进行了文件包含如下

//include 'upload.html';
include ($_GET['page']); // 用户可以控制要包含的文件,易造成文件包含漏洞

若上传至目标服务器一个 1.txt 文件内容如下

<?php phpinfo();?>

示例:访问 upload.php 时构造如下参数,即可将 1.txt 中的 php 代码成功执行(有时执行不成功,需看环境问题)

upload.php?page=1.txt

原本不可以被PHP解析执行的TXT,就相当于TXT的内容嵌入upload.php中,就可以执行了

文件删除

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

可以使用 phpunlink () 文件删除函数

也调用命令删除:system shell_exec exec 等,但该方法可能造成命令执行漏洞,如构造下列 payload, 可以顺便 ping 一个 dnslog

xxx.xxx.xxx/filemanage.php?a=del&path=1.txt | ping 7j88z3.dnslog.cn

文件编辑

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

文件下载

修改HTTP头实现文件读取解析下载:
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename="");
header("Content-Length: " . filesize($file));
readfile($file);

这个记住就行,不用了解原理,修改 HTTP 头实现文件读取解析下载

case 'down':
    header("Content-Type: application/octet-stream");
    header("Content-Disposition: attachment; filename=\"" . $file . "\"");
    header("Content-Length: " . filesize("$path/$file"));
    readfile("$path/$file");
    break;

构造下载链接为以下内容

xxx.xxx.xxx/filemanage.php?a=down&path=1.txt

将 path 修改为指定文件尝试下载,若下载成功,则可能存在文件下载漏洞

云产品OSS存储对象去存储文件(泄漏安全)

这个技巧挖src还是挺管用的

阿里云中oss云存储资源需要购买(好处就是无脚本执行环境 降低安全风险)

当然关于这方面的利用就是通过前端源码泄露的ak/sk,利用OSS浏览器、行云管家等工具进行bucket接管

使用下面这一套代码做的文件上传至OSS会有ak泄露风险

多说几句:一般web应用就是通过找一些静态,js资源泄露,小程序就是反编译找关键词,APP同样也是反编译(脱壳、adb、frida、xpose)

思维导图

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

单机版openstack安装

说明&#xff1a; 本文环境&#xff1a;CentOS 7 x64位 1.创建虚拟机 2.在虚拟机中安装 centos 7&#xff08;最小安装&#xff09;&#xff0c;修改主机名&#xff1a;openstack&#xff0c;设置 root 密码&#xff1a;12345678 3. 网卡设置&#xff0c;重启网络服务&#…

黑马点评-好友关注实现

关注和取关 针对用户的操作&#xff0c;可以对用户进行关注和取消关注功能&#xff1a; 需要实现两个接口&#xff1a; 关注和取关接口 判断是否关注的接口 接口&#xff1a; //关注和取关 PutMapping("/{id}/{isFollow}") public Result follow(PathVariable(&…

听 GPT 讲 client-go 源代码 (22)

分享更多精彩内容&#xff0c;欢迎关注&#xff01; File: client-go/applyconfigurations/core/v1/attachedvolume.go 在client-go项目中&#xff0c;client-go/applyconfigurations/core/v1/attachedvolume.go文件的作用是为Kubernetes的CoreV1 API对象AttachedVolume提供应用…

2024如何搭建测试平台?理清思路很重要!

01、职责 一个健康的测试平台体系&#xff0c;对测试人员的职责分工、协作模式会有不同的要求。 测试平台核心的职责是完成高质量的交付已满足业务需求。测试活动包括单元测试、集成测试、接口测试、性能测试等&#xff0c;都是通过这些测试手段&#xff0c;协同整个测试平台…

JsonCreator注解InvalidDefinitionException报错解决

"stack_trace": "c.f.j.d.e.InvalidDefinitionException: More than one argument (#0 and left as delegating for Creator [constructor for (

ArcGIS学习(十一)公服设施服务区划分与评价

ArcGIS学习(十一)公服设施服务区划分与评价 本任务带来的内容是公服设施服务区划分与公服设施服务区评价。本任务包括两个关卡: 公服设施服务区划分公服设施服务区空间价值评价1.公服设施服务区划分 首先,来看看这个案例的场景和基础数据。我们以上海市图书馆为例进行分析…

day3 FreeRTOS

抢占式调度 osThreadId_t defaultTaskHandle; const osThreadAttr_t defaultTask_attributes {.name "defaultTask",.stack_size 128 * 4,.priority (osPriority_t) osPriorityNormal, }; /* Definitions for myTask02 */osThreadId_t myTask03Handle; const os…

005-事件捕获、冒泡事件委托

事件捕获、冒泡&事件委托 1、事件捕获与冒泡2、事件冒泡示例3、阻止事件冒泡4、阻止事件默认行为5、事件委托6、事件委托优点 1、事件捕获与冒泡 2、事件冒泡示例 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /…

Linux的top命令解析

Top命令是什么 TOP命令是Linux下常用的性能分析工具&#xff0c;能够实时显示系统中各个进程的资源占用状况。 TOP是一个动态显示过程,即可以通过用户按键来不断刷新当前状态.如果在前台执行该命令,它将独占前台,直到用户终止该程序为止.比较准确的说,top命令提供了实时的对系…

全链路Python环境迁移

全链路Python环境迁移 在当前的Python环境中&#xff0c;安装一些库以后&#xff0c;如果换了一套Python环境&#xff0c;难道再来一次不停的pip install&#xff1f;当然不是。 第一步&#xff0c;使用pip freeze&#xff08;冻结&#xff09;备份当前Python库的环境 pip f…

一起来读李清照

当然先祝各位女生节日快乐&#x1f381;&#x1f381;啦​。​ 但是呢&#xff0c;今天&#xff0c;我们不聊技术&#xff0c;来聊点其他的。 大家都知道今天是三八妇女节&#xff0c;三八妇女节的是中国人的叫法&#xff0c;也叫国际妇女节。是为了纪念妇女权利的运动&#…

测试环境搭建整套大数据系统-问题篇(一:实时遇到的问题)

1. java.io.IOException: Failed to deserialize JSON ‘{“age”:867,“sex”:“fba8c074f9”,“t_insert_time”:“2024-03-04 14:12:24.821”}’ 解决方式 修改数据类型。将TIMESTAMP_LTZ改为TIMESTAMP。 2. java. lang,classNotFoundException: org,apache.flink,streami…

代理模式以及静态代理、JDK代理、Cglib代理的实现

代理模式&#xff08;Proxy&#xff09; 介绍 1、代理模式&#xff1a;为对象提供一个替身&#xff0c;以控制对这个对象的访问&#xff0c;即通过代理对象访问目标对象&#xff0c;这样做的好处是&#xff1a;可以在目标对象实现的基础上&#xff0c;增强额外的功能操作 &…

2024 AI 辅助研发的新纪年

随着人工智能技术的持续发展与突破&#xff0c;2024年AI辅助研发正成为科技界和工业界瞩目的焦点。从医药研发到汽车设计&#xff0c;从软件开发到材料科学&#xff0c;AI正逐渐渗透到研发的各个环节&#xff0c;变革着传统的研发模式。在这一背景下&#xff0c;AI辅助研发不仅…

不允许你不知道Python函数的返回值

函数可以通过return一次性返回多个数据&#xff0c;返回的数据以元组的形式保存。函数中若出现了return&#xff0c;return后面的程序不会执行。若函数中需要将某些数据返回&#xff0c;使用关键字return。若return后面没有返回任何数据&#xff0c;仅仅表示结束程序&#xff0…

Haproxy介绍、安装

Haproxy介绍、安装 文章目录 Haproxy介绍、安装1.Haproxy介绍1.1 企业版1.2 社区版1.3 版本对比1.4 HAProxy功能 2.HAProxy安装2.1 主机初始化2.1.1 设置网卡名和ip地址2.1.2 配置镜像源2.1.3 关闭防火墙2.1.4 禁用SELinux2.1.5 设置时区 2.2 包安装2.2.1 Ubuntu 安装2.2.2 Cen…

WEB接口测试之Jmeter接口测试自动化 (二)(数据分离)

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

数据结构八大算法详解

一、直接插入排序 直接插入排序的核心思想就是&#xff1a;将数组中的所有元素依次跟前面已经排好的元素相比较&#xff0c;如果选择的元素比已排序的元素小&#xff0c;则交换&#xff0c;直到全部元素都比较过。 因此&#xff0c;从上面的描述中我们可以发现&#xff0c;直接…

非常好用的Java诊断工具Arthas(阿尔萨斯)

小伙伴们好&#xff0c;欢迎关注&#xff0c;一起学习&#xff0c;无限进步 文章目录 Window 安装Linux 安装SpringBoot 整合 arthas其他使用场景 Arthas是阿里巴巴开源的一款Java诊断工具&#xff0c;可以用于线上诊断问题、监控应用性能等。支持 Linux/Mac/Windows&#xff0…