upload-labs详解(1-12)文件上传分析

目录

uploa-labs-main

upload-labs-main第一关

前端防御

绕过前端防御

禁用js

Burpsuite抓包改包

upload-labs-main第二关

上传测试

错误类型

upload-labs-env

upload-labs-env第三关

上传测试

查看源码

解决方法

重命名,上传

upload-labs-env第四关

测试方法

上传文件

upload-labs-env第五关

代码解析

解题思路——大小写绕过

upload-labs-env第六关

代码

空格绕过

upload-labs-env第七关

代码

绕过

upload-labs-env第八关

::$DATA 绕过

upload-labs-env第九关

代码

思路

upload-labs-env第十关

代码

双写绕过

upload-labs第-env十一关

代码

思路——00截断问题(只存在于php5.2版本中)——get传参(url编码方式)

upload-labs-env第十二关

代码

思路——00截断——save_path是post传参


uploa-labs-main

upload-labs-main第一关

前端防御

有一个过滤函数checkFile()

绕过前端防御

禁用js

Chrome禁用js

设置—隐私与安全—网站设置—内容—JavaScript—不允许网站使用JavaScript

再次尝试上传,成功

Burpsuite抓包改包

首先为文件进行重命名,shell.php重命名为shell.jpg

上传shell.jpg文件

Burpsuite打开抓包

网页点击确定上传,

发送到重放器,改包,将shell.jpg改为shell.php,重新发送,上传成功

upload-labs-main第二关

上传测试

错误类型

文件类型不正确,

使用Burpsuite抓包改包

修改为image/png

上传成功

upload-labs-env

upload-labs-env第三关

上传测试

查看源码

 $is_upload = false;
 $msg = null;
 if (isset($_POST['submit'])) {
     if (file_exists(UPLOAD_PATH)) {
         $deny_ext = array('.asp','.aspx','.php','.jsp');//定义一个数组$deny_ext,包含不允许上传的文件扩展名
         $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); //首尾去空
 ​
         if(!in_array($file_ext, $deny_ext)) {
             $temp_file = $_FILES['upload_file']['tmp_name'];//获取上传文件的临时路径,文件在服务器上以临时文件的形式存储
             $img_path = UPLOAD_PATH.'/'.date("YmdHis").rand(1000,9999).$file_ext;            
             if (move_uploaded_file($temp_file,$img_path)) {
                  $is_upload = true;
             } else {
                 $msg = '上传出错!';
             }
         } else {
             $msg = '不允许上传.asp,.aspx,.php,.jsp后缀文件!';
         }
     } else {
         $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
     }
 }

分析源码

需要绕过黑名单的过滤

.php3 、Phtml等都可以被解析

需要修改Apache的配置文件httpd.conf,使.php3 .phtml也可以被解析,当Apache和php版本低时,服务端可以修改

在配置文件中添加

 AddType application/x-httpd-php .phtml

重启Apache

注意:在靶场实验中可能存在这个漏洞,真实项目中不会存在

解决方法

黑名单绕过

在upload-labs-env原版环境中,Apache的配置文件httpd.conf有将 .php3 .phtml解析成php文件

重命名,上传

上传成功

解析成功

upload-labs-env第四关

测试方法

需要.htaccess文件

我们下载upload-labs-env原版环境,自带phpstudy的低版本

在Apache的低版本中,如果在目录中上传一个.htaccess文件

AddType application/x-httpd-php .jpg

会将后来上传的jpg文件解析成php,shell代码得以执行

上传文件

解析成功

upload-labs-env第五关

代码解析

$is_upload = false;
$msg = null;

# isset - 检测变量是否已经声明并且不为空
# $_POST['submit'] - 表示表单中名为 submit 的按钮被点击
if (isset($_POST['submit'])) {
    
    # file_exists — 检查文件或目录是否存在返回值为true或false
    if (file_exists(UPLOAD_PATH)) {
        
        # 定义一个数组 $deny_ext,包含一系列禁止上传的文件扩展名
        $deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".htaccess");
        
        # trim — 去除字符串首尾处的空白字符(或者其他字符)
        # $_FILES['upload_file'] 是表单中 name="upload_file" 对应的上传文件信息
        # 它包含以下常见字段:
		# $_FILES['upload_file']['name']:上传文件的原始名称(如 example.jpg)。
		# $_FILES['upload_file']['type']:上传文件的 MIME 类型(如 image/jpeg)。
		# $_FILES['upload_file']['size']:上传文件的大小(以字节为单位)。
		# $_FILES['upload_file']['tmp_name']:上传文件的临时存储路径。
		# $_FILES['upload_file']['error']:与文件上传相关的任何错误代码
        $file_name = trim($_FILES['upload_file']['name']);
        
        $file_name = deldot($file_name);//删除文件名末尾的点
        
        #strrchr — 查找指定字符在字符串中的最后一次出现的位置,返回从最后一个点开始到字符串末尾的部分
        $file_ext = strrchr($file_name, '.');
        
        #str_ireplace - 执行不区分大小写的字符串替换,在目标字符串中查找指定的子字符串(无视大小写),然后用另一个字符串替换它
        $file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
        $file_ext = trim($file_ext); //首尾去空

        #in_array — 检查数组中是否存在某个值,检查数组$deny_ext中是否存在$file_ext
        if (!in_array($file_ext, $deny_ext)) {
            
            # $_FILES['upload_file']['tmp_name']:上传文件的临时存储路径。
            $temp_file = $_FILES['upload_file']['tmp_name'];
            $img_path = UPLOAD_PATH.'/'.date("YmdHis").rand(1000,9999).$file_ext;
            
            #move_uploaded_file — 将上传的文件移动到新位置
            if (move_uploaded_file($temp_file, $img_path)) {
                $is_upload = true;
            } else {
                $msg = '上传出错!';
            }
        } else {
            $msg = '此文件类型不允许上传!';
        }
    } else {
        $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
    }
}

解题思路——大小写绕过

文件后缀大写绕过

上传.php文件

修改后缀名为.PHP

上传成功

解析执行

upload-labs-env第六关

代码

        $deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".htaccess");
        $file_name = $_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

空格绕过

文件名后缀加空格绕过

upload-labs-env第七关

代码

        $deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".htaccess");
        $file_name = trim($_FILES['upload_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); //首尾去空

绕过

文件后缀名后加点

upload-labs-env第八关

::$DATA 绕过

upload-labs-env第九关

代码

没有对代码进行重命名拼接路径

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
    if (file_exists(UPLOAD_PATH)) {
        $deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".htaccess");
        $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); //首尾去空
        
        if (!in_array($file_ext, $deny_ext)) {
            $temp_file = $_FILES['upload_file']['tmp_name'];
            $img_path = UPLOAD_PATH.'/'.$file_name;
            if (move_uploaded_file($temp_file, $img_path)) {
                $is_upload = true;
            } else {
                $msg = '上传出错!';
            }
        } else {
            $msg = '此文件类型不允许上传!';
        }
    } else {
        $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
    }
}

思路

deldot()函数从后向前检测,当检测到末尾的第一个点时会继续它的检测,但是遇到空格会停下来

更改文件名为 index.php. . 即.php点 空格 点

运行php时,首先删除文件名末尾的点,

...... ,

最后一步检查,去除最后的空格,

此时文件名为index.php.

上传到Windows环境中时,系统会将其视为一个没有扩展名的文件,

Windows会将 index.php. 解释为没有扩展名的文件,因为末尾的点会被忽略。文件的实际名称会变成 index.php,但扩展名会被视为不存在

upload-labs-env第十关

代码

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
    if (file_exists(UPLOAD_PATH)) {
        $deny_ext = array("php","php5","php4","php3","php2","html","htm","phtml","pht","jsp","jspa","jspx","jsw","jsv","jspf","jtml","asp","aspx","asa","asax","ascx","ashx","asmx","cer","swf","htaccess");

        $file_name = trim($_FILES['upload_file']['name']);
        $file_name = str_ireplace($deny_ext,"", $file_name);
        $temp_file = $_FILES['upload_file']['tmp_name'];
        $img_path = UPLOAD_PATH.'/'.$file_name;        
        if (move_uploaded_file($temp_file, $img_path)) {
            $is_upload = true;
        } else {
            $msg = '上传出错!';
        }
    } else {
        $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
    }
}

使用str_ireplace()函数寻找文件名中存在的黑名单字符串,将它替换成空(即将它删掉),可以使用双写绕过黑名单

双写绕过

upload-labs第-env十一关

代码

$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){
    $ext_arr = array('jpg','png','gif');
    
    //$_FILES['upload_file']['name']:获取上传文件的原始文件名
    //strrpos($_FILES['upload_file']['name'], "."):查找文件名中最后一个点(.)的位置
    //substr(..., strrpos(...) + 1):从最后一个点的下一个字符开始截取,得到文件扩展名
    $file_ext = substr($_FILES['upload_file']['name'],strrpos($_FILES['upload_file']['name'],".")+1);
    if(in_array($file_ext,$ext_arr)){
        
        //$_FILES['upload_file']['tmp_name']:获取上传文件的临时存储路径
        $temp_file = $_FILES['upload_file']['tmp_name'];
        
        //$_GET['save_path']:从 URL 参数中获取保存路径
        //rand(10, 99):生成一个 10 到 99 之间的随机数
        //date("YmdHis"):生成当前日期时间字符串,格式为 年月日时分秒
        //最终路径格式:保存路径/随机数+时间戳.扩展名
        $img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;

        if(move_uploaded_file($temp_file,$img_path)){
            $is_upload = true;
        } else {
            $msg = '上传出错!';
        }
    } else{
        $msg = "只允许上传.jpg|.png|.gif类型文件!";
    }
}

思路——00截断问题(只存在于php5.2版本中)——get传参(url编码方式)

在c语言中\0是结束符

php底层是运行c语言

使用\0使截断代码,使后面代码不再运行

使用的传递方式是urlcode传参,%00使用url解码后为空字符

当一个字符串中存在空字符的时候,在被解析的时候会导致空字符后面的字符被丢弃

当php代码运行到

$img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;

 if(move_uploaded_file($temp_file,$img_path)){

时,路径变成了/upload/web.php 后面的连接字符都被丢弃了,

之后将文件上传文件index.jpg的文件内容移动到web.php中,这样恶意代码就可以被解析了

upload-labs-env第十二关

代码

$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){
    $ext_arr = array('jpg','png','gif');
    $file_ext = substr($_FILES['upload_file']['name'],strrpos($_FILES['upload_file']['name'],".")+1);
    if(in_array($file_ext,$ext_arr)){
        $temp_file = $_FILES['upload_file']['tmp_name'];
        $img_path = $_POST['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;

        if(move_uploaded_file($temp_file,$img_path)){
            $is_upload = true;
        } else {
            $msg = "上传失败";
        }
    } else {
        $msg = "只允许上传.jpg|.png|.gif类型文件!";
    }
}

思路——00截断——save_path是post传参

0x00 是十六进制表示的空字符(ASCII 值为 0)

在web.php后面加一个空格,在Burpsuite的hex转换中,找到这个空格(十六进制空格的编码为20)

将其修改为十六进制的空字符表示00

修改后

发送

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

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

相关文章

第一:goland安装

GOPROXY (会话临时性),长久的可以在配置文件中配置 go env -w GOPROXYhttps://goproxy.cn,direct 长久的,在~/.bashrc文件中添加: export GOPROXYhttps://goproxy.cn,direct ----&#xff0d…

ASP使用EFCore和AutoMapper添加导航属性数据

目录 一、不使用自增主键 (1)下载AutoMapper的nuget包 (2)配置映射规则 (3)配置MappingProfile文件 (4)控制器编写添加控制器 (5)测试 二、使用自增主…

什么是Jmeter? Jmeter工作原理是什么?

第一篇 什么是 JMeter?JMeter 工作原理 1.1 什么是 JMeter Apache JMeter 是 Apache 组织开发的基于 Java 的压力测试工具。用于对软件做压力测试,它最初被设计用于 Web 应用测试,但后来扩展到其他测试领域。 它可以用于测试静态和动态资源…

汽车零部件厂如何选择最适合的安灯系统解决方案

在现代制造业中,安灯系统作为一种重要的生产管理工具,能够有效提升生产线的异常处理效率,确保生产过程的顺畅进行。对于汽车零部件厂来说,选择一套适合自身生产需求的安灯系统解决方案尤为重要。 一、安灯系统的核心功能 安灯系统…

Ubuntu20.04双系统安装及软件安装(七):Anaconda3

Ubuntu20.04双系统安装及软件安装(七):Anaconda3 打开Anaconda官网,在右侧处填写邮箱(要真实有效!),然后Submit。会出现如图示的Success界面。 进入填写的邮箱,有一封Ana…

为解决局域网IP、DNS切换的Windows BAT脚本

一、背景 为解决公司普通人员需要切换IP、DNS的情况,于是搞了个windows下的bat脚本,可以对有线网络、无线网络进行切换设置。 脚本内容 echo off title 多网络接口IP切换工具:menu cls echo echo 请选择要配置的网络接口: echo echo 1. 有线网络&am…

【OMCI实践】wireshark解析脚本omci.lua文件(独家分享)

引言 omci.lua文件是Wireshark的OMCI协议解析插件的核心组件。它配合BinDecHex.lua,可以解析OMCI协议的数据包,提取出消息类型、受管实体标识、受管实体属性等关键信息,并以人类可读的形式显示在Wireshark的解码视图中,方便研发人…

JPA编程,去重查询ES索引中的字段,对已有数据的去重过滤,而非全部字典数据

一、背景 课程管理界面,查询前,需要把查询元数据给出。 学科列表、学段列表和分类列表,我们把它定义为查询元数据。 一般的业务需求是: 系统维护好多个字典,比如学科、学段等等,相当于属性库。 但是&…

vue3与react、 react hooks

一、Vue3新特性:setup、ref、reactive、computed、watch、watchEffect函数、生命周期钩子、自定义hooks函数、toRef和toRefs、shallowReactive 与 shallowRef、readonly 与 shallowReadonly、toRaw 与 markRaw、customRef、provide 与 inject、Fragment、Teleport、…

LINUX网络基础 [二] - 网络编程套接字,UDP与TCP

目录 前言 一. 端口号的认识 1.1 端口号的作用 二. 初识TCP协议和UDP协议 2.1 TCP协议 TCP的特点 使用场景 2.2 UDP协议 UDP的特点 使用场景 2.3 TCP与UDP的对比 2.4 思考 2.5 总结 三. 网络字节序 3.1 网络字节序的介绍 3.2 网络字节序思考 四. socket接口 …

基于SpringBoot+Vue的校园美食分享平台的设计与实现

获取源码:SpringBootVue的校园美食分享平台: 系统角色上分为管理员以及普通用户进行实现, 管理员主要负责整个网站后台的维护管理,包括首页、学校管理、美食类型管理、餐厅管理、美食分享管理、美食评论管理、系统信息、用户管理、角色管理和…

WPS条件格式:B列的值大于800,并且E列的值大于B列乘以0.4时,这一行的背景标红

一、选择数据区域 选中需要应用条件格式的区域(例如A2:E100 )。 二、打开条件格式 点击“开始”选项卡,选择“条件格式” > “新建规则”。 三、选择规则类型 选择“使用公式确定要设置格式的单元格”。 四、输入公式 在公式框中输入以…

自由学习记录(42)

可能会出现到后面没有教程可以看,走不动,,但还是尝试吧 过程远比想象的要多 那连Live2d的这些脚本怎么控制的都要了解一下 ------------ 文件类型和扩展名 | 编辑手册 | Live2D Manuals & Tutorials 全部导入之后 在这下载SDK Live2D…

结构型模式---享元模式

概念 享元模式是一种结构型设计模式,他摒弃了在每个对象中保存所有数据的方式,通过共享多个对象所共有的相同状态,让你能在有限的内存容量中载入更多对象。享元模式将原始类中的数据分为内在状态数据和外在状态数据。 内在状态:就…

[内网安全] Windows 本地认证 — NTLM 哈希和 LM 哈希

关注这个专栏的其他相关笔记:[内网安全] 内网渗透 - 学习手册-CSDN博客 0x01:SAM 文件 & Windows 本地认证流程 0x0101:SAM 文件简介 Windows 本地账户的登录密码是存储在系统本地的 SAM 文件中的,在登录 Windows 的时候&am…

类和对象—多态—案例2—制作饮品

案例描述: 制作饮品的大致流程为:煮水-冲泡-倒入杯中-加入辅料 利用多态技术实现本案例,提供抽象制作产品基类,提供子类制作咖啡和茶叶 思路解析: 1. 定义抽象基类 - 创建 AbstractDrinking 抽象类,该类…

YOLOv12本地部署教程——42%速度提升,让高效目标检测触手可及

YOLOv12 是“你只看一次”(You Only Look Once, YOLO)系列的最新版本,于 2025 年 2 月发布。它引入了注意力机制,提升了检测精度,同时保持了高效的实时性能。在保持速度的同时,显著提升了检测精度。例如&am…

SpringBoot3—场景整合:AOT

一、AOT与JIT AOT:Ahead-of-Time(提前编译):程序执行前,全部被编译成机器码 JIT:Just in Time(即时编译): 程序边编译,边运行; 编译:源代码&am…

*VulnHub-FristiLeaks:1.3暴力解法、细节解法,主打软硬都吃,隧道搭建、寻找exp、提权、只要你想没有做不到的姿势

*VulnHub-FristiLeaks:1.3暴力解法、细节解法,主打软硬都吃,隧道搭建、寻找exp、提权、只要你想没有做不到的姿势 一、信息收集 1、扫靶机ip 经典第一步,扫一下靶机ip arp-scan -l 扫描同网段 nmap -sP 192.168.122.0/242、指纹扫描、端口…

20242817李臻《Linux⾼级编程实践》第二周

一、AI对学习内容的总结 第2章 Linux编程环境总结 1. GCC编译器 GCC(GNU Compiler Collection)是GNU项目的一部分,支持多种编程语言,包括C、C、Java、Fortran、Ada等。编译过程:GCC将源程序转换为可执行程序的过程包…