Proxy / WAF Protections Bypass

使用路径名操纵绕过 Nginx ACL 规则
来自此研究的技术。
Nginx 规则示例:
location = /admin {
deny all;
}
location = /admin/ {
deny all;
}
为了防止绕过,Nginx在检查之前执行路径规范化。然而,如果后端服务器执行不同的规范化(删除Nginx不删除的字符),可能会绕过此防御。
NodeJS - Express
Nginx版本
Node.js绕过字符
1.22.0
\xA0
1.21.6
\xA0
1.20.2
\xA0
, \x09
, \x0C
1.18.0
\xA0
, \x09
, \x0C
1.16.1
\xA0
, \x09
, \x0C
Flask
Nginx版本
Flask绕过字符
1.22.0
\x85
, \xA0
1.21.6
\x85
, \xA0
1.20.2
\x85
, \xA0
, \x1F
, \x1E
, \x1D
, \x1C
, \x0C
, \x0B
1.18.0
\x85
, \xA0
, \x1F
, \x1E
, \x1D
, \x1C
, \x0C
, \x0B
1.16.1
\x85
, \xA0
, \x1F
, \x1E
, \x1D
, \x1C
, \x0C
, \x0B
Spring Boot
Nginx版本
Spring Boot绕过字符
1.22.0
;
1.21.6
;
1.20.2
\x09
, ;
1.18.0
\x09
, ;
1.16.1
\x09
, ;
PHP-FPM
Nginx FPM配置:
location = /admin.php {
deny all;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.1-fpm.sock;
}
Nginx 被配置为阻止访问 /admin.php
,但可以通过访问 /admin.php/index.php
来绕过此限制。
如何防止
location ~* ^/admin {
deny all;
}
绕过 Mod 安全规则
路径混淆
在这篇文章中解释了 ModSecurity v3(直到3.0.12版本)**不正确地实现了REQUEST_FILENAME
**变量,该变量应该包含访问的路径(直到参数的开始)。这是因为它执行了URL解码以获取路径。
因此,在 mod 安全中,像http://example.com/foo%3f';alert(1);foo=
这样的请求将假定路径只是/foo
,因为%3f
被转换为?
结束了URL路径,但实际上服务器收到的路径将是/foo%3f';alert(1);foo=
。
变量REQUEST_BASENAME
和PATH_INFO
也受到了这个错误的影响。
在 Mod 安全的第2版中也发生了类似的情况,允许绕过防止用户访问与备份文件相关的特定扩展名文件(如.bak
)的保护,只需发送点URL编码为%2e
,例如:https://example.com/backup%2ebak
。
绕过 AWS WAF ACL
格式错误的标头
这项研究提到,可以通过发送一个AWS无法正确解析但后端服务器可以解析的“格式错误”标头来绕过应用于HTTP标头的AWS WAF规则。
例如,发送以下带有SQL注入的请求标头X-Query:
GET / HTTP/1.1\r\n
Host: target.com\r\n
X-Query: Value\r\n
\t' or '1'='1' -- \r\n
Connection: close\r\n
\r\n
在过去,可以绕过AWS WAF,因为它无法理解下一行是标头值的一部分,而NODEJS服务器可以(已修复)。
参考资料

最后更新于