记一次黑名单后缀+文件头双重效验的文件上传和getshell命令执行绕过
字数 1517 2025-08-23 18:31:18
文件上传与Getshell绕过技术详解
1. 环境分析
- 网站架构: Apache + PHP
- 操作系统: Windows Server
- 上传点验证方式: 服务端验证(无前端JS验证)
- 安全机制: 文件后缀黑名单 + 文件头双重校验
2. 验证机制分析
2.1 后缀名验证
- 黑名单机制验证:
- 上传
.phpabcde后缀文件可以显示 → 确认是黑名单而非白名单 - 常见黑名单绕过尝试:
- 大小写绕过 (如
.Php) → 失败 - 前后加空格/点 (如
空格.php,.php.) → 失败 - 替代扩展名测试:
.phps→ 可上传但无法解析.php2-.php7,.pht,.phtml等 → 失败
- Windows特性绕过:
::$DATA流 → 成功 (上传后删除后缀可解析)
- 大小写绕过 (如
- 上传
2.2 文件头验证
- 测试组合:
- 正常PHP文件改后缀 → 失败 (校验文件头)
- PNG文件头+PHP后缀 → 失败 (校验后缀)
- 确认是双重校验机制
3. 绕过技术
3.1 图片马制作
copy small.jpg /b + phpinfo.php /a phpinfo.jpg
- 注意事项:
- 使用尽可能小的图片文件
- 避免图片中的"脏字符"影响PHP代码解析
3.2 Windows特性绕过
::$DATA流特性:- 上传
shell.php::$DATA - 访问时删除
::$DATA部分 →shell.php
- 上传
4. Getshell与Defender绕过
4.1 初始问题
- 上传Webshell后:
- 文件操作正常
- 命令执行无回显
- 可能原因:
- 权限不足无法拉起cmd
eval函数被禁用 (检查disable_functions)- Webshell工具问题
system函数无法执行 (505 system unable to fork)- 进程链被Defender查杀
4.2 解决方案
- 上传独立cmd.exe → 仍失败
- 更换命令执行函数:
- 尝试
exec,shell_exec,passthru等 → 无回显
- 尝试
- 更换Webshell工具:
- 冰蝎 → 失败
- 哥斯拉 → 失败 (报错
505 system unable to fork)
- 使用大马绕过:
- 直接上传完整Webshell (非图片马)
tasklist命令执行成功- 关键点: 必须通过Webshell管理工具直接上传,而非通过上传点制作图片马
4.3 Defender绕过经验
- 本地测试不足:
- 本地虚拟机Defender可能弱于生产环境
- 本地免杀不代表生产环境免杀
- 进程链查杀:
- Webshell在
w3wp.exe下属于灰进程 - 执行命令时可能被杀
- 大马可能使用不同执行链绕过检测
- Webshell在
5. 完整攻击流程总结
-
信息收集:
- 使用Fofa识别服务器环境
- 确认无前端验证
-
验证机制分析:
- 测试文件后缀和文件头组合
- 确认黑名单+文件头双重校验
-
绕过文件上传:
- 制作图片马
- 利用Windows
::$DATA流特性
-
Getshell:
- 尝试多种Webshell工具
- 遇到命令执行问题时系统化排查
- 最终使用大马直接上传绕过
-
防御规避:
- 绕过Defender进程链查杀
- 注意生产环境与测试环境差异
6. 防御建议
-
上传安全增强:
- 使用白名单而非黑名单
- 检查文件内容而不仅是文件头
- 重命名上传文件
-
服务器安全:
- 限制危险函数执行
- 监控异常进程链
- 保持Defender更新
-
日志监控:
- 监控异常上传行为
- 审计文件包含操作
7. 关键知识点备忘
- Windows
::$DATA流特性 - 图片马制作技巧
- Defender进程链查杀机制
- 不同Webshell工具的特性差异
- 测试环境与生产环境的差异风险