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)

思维导图

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

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

相关文章

关于出国留学和考研比较----以本人双非跨考计算机为例

文章目录 中心论点国内就业现状勿让旧认知害了自己那出国留学真的一无是处了吗?1. 藤校仍旧是具有极高价值2. 时间成本低3. 研究生一定比单纯的本科找工作强!4. 很多人说出国读博好,可以无脑入,真是这样吗? 中心论点 如果在选择出国留学还是国内考研的最终核心诉求都是有更好…

Unity笔记:协程

协程 协程有IEnumerator类型返回值&#xff0c;所以总要有至少一个yield return xxx 基础入门直接看这个就够了&#xff1a;gamedevbeginner - Unity 中的协程&#xff08;如何以及何时使用它们&#xff09; 考虑使用协程的典型情况&#xff1a; 将对象移动到某个位置。为对象…

Spring Boot与Netty的完美结合:打造高性能网络通信

Spring Boot与Netty的完美结合&#xff1a;打造高性能网络通信 引言 在Java生态中&#xff0c;Spring Boot以其快速开发、简洁配置和丰富的生态支持赢得了众多开发者的喜爱。然而&#xff0c;当涉及到高性能、低延迟的网络通信时&#xff0c;传统的Servlet容器&#xff08;如…

向量的内积、长度、正交性

目录 向量的内积 向量的长度&#xff08;模&#xff09; 标准正交基 标准正交化 正交矩阵 向量的内积 向量的长度&#xff08;模&#xff09; 标准正交基 标准正交化 正交矩阵

JavaWeb——014SpringBoot原理(配置优先级、Bean管理、SpringBoot原理)

SpingBoot原理 目录 SpingBoot原理1. 配置优先级2. Bean管理2.1 获取Bean2.2 Bean作用域2.3 第三方Bean 3. SpringBoot原理3.1 起步依赖3.2 自动配置3.2.1 概述3.2.2 常见方案3.2.2.1 概述3.2.2.2 方案一3.2.2.3 方案二 3.2.3 原理分析3.2.3.1 源码跟踪3.2.3.2 Conditional 3.2…

详解深度学习中的教师-学生模型(Teacher- Student Model)

文章目录 基本流程训练方法分类1. 软标签&#xff08;Soft Labels&#xff09;软化概率分布的具体步骤软化有什么好处&#xff1f; 2. 特征匹配&#xff08;Feature Matching&#xff09;3. 注意力转移&#xff08;Attention Transfer&#xff09;4. 知识图谱或规则迁移5. 隐空…

超市小程序有哪些功能 怎么制作

超市小程序是非常有用的工具&#xff0c;可以帮助超市提升用户体验&#xff0c;提高销售额。下面我们来看一下超市小程序可以具备哪些功能&#xff0c;以及如何制作一个高效的超市小程序。 1. **商品展示与搜索功能**&#xff1a;用户可以浏览超市的商品信息&#xff0c;包括价…

一篇搞定分布式缓存

缓存雪崩 缓存雪崩我们可以简单的理解为&#xff1a;由于原有缓存失效&#xff0c;新缓存未到期间所有原本应该访问缓存的请求都 去查询数据库了&#xff0c;而对数据库 CPU 和内存造成巨大压力&#xff0c;严重的会造成数据库宕机。从而形成一系列 连锁反应&#xff0c;造成整…

同等学力申硕专业介绍——管理学硕士

同等学力申硕的专业很多。 目前有十三大门类&#xff0c;分别是医学、法学、管理学、工学、教育学、经济学、艺术学、文学、历史学、理学、哲学、农学、军事学等&#xff0c;每个大门类中都有很多的细分专业。 今天为大家介绍同等学力申硕专业——管理学。 专业介绍 管理学是…

maven 包管理平台-07-plugins 常见插件介绍

拓展阅读 maven 包管理平台-01-maven 入门介绍 Maven、Gradle、Ant、Ivy、Bazel 和 SBT 的详细对比表格 maven 包管理平台-02-windows 安装配置 mac 安装配置 maven 包管理平台-03-maven project maven 项目的创建入门 maven 包管理平台-04-maven archetype 项目原型 ma…

【学习记录】PointLIO代码 update_iterated_dyn_share_modified 中函数指针的用法

最近在看PointLio的代码&#xff0c;有一部分看了半天没看懂&#xff0c;学习整理如下。 1、PointLio在迭代卡尔曼部分的代码 在esekfom.hpp中&#xff0c;有部分代码如下&#xff1a; void init_dyn_share_modified(processModel f_in, processMatrix1 f_x_in, measurement…

上班族真香副业:工资4500,靠steam游戏搬砖项目月入过w

steam游戏搬砖项目已经存在好多年了&#xff0c;这个项目比较冷门且能持续稳定盈利&#xff0c;是一个非常不错的项目。即使你没玩过steam游戏也没关系&#xff0c;这个steam游戏搬砖项目既不需要你会玩游戏&#xff0c;也不需要你懂英语。 steam游戏搬砖项目的盈利点在汇率差和…

【postgresql 基础入门】UPSERT语句,INSERT违反约束条件时可以转变为UPDATE语句,UPDATE与INSERT的合体

upsert插入更新 ​专栏内容&#xff1a; postgresql内核源码分析手写数据库toadb并发编程 个人主页&#xff1a;我的主页 管理社区&#xff1a;开源数据库 座右铭&#xff1a;天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物. 系列文章 入门准…

leetcode347.前K个高频元素

先使用map&#xff0c;统计每个字符出现的频率&#xff0c;然后使用优先队列根据字符出现频率存储字符&#xff0c;然后弹出堆中元素&#xff0c;弹出K次完成操作&#xff01; 如果看不懂本题CPP语法的&#xff0c;可以参考我的另外一篇博客------------->CPP优先队列priori…

Python的数据库编程基础知识

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd;如果停止&#xff0c;就是低谷&#xf…

【代码随想录算法训练营Day29】 491.递增子序列;46.全排列;47.全排列 II

文章目录 ❇️Day 29 第七章 回溯算法 part05✴️今日内容❇️491.递增子序列自己的思路随想录思路自己的代码 ❇️46.全排列思路代码流程 ❇️47.全排列 II思路代码 ❇️Day 29 第七章 回溯算法 part05 ✴️今日内容 491.递增子序列46.全排列47.全排列 II ❇️491.递增子序…

03.07_111期_C++_string 的增删查改实现笔记

尝试编写的错误总结 1. 对于 insert 的实现&#xff0c;找出下面代码的冗余 第一 使用了一个tmp来承接会被 \0 冲掉的位置的字符&#xff0c;实际上可以直接利用strncpy&#xff0c; 第二 while循环的循环结束调节并没有把pos位置后面的那个字符进行移动&#xff0c; 存在隐藏…

【性能测试】Jmeter+InfluxDB+Grafana 搭建性能监控平台

一、背景 为什么要搭建性能监控平台&#xff1f; 在用 Jmeter 获取性能测试结果的时候&#xff0c;Jmeter自带的测试报告如下&#xff1a; 这个报告有几个很明显的缺点&#xff1a; 只能自己看&#xff0c;无法实时共享&#xff1b;报告信息的展示比较简陋单一&#xff0c;不…

在外包公司搞了2年,出来技术都没了...

先说情况&#xff0c;大专毕业&#xff0c;18年通过校招进入湖南某软件公司&#xff0c;干了接近6年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落&#xff01;而我已经在一个企业干了2年的的功能…

网络工程师笔记9

动态路由 RIP路由协议 配置简单 易于维护 适用于小型网络 周期性是30s发一次