文件管理模块-上传-过滤机制
$_FILES:PHP中一个预定义的超全局变量,用于在上传文件时从客户端接收文件,并将其保存到服务器上。它是一个包含上传文件信息的数组,包括文件名、类型、大小、临时文件名等信息。
$_FILES[“表单值”][“name”] 获取上传文件原始名称
$_FILES[“表单值”][“type”] 获取上传文件MIME类型
$_FILES[“表单值”][“size”] 获取上传文件字节单位大小
$_FILES[“表单值”][“tmp_name”] 获取上传的临时副本文件名
$_FILES[“表单值”][“error”] 获取上传时发生的错误代码
move_uploaded_file() 将上传的文件移动到指定位置的函数
1、无过滤机制
$name=$_FILES['f']['name']; $type=$_FILES['f']['type']; $size=$_FILES['f']['size']; $tmp_name=$_FILES['f']['tmp_name']; $error=$_FILES['f']['error']; echo $name."<br>"; echo $type."<br>"; echo $size."<br>"; echo $tmp_name."<br>"; echo $error."<br>"; if(move_uploaded_file($tmp_name,'upload/'.$name)){ echo "文件上传成功!"; }
2、黑名单过滤机制
//上传文件后缀过滤 黑名单机制 $black_ext=array('php','asp','jsp','aspx'); //xxx.jpg xxx.png $fenge = explode('.',$name); $exts = end($fenge); if(in_array($exts,$black_ext)){ echo '非法后缀文件'.$exts; }else{ move_uploaded_file($tmp_name,'upload/'.$name); echo '<script>alert("上传成功")</script>'; }
3、白名单过滤机制
$allow_ext=array('png','jpg','gif','jpeg'); //xxx.jpg xxx.png $fenge = explode('.',$name); $exts = end($fenge); if(!in_array($exts,$allow_ext)){ echo '非法后缀文件'.$exts; }else{ move_uploaded_file($tmp_name,'upload/'.$name); echo '<script>alert("上传成功")</script>'; }
4、文件类型过滤机制
Content-Type: application/octet-stream 改为 Content-Type: image/png
文件管理模块-显示-过滤机制
<?php $dir = $_GET['path'] ?: './'; //1.打开目录,读取文件列表 opendir //2.循环读取文件列表 while readdir //3.判断是文件还是文件夹 is_dir //打开目录,读取文件列表 opendir function filelist($dir){ if($dh = opendir($dir)){ //循环读取文件列表 while readdir while(($file=readdir($dh) )!== false){ //判断是文件还是文件夹 is_dir if(is_dir($file)){ echo "<li><i class='fa fa-folder'></i> <a href='?path=$file'>" . $file . '</a></li>'; }else{ echo '<li><i class="fa fa-file"></i> <a href="#">' . $file . '</a></li>'; } } } } filelist($dir); function del($file){ if(!is_dir($file)){ unlink($file); echo "<script>alert('删除成功')</script>"; } } if(isset($_GET['del'])){ del($_GET['del']); } function down($filepath){ $fileName = basename($filepath); header("Content-Type: application/octet-stream"); header("Content-Disposition: attachment; filename=\"" . $fileName . "\""); header("Content-Length: " . filesize($filepath)); readfile($filepath); } if(isset($_GET['down'])){ down($_GET['down']); } ?>
功能:显示 上传 下载 删除 编辑 包含等
1.打开目录读取文件列表
2.递归循环读取文件列表
3.判断是文件还是文件夹
4.PHP.INI目录访问控制
开启后将网站根目录设置为D:\phpStudy\PHPTutorial\WWW\blog,无法利用进行目录遍历
is_dir() 函数用于检查指定的路径是否是一个目录
opendir() 函数用于打开指定的目录,返回句柄,用来读取目录中的文件和子目录
readdir() 函数用于从打开的目录句柄中读取目录中的文件和子目录
open_basedir:PHP.INI中的设置用来控制脚本程序访问目录
PHP文件操作安全
-文件包含,文件上传,文件下载,文件删除,文件写入,文件遍历
文件包含
include() 在错误发生后脚本继续执行
require() 在错误发生后脚本停止执行
include_once() 如果已经包含,则不再执行
require_once() 如果已经包含,则不再执行
文件上传
架构:
1、上传至服务器本身的存储磁盘(源码在一起)
2、云产品OSS存储对象去存储文件(泄漏安全)
这个技巧挖src还是挺管用的
阿里云中oss云存储资源需要购买(好处就是无脚本执行环境 降低安全风险)
当然关于这方面的利用就是通过前端源码泄露的ak/sk,利用OSS浏览器、行云管家等工具进行bucket接管
附上刚出的漏洞
多说几句:一般web应用就是通过找一些静态资源泄露,小程序就是反编译找关键词,APP同样也是反编译(脱壳、adb、frida、xpose)……这是可以讲的麽
3、把文件上传到其他域名,如:www.xiaodi8.com->upload.xiaodi8.com
文件删除
unlink() 文件删除函数
调用命令删除:system shell_exec exec等
文件下载
修改HTTP头实现文件读取解析下载:
header(“Content-Type: application/octet-stream”);
header(“Content-Disposition: attachment; filename=”");
header("Content-Length: " . filesize(f i l e ) ) ; r e a d f i l e ( file));
文件编辑
1、file_get_contents() 读取文件内容
2、fopen() fread() 文件打开读入