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

news2024/11/19 8:20:19

目录

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)

思维导图

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

7个实用的CSS技巧

1. First letter drop 首字母丢失 我们可以使用 :first-letter 来删除文本的第一个字母&#xff1a; p:first-letter {font-size: 200%;color: #8A2BE2; }:first-letter 选择器用于指定元素的首字母样式&#xff0c;它仅适用于块级元素。效果如下: codepen.io/OMGZui/pen/… …

Qt 5.14.2 网络编程揭秘:构建高效HTTP客户端与文件下载器

引言 在当今的软件开发世界中&#xff0c;网络通信已成为不可或缺的一部分。Qt&#xff0c;作为一个跨平台的C框架&#xff0c;为我们提供了强大的网络编程能力。本文将带你深入Qt的网络模块&#xff0c;探索如何使用QNetworkAccessManager、QNetworkRequest和QNetworkReply等核…

读《文明之光》第1册总结

人类几千年的文明史和地球的历史相比&#xff0c;实在是太短暂了&#xff0c;大约相当于几分钟和一年的关系。人类已经走过的路&#xff0c;相比今后要走的漫漫长路&#xff0c;只能算是刚刚起步。如果跳出一个个具体事件&#xff0c;站在历史的高度去看&#xff0c;我们会发现…

找出单身狗1,2

目录 1. 单身狗12. 单身狗2 1. 单身狗1 题目如下&#xff1a; 思路&#xff1a;一部分人可能会使用对数组排序&#xff0c;遍历数组的方式去找出只出现一次的数字&#xff0c;但这种方法的时间复杂度过高&#xff0c;有时候可能会不满足要求。 有一种十分简便的方法是使用异或…

类与对象(三)--static成员、友元

文章目录 1.static成员1.1概念&#x1f3a7;面试题✒️1.2static的特性&#x1f3a7;1.3思考&#x1f3a7; 2.友元2.1什么是友元&#xff1f;&#x1f3a7;2.2两种友元关系&#xff1a;&#x1f3a7; 1.static成员 1.1概念&#x1f3a7; &#x1f50e; static关键字用于声明类…

Python教程,python从入门到精通 第1天 温习笔记

1.1 字面量 1.2 注释 1.3 变量 1.4 数据类型 1.5 数据类型转换 1.6 标识符 1.7 运算符 1.8 字符串的三种定义方式 1.9 字符串拼接 1.10 字符串格式化 1.11 掌握格式化字符串的过程中做数字的精度控制 1.12 掌握快速字符串格式化的方式 1.13 字符串格式化&#xff0d;表达式的格…

动态规划基础模型总结

前言 动态规划是用一个数来表示一堆状态&#xff0c;可以看成是对暴搜的优化 暴搜一个一个数枚举过去&#xff0c;但DP是一堆堆数枚举&#xff0c;效率会快很多&#xff1b; 状态数用几维表示&#xff1a;从小到大考虑&#xff0c;看怎么样才能够让答案清楚表达出来 需要一定的…

下载一些ROS的包的方式

ROS Index 我们可以去ROS Index网站下载一些我们需要的包。打开浏览器在网址框输入index.ros.org。或者点击此处链接ROS Index 在这个网站中我们可以浏览并找到我们需要的包&#xff0c;也可以下载它的源代码或者仅安装到我们的系统中来使用。&#xff08;安装过程在终端中进行…

LeetCode的使用方法

LeetCode的使用方法 一、LeetCode是什么&#xff1f;1.LeetCode简介2.LeetCode官网 二、LeetCode的使用方法1.注册账号2.力扣社区力扣编辑器 2.1 讨论发起讨论参与讨论关注讨论 2.2 文章撰写文章关注文章 3.力扣面试官版测评面试招聘竞赛 4.力扣学习LeetBook 书架我的阅读猜您喜…

【PyTorch】进阶学习:探索BCEWithLogitsLoss的正确使用---二元分类问题中的logits与标签形状问题

【PyTorch】进阶学习&#xff1a;探索BCEWithLogitsLoss的正确使用—二元分类问题中的logits与标签形状问题 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、Py…

智能指针基础知识【C++】【RAII思想 || unique_ptr || shared_ptrweak_ptr || 循环引用问题】

目录 一&#xff0c;为什么需要智能指针 二&#xff0c;内存泄露的基本认识 1. 内存泄露分类 2. 常见的内存检测工具 3&#xff0c;如何避免内存泄露 三&#xff0c;智能指针的使用与原理 1. RAII思想 2. 智能指针 &#xff08;1. unique_ptr &#xff08;2. shared_…

【重制版】WSDM 2024 2023时空时序论文总结

&#x1f31f;【紧跟前沿】“时空探索之旅”与你一起探索时空奥秘&#xff01;&#x1f680; 欢迎大家关注时空探索之旅 WSDM 2024于2024年3月4日-3月8日在墨西哥梅里达&#xff08;Mrida, Mxico&#xff09;正在举行。目前官网已经放出了所有被录用论文的表单&#xff08;链接…

2024037期传足14场胜负前瞻

2024037期售止时间为3月9日&#xff08;周六&#xff09;20点00分&#xff0c;敬请留意&#xff1a; 本期深盘多&#xff0c;1.5以下赔率4场&#xff0c;1.5-2.0赔率5场&#xff0c;其他场次是平半盘、平盘。本期14场整体难度中等。以下为基础盘前瞻&#xff0c;大家可根据自身…

干货 | MSC细胞培养 “秘籍”

MSC培养细节&#xff0c;这里有您想知道的~ MSC&#xff1a;间充质干细胞&#xff0c;是一群贴壁生长、形态类似于成纤维细胞的多能成体干细胞&#xff0c;存在于脐带、骨髓和脂肪组织等多种组织中&#xff0c;并且可以分化成多种不同的组 实验数据分享 1、样本&#xff1a;冻…

ChatGLM:CPU版本如何安装和部署使用

前段时间想自己部署一个ChatGLM来训练相关的物料当做chatgpt使用&#xff0c;但是奈何没有gpu机器&#xff0c;只能使用cpu服务器尝试使用看看效果 我部署的 Chinese-LangChain 这个项目&#xff0c;使用的是LLM&#xff08;ChatGLM&#xff09;embedding(GanymedeNil/text2vec…

Pytorch基础:Tensor的flatten方法

相关阅读 Pytorch基础https://blog.csdn.net/weixin_45791458/category_12457644.html?spm1001.2014.3001.5482 在Pytorch中&#xff0c;flatten是Tensor的一个重要方法&#xff0c;同时它也是一个torch模块中的一个函数&#xff0c;它们的语法如下所示。 Tensor.flatten…

达梦数据库——如何查看数据库大字段中的数据内容

今天get到一个小知识点 分享给大家&#xff0c;如何在数据库查看大字段中的数据内容。 以下为演示步骤&#xff0c;简单易懂&#xff0c;操练起来吧 首先创建一个含有CLOB、TEXT的大字段测试表 create table "SYSDBA"."CS"("COLUMN_1" CLOB,&qu…

JavaScript极速入门(2)

JQuery W3C标准给我们提供了一系列函数,让我们可以操作: 网页内容 网页结构 网页样式 但是原生的JavaScript提供的API操作DOM元素时,代码比较繁琐,冗长.我们学习使用JQuery来操作页面对象. JQuery是一个快速,简洁且功能丰富的JavaScript框架,于2006年发布.它封装JavaScript常…

干货!Python函数中的参数类型

1.必须参数 调用函数的时候&#xff0c;必须以正常的顺序传参&#xff0c;实参的数量和形参的数量保持一致 def demo(name, age):print("我的姓名是&#xff1a;%s, 年龄是&#xff1a;%d"%(name, age))demo("张三", 22) # 我的姓名是&#xff1a;张三…

黑马点评-发布探店笔记

探店笔记 探店笔记类似点评网站的评价&#xff0c;往往是图文结合。 对应的表有两个&#xff1a; tb_blog&#xff1a;探店笔记表&#xff0c;包含笔记中的标题、文字、图片等 tb_blog_comments&#xff1a;其他用户对探店笔记的评价 流程如下&#xff1a; 上传接口&#…