Proxy / WAF Protections Bypass
通过路径名操作绕过 Nginx ACL 规则
技术 来自这项研究。
Nginx 规则示例:
为了防止绕过,Nginx 在检查路径之前执行路径规范化。然而,如果后端服务器执行不同的规范化(移除 Nginx 不移除的字符),则可能绕过此防御。
NodeJS - Express
Nginx 版本 | Node.js 绕过字符 |
1.22.0 |
|
1.21.6 |
|
1.20.2 |
|
1.18.0 |
|
1.16.1 |
|
Flask
Nginx 版本 | Flask 绕过字符 |
1.22.0 |
|
1.21.6 |
|
1.20.2 |
|
1.18.0 |
|
1.16.1 |
|
Spring Boot
Nginx 版本 | Spring Boot 绕过字符 |
1.22.0 |
|
1.21.6 |
|
1.20.2 |
|
1.18.0 |
|
1.16.1 |
|
PHP-FPM
Nginx FPM 配置:
Nginx 被配置为阻止对 /admin.php
的访问,但可以通过访问 /admin.php/index.php
来绕过此限制。
如何防止
绕过 Mod Security 规则
路径混淆
在这篇文章中 解释了 ModSecurity v3(直到 3.0.12)不正确地实现了 REQUEST_FILENAME
变量,该变量应该包含访问的路径(直到参数开始)。这是因为它执行了 URL 解码以获取路径。
因此,像 http://example.com/foo%3f';alert(1);foo=
这样的请求在 mod security 中将认为路径只是 /foo
,因为 %3f
被转换为 ?
,结束了 URL 路径,但实际上服务器接收到的路径将是 /foo%3f';alert(1);foo=
。
变量 REQUEST_BASENAME
和 PATH_INFO
也受到此错误的影响。
在 Mod Security 的版本 2 中发生了类似的情况,允许绕过一种保护,该保护阻止用户访问与备份文件相关的特定扩展名的文件(例如 .bak
),只需通过发送点 URL 编码为 %2e
,例如:https://example.com/backup%2ebak
。
绕过 AWS WAF ACL
格式错误的头部
这项研究 提到可以通过发送一个“格式错误”的头部来绕过应用于 HTTP 头部的 AWS WAF 规则,该头部未被 AWS 正确解析,但被后端服务器解析。
例如,发送以下请求,在头部 X-Query 中包含 SQL 注入:
可以绕过AWS WAF,因为它无法理解下一行是头部值的一部分,而NODEJS服务器可以(这个问题已被修复)。
通用WAF绕过
请求大小限制
通常,WAF对请求的长度有一定的限制,如果POST/PUT/PATCH请求超过该限制,WAF将不会检查该请求。
对于AWS WAF,您可以查看文档:
可以检查的应用负载均衡器和AWS AppSync保护的Web请求体的最大大小 | 8 KB |
可以检查的CloudFront、API Gateway、Amazon Cognito、App Runner和Verified Access保护的Web请求体的最大大小** | 64 KB |
来自Azure文档:
较旧的Web应用防火墙使用核心规则集3.1(或更低版本)允许大于128 KB的消息,通过关闭请求体检查,但这些消息不会被检查是否存在漏洞。对于较新版本(核心规则集3.2或更高版本),可以通过禁用最大请求体限制来实现。当请求超过大小限制时:
如果预防模式:记录并阻止请求。
如果检测模式:检查到限制,忽略其余部分,并在Content-Length
超过限制时记录。
来自Akamai:
默认情况下,WAF仅检查请求的前8KB。通过添加高级元数据,可以将限制增加到128KB。
来自Cloudflare:
最多128KB。
混淆
Unicode 兼容性
根据 Unicode 规范化的实现(更多信息 这里),共享 Unicode 兼容性的字符可能能够绕过 WAF 并作为预期的有效负载执行。兼容字符可以在 这里 找到。
示例
H2C Smuggling
Upgrade Header SmugglingIP Rotation
https://github.com/ustayready/fireprox: 生成一个API网关URL以供ffuf使用
https://github.com/rootcathacking/catspin: 类似于fireprox
https://github.com/PortSwigger/ip-rotate: 使用API网关IP的Burp Suite插件
https://github.com/fyoorer/ShadowClone: 根据输入文件大小和拆分因子动态确定激活的容器实例数量,输入被拆分为多个块以进行并行执行,例如100个实例处理来自10,000行输入文件的100个块,拆分因子为100行。
Regex Bypasses
可以使用不同的技术来绕过防火墙上的正则表达式过滤器。示例包括交替大小写、添加换行符和编码有效负载。各种绕过的资源可以在PayloadsAllTheThings和OWASP找到。以下示例来自这篇文章。
工具
nowafpls: Burp 插件,通过长度向请求添加垃圾数据以绕过 WAF
参考资料
Last updated