我的WafBypass之道(Upload篇)
字数 2158 2025-08-29 08:31:42

WAF Bypass 文件上传绕过技术详解

0x00 前言

文件上传WAF绕过技术需要结合实战经验与系统特性,本文总结了文件上传WAF检测的关键点及多种绕过方法。

0x01 WAF检测点分析

WAF通常会检查以下内容:

  • 请求的URL
  • Boundary边界
  • MIME类型
  • 文件扩展名
  • 文件内容

常见扩展名黑名单

asp|asa|cer|cdx|aspx|ashx|ascx|asax
php|php2|php3|php4|php5|asis|htaccess
htm|html|shtml|pwml|phtml|phtm|js|jsp
vbs|asis|sh|reg|cgi|exe|dll|com|bat|pl|cfc|cfm|ini

测试前准备工作

  1. 确认环境信息:
    • 语言(PHP/ASP/JSP等)
    • 容器(Apache/IIS/Nginx等)
    • 系统(Windows/Linux)及版本
  2. 确认上传限制:
    • 允许上传的文件格式
    • 是否允许任意类型文件上传
  3. 确认文件处理方式:
    • 是否会被重命名
    • 是否进行二次渲染

0x02 容器特性绕过

Apache解析漏洞

  • 版本:1.X & 2.X
  • 原理:从后向前识别扩展名,直到遇见可识别的扩展名
  • 示例shell.php.xxx可能被解析为PHP文件

IIS6.0解析漏洞

  1. 目录解析

    • 目录名包含.asp.asa.cer时,该目录下所有文件按ASP解析
    • 示例:/upload.asp/shell.jpg会被当作ASP执行
  2. 分号截断

    • 文件名包含.asp;.asa;.cer;优先使用ASP解析
    • 示例:shell.asp;.jpg会被当作ASP执行

Nginx解析漏洞

  1. 版本:0.5., 0.6., 0.7 <= 0.7.65, 0.8 <= 0.8.37

    • 示例:上传shell.jpg,访问shell.jpg.php
  2. 版本:0.8.41 - 1.5.6

    • 示例:上传shell.jpg,访问shell.jpg%20.php

PHP CGI解析漏洞

  • 环境:IIS 7.0/7.5或Nginx < 0.8.3
  • 条件cgi.fix_pathinfo=1
  • 方法:上传shell.jpg,访问shell.jpg/shell.php

多Content-Disposition绕过

  • 原理:IIS取第一个Content-Disposition,WAF可能取最后一个
  • 示例
    Content-Disposition: form-data; name="file"; filename="shell.asp"
    Content-Disposition: form-data; name="file"; filename="shell.jpg"
    

非常规请求格式

  • 示例
    Content-Type: application/octet-stream
    Content-Disposition: form-data; name="file"; filename="shell.asp"
    

.htaccess利用

  • 方法:上传包含以下内容的.htaccess文件:
    AddType application/x-httpd-php .jpg
    

0x03 系统特性绕过

Windows特殊字符

  • 方法:使用ASCII > 127的字符
  • 示例shell.php{%80-%99}

exee扩展名

  • 方法:将.exe改为.exee

NTFS ADS特性

  1. 点号截断

    • 示例:shell.php......
  2. 数据流特性

    • 示例:shell.php::$DATA

0x04 WAF缺陷利用

边界匹配不严谨

  1. 添加空格

    Content-Type: multipart/form-data; boundary 4714631421141173021852555099
    
  2. 边界不一致

    • 请求头与正文使用不同的boundary

MIME类型修改

  • 示例:修改Content-Type为非标准值

超长数据绕过

  1. 超长文件名

    • 示例:shell.asp;王王王...王王王.jpg(大量中文字符)
  2. 超长Content-Disposition

    • 构造超长的header字段

其他技巧

  1. 大小写绕过

    • 示例:.PhP.aSp
  2. 特殊位置插入换行

    • 在header字段中插入\n
  3. 双扩展名

    • 示例:shell.php.jpg

0x05 30种绕过姿势总结

  1. filename放在content-type下面
  2. .asp{80-90}
  3. NTFS ADS利用
  4. .asp...
  5. boundary不一致
  6. IIS6分号截断:asp.asp;asp.jpg
  7. Apache解析漏洞:php.php.ddd
  8. boundary和content-disposition间插入换行
  9. hello.php:a.jpg然后hello.<<<
  10. filename=php.php
  11. filename="a.txt";filename="a.php"
  12. name=\n"file";filename="a.php"
  13. content-disposition:\n
  14. .htaccess文件利用
  15. a.jpg.\nphp
  16. 去掉content-disposition的form-data字段
  17. PHP<5.3单双引号截断
  18. 删除content-disposition: form-data;
  19. content-disposition\00:
  20. {char}+content-disposition
  21. header中content-type后加tab
  22. header中content-type: multipart/form-DATA(大小写)
  23. 后缀名大写:.PHP
  24. Content-Type: multipart/form-data;\n
  25. .asp空格
  26. .asp0x00.jpg截断
  27. 双boundary
  28. file\nname="php.php"
  29. header中content-type后加空格
  30. form-data字段与name字段交换位置

0x06 总结

文件上传WAF绕过关键在于:

  1. 准确判断WAF拦截点
  2. 结合后端环境特性(语言/容器/系统版本)
  3. 灵活运用各种特性组合
  4. 关注边界条件和非标准实现

实际测试中需要根据具体环境选择合适的绕过方法,并注意观察服务器响应以判断绕过是否成功。

WAF Bypass 文件上传绕过技术详解 0x00 前言 文件上传WAF绕过技术需要结合实战经验与系统特性,本文总结了文件上传WAF检测的关键点及多种绕过方法。 0x01 WAF检测点分析 WAF通常会检查以下内容: 请求的URL Boundary边界 MIME类型 文件扩展名 文件内容 常见扩展名黑名单 测试前准备工作 确认环境信息: 语言(PHP/ASP/JSP等) 容器(Apache/IIS/Nginx等) 系统(Windows/Linux)及版本 确认上传限制: 允许上传的文件格式 是否允许任意类型文件上传 确认文件处理方式: 是否会被重命名 是否进行二次渲染 0x02 容器特性绕过 Apache解析漏洞 版本 :1.X & 2.X 原理 :从后向前识别扩展名,直到遇见可识别的扩展名 示例 : shell.php.xxx 可能被解析为PHP文件 IIS6.0解析漏洞 目录解析 : 目录名包含 .asp 、 .asa 、 .cer 时,该目录下所有文件按ASP解析 示例: /upload.asp/shell.jpg 会被当作ASP执行 分号截断 : 文件名包含 .asp; 、 .asa; 、 .cer; 优先使用ASP解析 示例: shell.asp;.jpg 会被当作ASP执行 Nginx解析漏洞 版本 :0.5. , 0.6. , 0.7 <= 0.7.65, 0.8 <= 0.8.37 示例:上传 shell.jpg ,访问 shell.jpg.php 版本 :0.8.41 - 1.5.6 示例:上传 shell.jpg ,访问 shell.jpg%20.php PHP CGI解析漏洞 环境 :IIS 7.0/7.5或Nginx < 0.8.3 条件 : cgi.fix_pathinfo=1 方法 :上传 shell.jpg ,访问 shell.jpg/shell.php 多Content-Disposition绕过 原理 :IIS取第一个Content-Disposition,WAF可能取最后一个 示例 : 非常规请求格式 示例 : .htaccess利用 方法 :上传包含以下内容的 .htaccess 文件: 0x03 系统特性绕过 Windows特殊字符 方法 :使用ASCII > 127的字符 示例 : shell.php{%80-%99} exee扩展名 方法 :将 .exe 改为 .exee NTFS ADS特性 点号截断 : 示例: shell.php...... 数据流特性 : 示例: shell.php::$DATA 0x04 WAF缺陷利用 边界匹配不严谨 添加空格 : 边界不一致 : 请求头与正文使用不同的boundary MIME类型修改 示例 :修改 Content-Type 为非标准值 超长数据绕过 超长文件名 : 示例: shell.asp;王王王...王王王.jpg (大量中文字符) 超长Content-Disposition : 构造超长的header字段 其他技巧 大小写绕过 : 示例: .PhP 、 .aSp 特殊位置插入换行 : 在header字段中插入 \n 双扩展名 : 示例: shell.php.jpg 0x05 30种绕过姿势总结 filename放在content-type下面 .asp{80-90} NTFS ADS利用 .asp... boundary不一致 IIS6分号截断:asp.asp;asp.jpg Apache解析漏洞:php.php.ddd boundary和content-disposition间插入换行 hello.php:a.jpg然后hello.<< < filename=php.php filename="a.txt";filename="a.php" name=\n"file";filename="a.php" content-disposition:\n .htaccess文件利用 a.jpg.\nphp 去掉content-disposition的form-data字段 PHP <5.3单双引号截断 删除content-disposition: form-data; content-disposition\00: {char}+content-disposition header中content-type后加tab header中content-type: multipart/form-DATA(大小写) 后缀名大写:.PHP Content-Type: multipart/form-data;\n .asp空格 .asp0x00.jpg截断 双boundary file\nname="php.php" header中content-type后加空格 form-data字段与name字段交换位置 0x06 总结 文件上传WAF绕过关键在于: 准确判断WAF拦截点 结合后端环境特性(语言/容器/系统版本) 灵活运用各种特性组合 关注边界条件和非标准实现 实际测试中需要根据具体环境选择合适的绕过方法,并注意观察服务器响应以判断绕过是否成功。