upload-labs通关笔记-第8关 文件上传之点绕过

news2025/5/17 23:05:34

目录

一、点绕过原理

二、deldot()函数

三、源码分析

四、渗透实战

1、构建脚本test8.php

 2、打开靶场

3、bp开启拦截

4、点击上传

5、bp拦截

6、后缀名增加点

7、发包并获取脚本地址

8、访问脚本


本文通过《upload-labs靶场通关笔记系列》来进行upload-labs靶场的渗透实战,本文讲解upload-labs靶场第8关文件点绕过渗透实战。

一、点绕过原理

"点绕过"是文件上传攻击中一种常见的绕过技术,攻击者通过在文件名中特殊位置插入点(.)来绕过服务器的安全校验机制。以下是详细的原理分析:

由于Windows系统有如下特点:

  • 自动去除文件名末尾的点:“test8.php.” → “test8.php”

  • 自动去除空格:“test8.php ”→ “test8.php”

  • 忽略大小写:“test.PHP” → “test.php”

正是因为如上第一个特点,可以构建如下攻击流程

  • 攻击者上传类似的文件“test8.php.”

  • 由于某些系统(如Windows)会自动去除末尾的点,最终存储为 “test.php”

二、deldot()函数

deldot() 是一个用于处理文件上传安全的自定义函数,主要功能是删除文件名末尾的点(.),防止攻击者利用文件命名规则绕过安全检测。它的作用是从字符串尾部开始,从后向前删除点(.) ,直到末尾字符不是点为止。比如文件名 test...php 经该函数处理后可能变为 test.php 。

在upload-labs靶场中,deldot()是一个自定义的函数,在common.h中,具体如下所示。

 接下来对这段代码进行详细注释,具体如下所示。

<?php
/**
 * 此函数用于去除字符串末尾连续的点(.)
 * 如果字符串末尾没有连续的点,则直接返回原字符串
 * 
 * @param string $s 要处理的字符串
 * @return string 处理后的字符串
 */
function deldot($s) {
    // 从字符串的最后一个字符开始遍历,通过 strlen($s) - 1 获取最后一个字符的索引
    for ($i = strlen($s) - 1; $i > 0; $i--) {
        // 使用 substr 函数截取字符串中索引为 $i 的单个字符,存储到变量 $c 中
        $c = substr($s, $i, 1);
        // 检查当前字符是否是字符串的最后一个字符,并且这个字符不是点(.)
        if ($i == strlen($s) - 1 && $c != '.') {
            // 如果满足条件,说明字符串末尾没有连续的点,直接返回原字符串
            return $s;
        }

        // 检查当前字符是否不是点(.)
        if ($c != '.') {
            // 如果当前字符不是点,使用 substr 函数截取从字符串开头到当前字符(包含当前字符)的子字符串并返回
            return substr($s, 0, $i + 1);
        }
    }
    // 如果函数执行到这里,说明整个字符串可能都是点或者循环结束都没有找到非点字符
    return $s;
}
?>

三、源码分析

接下来对upload-labs 第8 关的源码进行审计,很明显这一关卡又是黑名单过滤,与第6关卡一样,相对于第四关和第五关,将“.htacess和.ini”后缀均过滤了,故而无法用第四关和第五关的方法进行渗透。然而相对于第六关卡和第七关卡,缺少了一个deldot函数的处理。经过详细注释的代码如下所示。

<?php
// 初始化文件上传状态标志,默认设置为 false,表示文件未成功上传
$is_upload = false;
// 初始化消息变量,用于存储上传过程中产生的提示信息,初始值为 null
$msg = null;

// 检查是否通过 POST 方式提交了名为 'submit' 的表单元素
// 当用户点击提交按钮时,会触发此逻辑
if (isset($_POST['submit'])) {
    // 检查常量 UPLOAD_PATH 所代表的上传目录是否存在
    // 只有上传目录存在,才能进行文件上传操作
    if (file_exists(UPLOAD_PATH)) {
        // 定义一个数组,包含所有不允许上传的文件扩展名
        // 这里涵盖了常见的脚本文件扩展名(如 PHP、JSP、ASP 等)、网页文件扩展名(如 HTML、HTM)以及一些特殊配置文件扩展名(如 .htaccess、.ini)
        $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",".ini");
        // 从 $_FILES 超全局数组中获取上传文件的原始文件名,并去除文件名首尾的空白字符
        $file_name = trim($_FILES['upload_file']['name']);
        // 使用 strrchr 函数从文件名中提取文件扩展名
        // strrchr 会返回从最后一个点(.)开始到字符串末尾的部分
        $file_ext = strrchr($file_name, '.');
        // 将提取的文件扩展名转换为小写
        // 这样做是为了实现大小写不敏感的扩展名检查
        $file_ext = strtolower($file_ext); 
        // 去除文件扩展名中可能包含的 '::$DATA' 字符串
        // 在 Windows 系统中,'::$DATA' 是一种特殊的文件流标识,攻击者可能会利用它来绕过文件类型检查
        $file_ext = str_ireplace('::$DATA', '', $file_ext);
        // 再次去除文件扩展名首尾的空白字符
        $file_ext = trim($file_ext); 

        // 检查提取并处理后的文件扩展名是否不在禁止上传的扩展名数组中
        if (!in_array($file_ext, $deny_ext)) {
            // 从 $_FILES 超全局数组中获取上传文件在服务器临时存储的路径
            $temp_file = $_FILES['upload_file']['tmp_name'];
            // 拼接上传文件的最终存储路径
            // 将上传目录(UPLOAD_PATH)和文件名组合成完整的路径
            $img_path = UPLOAD_PATH.'/'.$file_name;
            // 使用 move_uploaded_file 函数将临时存储的文件移动到指定的上传路径
            // 此函数确保文件是通过 HTTP POST 上传的,防止恶意文件上传
            if (move_uploaded_file($temp_file, $img_path)) {
                // 如果文件移动成功,将文件上传状态标志设置为 true,表示文件上传成功
                $is_upload = true;
            } else {
                // 如果文件移动失败,将错误信息存储到 $msg 变量中
                $msg = '上传出错!';
            }
        } else {
            // 如果文件扩展名在禁止上传的数组中,将错误信息存储到 $msg 变量中
            $msg = '此文件类型不允许上传!';
        }
    } else {
        // 如果上传目录不存在,将错误信息存储到 $msg 变量中,并提示用户手工创建该目录
        $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
    }
}
?>

从上图可知,源码中没有$file_name = deldot($file_ext);服务器无法实现将文件后的.过滤,所以可以在文件末尾添加一个“.”,这样就可以绕过黑名单的限制

例如:上传"test.php"文件,抓包后在文件名后添加一个点变为"test8.php.",上传到服务器的时候,得到的后缀就是"test8.php.",从而绕过黑名单的限制。当"test8.php."文件上传到windows服务器后,会被windows系统自动去掉不符合规则符号后面的内容(也就是将".php."中最尾部的点去掉),文件末尾就变回了".php", 这样文件名又恢复成为"test.php",可以成功渗透。

四、渗透实战

1、构建脚本test8.php

<?php
phpinfo();
?>

 2、打开靶场

 打开靶场第8关,浏览选择该脚本,但不点击上传。

3、bp开启拦截

4、点击上传

5、bp拦截

bp捕获到上传报文,下图红框的部分即为需要修改的文件名,需要将".php"后缀改为".php.",修改之前文件名为”test8.php“,如下所示

6、后缀名增加点

test8.php后添加一个点,变为“test8.php.”,修改后效果如下所示。

7、发包并获取脚本地址

将bp的inception设置为off,此时修改后的报文发送成功。

回到靶场的Pass08关卡,图片已经上传成功,在图片处右键复制图片地址。

右键图片获取图片地址,如下所示获取到图片URL。

http://127.0.0.1/upload-labs/upload/test8.php.

8、访问脚本

 如下所示访问test8.php脚本获取到服务器的php信息,证明文件上传成功。

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

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

相关文章

PCL PolygonMesh 与 TextureMesh 源码阅读与简单测试

Title: PCL PolygonMesh 与 TextureMesh 源码阅读与简单测试 文章目录 I . PolygonMesh1. PolygonMesh 结构体2. Vertices 结构体与点云索引3. 测试 PolygonMesh II. TextureMesh1. TextureMesh 结构体2. TexMaterial 结构体3. 纹理坐标与纹理坐标索引4. 测试 TextureMesh 以下…

量子算法:开启计算新时代的技术密码

摘要 量子算法是利用量子力学特性&#xff08;如叠加态、纠缠、干涉&#xff09;设计的计算模型&#xff0c;在特定问题上相比经典算法具有指数级加速优势。本文深入探讨了量子算法的核心原理、代表性算法及其在多个领域的应用&#xff0c;分析了量子算法面临的挑战与未来发展…

多线程代码案例-1 单例模式

单例模式 单例模式是开发中常见的设计模式。 设计模式&#xff0c;是我们在编写代码时候的一种软性的规定&#xff0c;也就是说&#xff0c;我们遵守了设计模式&#xff0c;代码的下限就有了一定的保证。设计模式有很多种&#xff0c;在不同的语言中&#xff0c;也有不同的设计…

CSS实现文本自动平衡text-wrap: balance

不再有排版孤行和寡行 我们都知道那些标题&#xff0c;最后一个单词换行并单独站在新行上&#xff0c;破坏了视觉效果&#xff0c;看起来很奇怪。当然&#xff0c;有老式的 手动换行或将内容分成不同部分。但您听说过text-wrap: balance吗&#xff1f; 通过应用text-wrap: bal…

mac M芯片运行docker-desktop异常问题

虽然mac已经迭代到m4了&#xff0c;但官方的docker-desktop运行仍然有问题&#xff0c;包括但不限于&#xff1a; 命令行docker找不到docker-desk打不开docker-desktop闪退容器起不来 尝试不同版本后&#xff0c;看到了其他可以在mac跑docker的开源方法&#xff0c;更简单、轻…

事件响应策略规范模版

事件响应策略 一、事件分级定义 根据事件对业务的影响程度和紧急程度,将事件分为 4个等级(P1-P4),明确各级事件的判定标准:、 二、响应时效承诺 响应时间(从事件确认到首次回复) P1 事件:15 分钟内响应(724 小时电话 / 工单优先接入) P2 事件:30 分钟内响应(工…

MGX:多智能体管理开发流程

MGX的多智能体团队如何通过专家混合系统采用全新方法,彻底改变开发流程,与当前的单一智能体工具截然不同。 Lovable和Cursor在自动化我们的特定开发流程方面取得了巨大飞跃,但问题是它们仅解决软件开发的单一领域。 这就是MGX(MetaGPT X)的用武之地,它是一种正在重新定…

采购流程规范化如何实现?日事清流程自动化助力需求、采购、财务高效协作

采购审批流程全靠人推进&#xff0c;内耗严重&#xff0c;效率低下&#xff1f; 花重金上了OA&#xff0c;结果功能有局限、不灵活&#xff1f; 问题出在哪里&#xff1f;是我们的要求太多、太苛刻吗&#xff1f;NO&#xff01; 流程名称&#xff1a; 采购审批管理 流程功能…

[模型部署] 3. 性能优化

&#x1f44b; 你好&#xff01;这里有实用干货与深度分享✨✨ 若有帮助&#xff0c;欢迎&#xff1a;​ &#x1f44d; 点赞 | ⭐ 收藏 | &#x1f4ac; 评论 | ➕ 关注 &#xff0c;解锁更多精彩&#xff01;​ &#x1f4c1; 收藏专栏即可第一时间获取最新推送&#x1f514;…

Vue3 加快页面加载速度 使用CDN外部库的加载 提升页面打开速度 服务器分发

介绍 CDN&#xff08;内容分发网络&#xff09;通过全球分布的边缘节点&#xff0c;让用户从最近的服务器获取资源&#xff0c;减少网络延迟&#xff0c;显著提升JS、CSS等静态文件的加载速度。公共库&#xff08;如Vue、React、Axios&#xff09;托管在CDN上&#xff0c;减少…

接触感知 钳位电路分析

以下是NG板接触感知电路的原理图。两极分别为P3和P4S&#xff0c;电压值P4S < P3。 电路结构分两部分&#xff0c;第一部分对输入电压进行分压钳位。后级电路使用LM113比较器芯片进行电压比较&#xff0c;输出ST接触感知信号。 钳位电路输出特性分析 输出电压变化趋势&a…

使用 gcloud CLI 自动化管理 Google Cloud 虚拟机

被操作的服务器&#xff0c;一定要开启API完全访问权限&#xff0c;你的电脑安装gcloud CLI前一定要先安装Python3&#xff01; 操作步骤 下载地址&#xff0c;安装大概需要十分钟&#xff1a;https://cloud.google.com/sdk/docs/install?hlzh-cn#windows 选择你需要的版本&a…

SQL语句,索引,视图,存储过程以及触发器

一、初识MySQL 1.数据库 按照数据结构来组织、存储和管理数据的仓库&#xff1b;是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合&#xff1b; 2.OLTP与OLAP OLTP&#xff08; On-Line transaction processing &#xff09;翻译为联机事务处理&am…

7. 进程控制-进程替换

目录 1. 进程替换 1.1 单进程版&#xff1a; 1.2 进程替换的原理 1.3 多进程版-验证各种程序替换接口 2. 进程替换的各种接口 2.1 execl 2.2 execlp 2.3 execv 2.4 execvp 2.5 execle 1. 进程替换 上图为程序替换的接口&#xff0c;之后会详细介绍。 1.1 单进程版&am…

理解 C# 中的各类指针

前言 变量可以理解成是一块内存位置的别名&#xff0c;访问变量也就是访问对应内存中的数据。 指针是一种特殊的变量&#xff0c;它存储了一个内存地址&#xff0c;这个内存地址代表了另一块内存的位置。 指针指向的可以是一个变量、一个数组元素、一个对象实例、一块非托管内存…

真题卷001——算法备赛

蓝桥杯2024年C/CB组国赛卷 1.合法密码 问题描述 小蓝正在开发自己的OJ网站。他要求用户的密码必须符合一下条件&#xff1a; 长度大于等于8小于等于16必须包含至少一个数字字符和至少一个符号字符 请计算一下字符串&#xff0c;有多少个子串可以当作合法密码。字符串为&am…

Vue3中实现轮播图

目录 1. 轮播图介绍 2. 实现轮播图 2.1 准备工作 1、准备至少三张图片&#xff0c;并将图片文件名改为数字123 2、搭好HTML的标签 3、写好按钮和图片标签 ​编辑 2.2 单向绑定图片 2.3 在按钮里使用方法 2.4 运行代码 3. 完整代码 1. 轮播图介绍 首先&#xff0c;什么是…

微信小程序 自定义图片分享-绘制数据图片以及信息文字

一 、需求 从数据库中读取头像&#xff0c;姓名电话等信息&#xff0c;当分享给女朋友时&#xff0c;每个信息不一样 二、实现方案 1、先将数据库中需要的头像姓名信息读取出来加载到data 数据项中 data:{firstName:, // 姓名img:, // 头像shareImage:,// 存储临时图片 } 2…

全栈项目中是否可以实现统一错误处理链?如果可以,这条链路该如何设计?需要哪些技术支撑?是否能同时满足性能、安全性和用户体验需求?

在复杂系统中&#xff0c;错误一旦出现&#xff0c;可能不断扩散&#xff0c;直到让整个系统宕机。尤其在一个全栈项目中&#xff0c;从数据库到服务器端逻辑、再到前端用户界面&#xff0c;错误可能在任意一个环节产生。如果我们不能在全栈范围内实现统一的错误处理机制&#…

排序01:多目标模型

用户-笔记的交互 对于每篇笔记&#xff0c;系统记录曝光次数、点击次数、点赞次数、收藏次数、转发次数。 点击率点击次数/曝光次数 点赞率点赞次数/点击次数 收藏率收藏次数/点击次数 转发率转发次数/点击次数 转发是相对较少的&#xff0c;但是非常重要&#xff0c;例如转发…