mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4
1300 字
4 分钟
文件上传漏洞攻防实战
2026-06-09

�.文件上传漏洞攻防实战:为什么�图片�可能是 后⻔? 副标题:MIME 类型不是安全边界!看懂服务器如何被“伪装文件”欺骗 标签: #文件上传漏洞 #Web安全 #渗透测试 #MIME绕过 关联笔记:[[WebShell 上传技巧]]、[[服务器解析漏洞]] 🧠 核心认知(先记住这句) MIME 类型只是“浏览器怎么显示”,不是“服务器能不能执行”。 攻击者常把 PHP 后⻔伪装成 PNG 图片,只要服务器配置有缺陷,“图片”就会变成 WebShell! 🔍 一、MIME 类型到底是什么? 全称:Multipurpose Internet Mail Extensions(多用途互联网邮件扩展) ● ● 实际作用:Web 服务器通过 Content-Type 响应头告诉浏览器: 这是图片 → 直接显示 ○ 这是视频 → 调用播放器 ○ 这是二进制 → 强制下载 ○ 这是 HTML → 渲染网⻚ ○ ✅ 常⻅示例 http 编辑 1 Content-Type: image/png → 浏览器显示图片 2 Content-Type: video/mp4 → 播放视频 3 Content-Type: application/octet-stream → 弹出下载框 4 Content-Type: text/html → 渲染为网⻚ 420

💡 关键点: MIME 类型 ≠ 文件扩展名! 扩展名(如 .php )只是“提示”,真正起作用的是服务器返回的 Content-Type 。 ⚠ 二、MIME 配置错误 = 安全灾难 场景 1:敏感文件被直接下载 ● 原因:服务器未正确配置 .php 、 .env 、 .config 的处理方式 ● 现象:访问 config.php → 浏览器弹出下载框 后果:下载后看到数据库账号、密钥等敏感信息 ● ● 根源:Web 服务器(Apache/Nginx)未将 .php 关联到 PHP 解析器 场景 2:脚本被当作普通文件返回 ● 若返回 Content-Type: application/x-php → 浏览器会直接下载 PHP 源码(而非执行)! 🎯 三、攻击核心:MIME 伪装绕过上传限制 攻击思路

  1. 目标允许上传 .png ,但禁止 .php
  2. 攻击者上传 shell.php ,但重命名为 shell.png
  3. 如果服务器: 仅检查扩展名(不检测文件内容) ○ 且 PHP 解析器配置不当(如泛解析) ○ ○ 或存在路径解析漏洞(如 IIS 6.0 的 .php;.jpg )
  4. 则访问 http://site.com/uploads/shell.png 时,服务器仍会当作 PHP 执行! 💥 成功前提 = 前端/后端验证薄弱 + 服务器配置缺陷 421

🛠 四、常⻅绕过技巧(红队常用) 绕过方式 说明 ⻛险等级 改文件扩展名 shell.php → shell.pn ⚠ 中(若仅前端校验) g 伪造 Content-Type 上传时设置 Content-Type: ⚠ ⚠ 高(绕过部分 WAF) image/png (即使文件是 PHP) 利用解析漏洞 如 Apache ⚠ ⚠ ⚠ 极高 的 AddHandler 泛解析、 Nginx 空字节、IIS 6.0 分号截 断 配合 .htaccess 上传 .htaccess 控制 ⚠ ⚠ 高 MIME 解析(Apache 特有) ✅ 真实案例: 上传 shell.jpg ,但文件头是 , 若服务器开启 auto_prepend_file 或存在解析漏洞 → 直接 getshell。 🔒 五、防御建议(给开发/运维) ✅ 必做措施

  1. 上传目录禁止执行脚本 Nginx 示例: nginx 编辑 ○ 1 location /uploads/ { 2 location ~ .php$ { deny all; } 3 } Apache 示例: apache 编辑 ○ 422

1 <Directory “/var/www/uploads”> 2 php_flag engine off 3 4 2. 使用独立域名托管静态资源 如 static.example.com ,且该域名无任何脚本解析能力 3. 重命名上传文件 使用随机名(如 a1b2c3.png ),不要保留原始扩展名 4. 检测文件真实类型(Magic Bytes) ○ PNG 文件头: 89 50 4E 47 ○ JPEG 文件头: FF D8 FF ○ 不要只信扩展名或 Content-Type 5. 禁用敏感文件直接访问 apache 编辑 1 <Files ~ ”.(php|env|config)$”> 2 Require all denied 3 4 📎 六、附录:快速参考 常⻅文件 Magic Bytes(文件头) 文件类型 十六进制文件头 PNG 89 50 4E 47 0D 0A 1A 0A JPEG FF D8 FF GIF 47 49 46 38 ZIP 50 4B 03 04 PHP 无固定头,但通常含 <?php 423

💡 渗透测试命令: bash 编辑 查看文件头是否真实为图片。 1 xxd shell.png | head -n 1 渗透测试口诀(牢记!) “上传看扩展,执行看配置;MIME 可伪造,文件头才靠谱。” 🔐 总结 MIME 类型 ≠ 安全机制,它只控制“如何展示” ● 真正的安全 = 文件头检测 + 存储隔离 + 执行权限控制 ● 仅靠扩展名或 MIME 验证 = 形同虚设 ● ✅ 最佳实践: 把上传目录当成“垃圾桶”——只读、不可执行、内容严格校验。 📌 Obsidian 使用建议 ● 将本笔记作为 #文件上传漏洞 核心卡片 链接到子主题: ● [[Magic Bytes 文件头检测]] ○ [[Nginx/Apache 安全配置]] ○ [[WebShell 上传与绕过]] ○ 在每日回顾中加入“文件上传防御 checklist” ● 424

分享

如果这篇文章对你有帮助,欢迎分享给更多人!

文件上传漏洞攻防实战
https://lansame.top/posts/file-upload/
作者
Lansame
发布于
2026-06-09
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时

目录