hacktricks/pentesting-web/proxy-waf-protections-bypass.md

6.8 KiB
Raw Blame History

代理 / WAF 防护绕过

从零开始学习 AWS 黑客技术,成为专家 htARTEHackTricks AWS 红队专家)

支持 HackTricks 的其他方式:

{% embed url="https://websec.nl/" %}

使用路径名操纵绕过 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_BASENAMEPATH_INFO也受到了这个 bug 的影响。

在 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 服务器可以(已修复)。

参考

{% embed url="https://websec.nl/" %}

从零开始学习 AWS 黑客技术 htARTEHackTricks AWS 红队专家)

支持 HackTricks 的其他方式: