上传漏洞有哪几种绕过方式?全面解析6大类20+种实战绕过技巧

在当今的Web安全攻防体系中,文件上传漏洞(File Upload Vulnerability)始终占据着举足轻重的地位。它允许攻击者将恶意脚本(如WebShell)上传至服务器,并通过访问该文件实现远程代码执行(RCE),最终完全控制目标服务器。

上传漏洞有哪几种绕过方式?全面解析6大类20+种实战绕过技巧

然而,随着安全意识的提升,开发者和运维人员普遍会在系统中部署各种上传限制策略。因此,对于渗透测试人员和红队成员而言,掌握各类绕过技术成为成功利用上传漏洞的关键。

本文将系统梳理文件上传漏洞的常见过滤机制,并深入剖析六大类、超过20种实用的绕过方式,助你从理论到实战全面掌握这一核心攻防技能。


什么是文件上传漏洞?

文件上传功能是现代Web应用的基础组件之一,用于用户上传头像、附件或媒体资源。但若服务器对上传文件的类型、内容、路径等缺乏严格校验,攻击者便可能上传一个可执行的PHP、JSP或ASPX文件(俗称“小马”或“WebShell”),从而获得与服务器交互的权限。

核心危害

  • 远程命令执行(GetShell)

  • 数据库窃取与篡改

  • 内网横向渗透(如上传Cobalt Strike beacon)

  • 网站挂马与钓鱼


常见的上传过滤机制

为了防止恶意文件上传,常见的防护手段包括:

  1. 前端JavaScript校验

  2. Content-Type / MIME类型检查

  3. 后缀名黑名单/白名单

  4. 文件内容检测(如图片头校验)

  5. 文件大小限制

  6. 服务端二次渲染或重命名

而我们的任务,就是针对这些机制逐一寻找突破口。


六大类文件上传绕过方式详解

🔹 类型一:前端过滤绕过

原理:许多老旧系统仅在浏览器端使用JavaScript进行文件类型校验,这种验证极易被绕过。

绕过方法

  • 禁用JavaScript:在浏览器设置中关闭JS执行,直接上传任意文件。

  • Burp Suite抓包改包:使用Burp拦截上传请求,修改filename="shell.php"并保留原始文件内容。

  • F12修改HTML代码:手动编辑input元素的accept属性为*/*application/octet-stream

📌 判断依据:上传时无网络请求发出 → 基本可判定为纯前端校验。


🔹 类型二:MIME类型绕过

原理:服务器通过HTTP头中的Content-Type字段判断文件类型(如image/jpeg)。此值由客户端发送,可伪造。

绕过方法

  • 抓包后将Content-Type: text/php改为Content-Type: image/png

  • 使用Python脚本自动化构造合法MIME头上传木马

1POST /upload.php HTTP/1.1
2Host: target.com
3Content-Type: multipart/form-data; boundary=----WebKitFormBoundary...
4
5------WebKitFormBoundary...
6Content-Disposition: form-data; name="file"; filename="shell.php"
7Content-Type: image/jpeg
8
9<?php system($_REQUEST['cmd']); ?>
10------WebKitFormBoundary...--

⚠️ 注意:需配合其他绕过方式(如后缀名处理)才能生效。


🔹 类型三:文件扩展名绕过(黑名单 vs 白名单)

3.1 黑名单绕过的常见手法

当服务器禁止.php.jsp等后缀时,可通过以下方式绕过:

绕过方式示例说明
大小写混合.pHp.PhP5Windows不区分大小写
双写后缀.pphphp删除黑名单词后剩余.php
特殊后缀解析.php3.php4.phtml部分配置支持这些别名
点号绕过shell.php. 或 shell.php 末尾空格或点被自动去除
::$DATA绕过shell.php::$DATAWindows NTFS流特性
短文件名shell~1.php利用Windows 8.3格式
3.2 白名单绕过(更难但仍有突破口)

即使只允许.jpg, .png等图片格式,仍可尝试:

  • 0x00截断攻击(Null Byte Injection)
    构造文件名为shell.php%00.jpg,PHP < 5.3.4版本中,底层C函数会以\0为字符串结尾,实际写入shell.php

  • 路径拼接漏洞
    如上传shell.php/.jpg,某些逻辑错误可能导致解析为shell.php


🔹 类型四:文件内容检测绕过

有些系统不仅看后缀,还会读取文件头部信息(Magic Number)来判断是否为合法图片。

绕过策略

检测方式绕过方法
文件头校验在PHP一句话前加上GIF头:GIF89a<?php eval($_POST[1]);?>
getimagesize()使用工具生成含恶意代码的合法图片(如PNG的PLTE块注入)
exif_imagetype()同上,构造“合法”图像元数据

💡 推荐工具:jpg_payload.php 脚本可在JPG文件中嵌入WebShell并保持可渲染性。


🔹 类型五:条件竞争(Race Condition)

原理:利用服务器“先上传 → 再删除”的逻辑漏洞,在极短时间内访问刚上传的文件,使其在被删除前被执行。

典型场景代码

1move_uploaded_file($_FILES['file']['tmp_name'], 'uploads/' . $_FILES['file']['name']);
2unlink('uploads/' . $_FILES['file']['name']); // 立即删除

攻击方式

  1. 编写一个创建WebShell的PHP木马(如写入backdoor.php

  2. 使用Burp Intruder或Python脚本高并发访问该临时文件

  3. unlink()执行前触发PHP解析,完成持久化植入

🧪 此类漏洞常出现在临时文件处理流程中,自动化工具成功率较高。


🔹 类型六:高级绕过与组合技

6.1 .htaccess解析绕过(Apache特有)
  • 上传自定义.htaccess文件,内容为:

    1SetHandler application/x-httpd-php
  • 配合上传shell.png,Apache会将其当作PHP执行

6.2 二次渲染绕过
  • 上传一张包含WebShell的图片

  • 服务器“处理”图片(如加水印)后,部分数据块未清除恶意代码

  • 新生成的图片仍可触发解析漏洞

6.3 文件包含联动
  • 先上传非PHP后缀的恶意文件(如.phar.log

  • 利用本地文件包含(LFI)漏洞包含该文件,强制PHP引擎解析执行


如何有效防御文件上传漏洞?

作为开发者或安全工程师,应采取多层次防护策略:

强制白名单机制:仅允许.jpg, .png, .pdf等必要格式
重命名上传文件:使用UUID或时间戳命名,避免原名解析
隔离上传目录:设置disable_functions,禁止执行PHP脚本
文件内容扫描:使用ClamAV等杀毒引擎检测恶意代码
WAF防护:部署ModSecurity等规则拦截可疑上传行为
最小权限原则:上传目录禁止执行权限(chmod 644)


攻防对抗永不停歇

文件上传漏洞的本质是信任边界失控。任何依赖客户端或单一维度的校验都不可靠。攻击者不断探索新的绕过技巧,而防守方则需构建纵深防御体系。

🔐 安全准则提醒
本文内容仅供合法渗透测试与安全研究使用!未经授权的攻击行为违反《网络安全法》,切勿以身试法!

掌握这些绕过技术,不仅能提升你的渗透能力,更能帮助你在开发中写出更安全的代码。真正的高手,既懂进攻,也擅防守。

发表评论

评论列表

还没有评论,快来说点什么吧~