记一次黑名单后缀+文件头双重效验的文件上传和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后:
    • 文件操作正常
    • 命令执行无回显
  • 可能原因:
    1. 权限不足无法拉起cmd
    2. eval函数被禁用 (检查disable_functions)
    3. Webshell工具问题
    4. system函数无法执行 (505 system unable to fork)
    5. 进程链被Defender查杀

4.2 解决方案

  1. 上传独立cmd.exe → 仍失败
  2. 更换命令执行函数:
    • 尝试exec, shell_exec, passthru等 → 无回显
  3. 更换Webshell工具:
    • 冰蝎 → 失败
    • 哥斯拉 → 失败 (报错505 system unable to fork)
  4. 使用大马绕过:
    • 直接上传完整Webshell (非图片马)
    • tasklist命令执行成功
    • 关键点: 必须通过Webshell管理工具直接上传,而非通过上传点制作图片马

4.3 Defender绕过经验

  • 本地测试不足:
    • 本地虚拟机Defender可能弱于生产环境
    • 本地免杀不代表生产环境免杀
  • 进程链查杀:
    • Webshell在w3wp.exe下属于灰进程
    • 执行命令时可能被杀
    • 大马可能使用不同执行链绕过检测

5. 完整攻击流程总结

  1. 信息收集:

    • 使用Fofa识别服务器环境
    • 确认无前端验证
  2. 验证机制分析:

    • 测试文件后缀和文件头组合
    • 确认黑名单+文件头双重校验
  3. 绕过文件上传:

    • 制作图片马
    • 利用Windows ::$DATA流特性
  4. Getshell:

    • 尝试多种Webshell工具
    • 遇到命令执行问题时系统化排查
    • 最终使用大马直接上传绕过
  5. 防御规避:

    • 绕过Defender进程链查杀
    • 注意生产环境与测试环境差异

6. 防御建议

  1. 上传安全增强:

    • 使用白名单而非黑名单
    • 检查文件内容而不仅是文件头
    • 重命名上传文件
  2. 服务器安全:

    • 限制危险函数执行
    • 监控异常进程链
    • 保持Defender更新
  3. 日志监控:

    • 监控异常上传行为
    • 审计文件包含操作

7. 关键知识点备忘

  • Windows ::$DATA流特性
  • 图片马制作技巧
  • Defender进程链查杀机制
  • 不同Webshell工具的特性差异
  • 测试环境与生产环境的差异风险
文件上传与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 图片马制作 注意事项 : 使用尽可能小的图片文件 避免图片中的"脏字符"影响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 下属于灰进程 执行命令时可能被杀 大马可能使用不同执行链绕过检测 5. 完整攻击流程总结 信息收集 : 使用Fofa识别服务器环境 确认无前端验证 验证机制分析 : 测试文件后缀和文件头组合 确认黑名单+文件头双重校验 绕过文件上传 : 制作图片马 利用Windows ::$DATA 流特性 Getshell : 尝试多种Webshell工具 遇到命令执行问题时系统化排查 最终使用大马直接上传绕过 防御规避 : 绕过Defender进程链查杀 注意生产环境与测试环境差异 6. 防御建议 上传安全增强 : 使用白名单而非黑名单 检查文件内容而不仅是文件头 重命名上传文件 服务器安全 : 限制危险函数执行 监控异常进程链 保持Defender更新 日志监控 : 监控异常上传行为 审计文件包含操作 7. 关键知识点备忘 Windows ::$DATA 流特性 图片马制作技巧 Defender进程链查杀机制 不同Webshell工具的特性差异 测试环境与生产环境的差异风险