第21篇:WEB漏洞~文件上传~后端黑白名单绕过

news/2025/2/22 15:41:20/

目录

  • 1. 正文
    • 1.1. 文件上传常见验证
    • 1.2. 简要上传表单代码分析解释
  • 2. 示例-以Uploadlabs为例
    • 2.1. pass02
    • 2.2. pass-3
    • 2.3. pass-4
    • 2.4. pass-5
    • 2.5. pass-6
    • 2.6. pass-7
    • 2.7. pass-8
    • 2.8. pass-9
    • 2.9. pass-10
    • 2.10. pass-11
    • 2.11. pass-12
    • 2.12. pass-13

在这里插入图片描述

1. 正文

1.1. 文件上传常见验证

后缀名,类型、文件头等

后缀名:黑名单、白名单(属于直接方法)
黑名单:明确禁止上传的文件后缀。若记录不全,则根据不禁止的全都允许规则,利用其它后缀达到上传,限于个别情况
白名单:明确允许上传的文件后缀。相对于黑名单更安全

文件类型:MIME信息(属于间接方法)
根据数据包中Content-type 获取数据类型

MIME (Multipurpose Internet Mail Extensions) 是描述消息内容类型的标准,用来表示文档、文件或字节流的性质和格式

根据HTTP数据包content-type自动判断类型,不可靠,因为可抓包修改

文件头:内容头信息(属于间接方法)
每个文件的根本数据为二进制,拥有相应的文件头,亦可以抓包修改

1.2. 简要上传表单代码分析解释

摘自:PHP $_FILES函数详解
$_FILES数组内容如下:
$_FILES['myFile']['name'] 客户端文件的原名称。
$_FILES['myFile']['type'] 文件的 MIME 类型,需要浏览器提供该信息的支持,例如"image/gif"。
$_FILES['myFile']['size'] 已上传文件的大小,单位为字节。
$_FILES['myFile']['tmp_name'] 文件被上传后在服务端储存的临时文件名,一般是系统默认。
$_FILES['myFile']['error'] 和该文件上传相关的错误代码
在这里插入图片描述

<?phpecho $_FILES['userfile']['name'];echo $_FILES['userfile']['name'];echo $_FILES['userfile']['type'];echo $_FILES['userfile']['size'];echo $_FILES['userfile']['tmp_name'];echo $_FILES['userfile']['error'];
?><form enctype="multipart/form-data" action="" method="POST"><input name="userfile" type="file" /><input type="submit" name="submit" value="upload" />
</form>

表单根据FILES读取的属性值,可做出相应的判断过滤操作

2. 示例-以Uploadlabs为例

大量php函数需要查询

Uploadlabs整与2022年夏季,与迪师傅网课时年代版本排版不同

2.1. pass02

MIME绕过
在这里插入图片描述
抓包修改Content-type
在这里插入图片描述

2.2. pass-3

        $deny_ext = array('.asp','.aspx','.php','.jsp');$file_name = trim($_FILES['upload_file']['name']); // 移除字符串两侧的空白字符或其他预定义字符。$file_name = deldot($file_name);//删除文件名末尾的点$file_ext = strrchr($file_name, '.'); // 搜索 点 在字符串中的位置,并返回从该位置到字符串结尾的所有字符,即后缀$file_ext = strtolower($file_ext); //转换为小写$file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA$file_ext = trim($file_ext); //首尾去空

检测文件后缀是否在黑名单中

“https://zhuanlan.zhihu.com/p/57847225”
搭建平台的特性
其他格式执行出其他效果,取决于平台的功能配置
php3
防止平台未开放其他脚本的解析功能,上传文件时最好上传同于搭建网站的脚本语言

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.3. pass-4

.heaccess解析只有apace可用

.htaccess文件(或者"分布式配置文件"),全称是Hypertext Access(超文本入口)。
提供了针对目录改变配置的方法, 即,在一个特定的文档目录中放置一个包含一个或多个指令的文件, 以作用于此目录及其所有子目录。
作为用户,所能使用的命令受到限制。管理员可以通过Apache的AllowOverride指令来设置

<!--首先上传文件名为 .heaccess 的文件,文件内容如下-->
<FilesMatch "shana">
Sethandler application/x-httpd-php
</FilesMatch >

意为上传的文件名中含有cimer的,均视为php执行,但需要打开配置文件中的开关
在这里插入图片描述
在这里插入图片描述
理论如上,焯,为什么我没成功

2.4. pass-5

啊官网上关于.user.ini的介绍
神秘的.user.ini文件
关于php网站可以上传的配置文件: heaccess 、.user.ini。根据黑名单列表,选择上传 ini文件
引发 .user.ini 解析漏洞需要三个前提条件

  1. 服务器脚本语言为PHP
  2. 服务器使用CGI/FastCGI模式
  3. 上传目录下要有可执行的php文件

网站上传根目录存有 readme.php 文件
上传文件

# 对当前文件夹下所有文件头拼接5.jpg 文件
auto_prepend_file=5.jpg 
# 对当前文件夹下所有文件尾部拼接5.jpg 文件
auto_append_file=5.jpg
# 以上选一

上传 5.jpg 为脚本代码
在这里插入图片描述
访问readme.php ,执行php脚本同时执行拼接上的 5.jpg
在这里插入图片描述

2.5. pass-6

# 缺少大小写转化
$file_ext = strtolower($file_ext); //转换为小写

windows文件不区分大小写,即可修改文件后缀大小写突破黑名单
在这里插入图片描述

2.6. pass-7

# 缺少首尾去空
$file_ext = trim($file_ext); //首尾去空

windows文件后缀自动去掉末尾空格,即不存在1.txt
数据包中可以添加空格成1.txt ,即文件后缀带有空格部分,但上传成功后操作系统回去除空格
在这里插入图片描述

2.7. pass-8

# 缺少过滤文件末尾的点$file_name = deldot($file_name);//删除文件名末尾的点

文件名添加点意为文件类型为php.,通过黑白名单检索
在这里插入图片描述

2.8. pass-9

# 缺少去除::$DATA
$file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA

补充知识:php在window的时候如果文件名+“:: D A T A " 会把 : : DATA"会把:: DATA"会把::DATA之后的数据当成文件流处理,不会检测后缀名,且保持”::$DATA"之前的文件名 他的目的就是不检查后缀名。
在这里插入图片描述

2.9. pass-10

过滤函数使用与pass-3一致,pass-03使用白名单,pass-10使用黑名单

 $file_name = deldot($file_name);//删除文件名末尾的点
# 该函数定义如下: 即从字符串的尾部开始,从后向前删除点. ,直到该字符串的末尾字符不是. 为止。(来自百度)

从后向前删除点. ,直到该字符串的末尾字符不是.为止,因此得到的文件后缀应该是空格
在这里插入图片描述

2.10. pass-11

# file_name中含有在deny_ext中的后缀替换成空
$file_name = str_ireplace($deny_ext,"", $file_name);

str_ireplace() 函数替换字符串中的一些字符(不区分大小写)
本题过滤文件后缀名中的敏感后缀,过滤分为两种循环过滤和一次过滤

  • 循环过滤将持续每次逐字符检索连续的php字符
  • 一次过滤只进行一次

pass-11使用str_ireplace() 进行了一次过滤
在这里插入图片描述

2.11. pass-12

$file_ext = substr($_FILES['upload_file']['name'],strrpos($_FILES['upload_file']['name'],".")+1);
# substr() 截取字符串某位置开始后的剩下字符串
# strrpos() 函数查找字符串在另一字符串中最后一次出现的位置。
# 综上因该是获取后缀名
$temp_file = $_FILES['upload_file']['tmp_name'];
$img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;
# . 为拼接符, 从save_path参数获取存放路径
# img_path  拼凑一个新的文件名
if(move_uploaded_file($temp_file,$img_path)){$is_upload = true;
}

php的一些函数的底层是C语言,而move_uploaded_file就是其中之一,遇到0x00会截断,0x表示16进制,URL中%00解码成16进制就是0x00。

  • %00截断:地址上的拦截
  • 0x00,文件命名上的截断

由于从save_path参数获取存放路径,因此可以添加截断掉符号。修改数据包中准备存放文件的路径值参数

upload7.php%00/2131254112.jpg
%00 为解码后为 '\0',在字符串中意为字符串结尾符

前提条件需要关闭magic_quotes_gpc以防止对提交参数的转义且php版本<5.3.4
在这里插入图片描述
直接访问新名字1.php
在这里插入图片描述

2.12. pass-13

同pass-12截断,pass-13截断的存储路径在post提交数据中

get提交会将数据中的url编码自动解码,post并无此过程,因此需要手动解码

目前这一关卡在同迪师傅相同地点


upload-labs通关记录


http://www.ppmy.cn/news/434405.html

相关文章

【深入理解Hadoop原理】Hadoop 参数配置 详解

Hadoop 参数配置 详解 一、常用端口 组件 节点 默认端口 配置 用途说明 HDFS DataNode 50010 dfs.datanode.address datanode服务端口&#xff0c;用于数据传输 HDFS DataNode 50075 dfs.datanode.http.address http服务的端口 HDFS DataNode 50475 dfs.dat…

Windows Server 2003 系统安全配置方法

一、系统的安装 &#xff11;、按照Windows2003安装光盘的提示安装&#xff0c;默认情况下2003没有把IIS6.0安装在系统里面。 &#xff12;、IIS6.0的安装 开始菜单—>控制面板—>添加或删除程序—>添加/删除Windows组件 应用程序 ———ASP.NET&#xff08;可选&…

WEB学习 任务七 笔记

任务七&#xff1a;Web学习 内容&#xff1a; 1.查阅资料&#xff0c;掌握PHP类的一句话木马的基本形式与原理&#xff0c;并学会图片木马的简单制作&#xff08;图片中嵌入一句话&#xff1b;一句话封装成假图片&#xff09; 2.下载配置蚁剑&#xff08;https://github.com/An…

Quartz任务调度

了解Quartz体系结构 Quartz对任务调度的领域问题进行了高度的抽象&#xff0c;提出了调度器、任务和触发器这3个核心的概念&#xff0c;并在org.quartz通过接口和类对重要的这些核心概念进行描述&#xff1a; ●Job&#xff1a;是一个接口&#xff0c;只有一个方法void execute…

Mac Flutter配置在AndroidStudio最新教程(完美避开各种大坑小坑)

Flutter官方介绍&#xff1a; 大致意思这么讲&#xff1a; Flutter是谷歌的移动应用SDK&#xff0c;用于在创纪录的时间内在iOS和Android上制作高质量的原生界面。Flutter与现有代码一起使用&#xff0c;被世界各地的开发人员和组织使用&#xff0c;并且是免费和开源的。 Flu…

Quartz任务调度

了解Quartz体系结构 Quartz对任务调度的领域问题进行了高度的抽象&#xff0c;提出了调度器、任务和触发器这3个核心的概念&#xff0c;并在org.quartz通过接口和类对重要的这些核心概念进行描述&#xff1a; ●Job&#xff1a;是一个接口&#xff0c;只有一个方法void execute…

金仓数据库KingbaseES数据库参考手册(服务器配置参数9. 错误报告和日志)

目录 9.1. 在哪里记录日志 9.2. 什么时候记录日志 9.3. 记录什么到日志 9.4. 使用 CSV 格式的日志输出 9.5. 进程标题 9.1. 在哪里记录日志 log_destination 属性 描述 类型 string 默认值 stderr 级别 SIGHUP---会话级 KingbaseES支持多种方法来记录服务…

linux网络配置

linux网路配置 1. 虚拟机网络1.1 桥接模式1.2 NAT模式1.3 SCSI控制器&#xff08;I/O&#xff09; 2. Centos7网络配置3. Ubuntu网络配置3.1 networking&#xff08;老方法&#xff09;3.2 netplan&#xff08;新方法&#xff09; 4. ip命令簇4.1 address4.2 link4.3 route4.3 …