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

6.8 KiB
Raw Blame History

代理/WAF保护绕过

☁️ HackTricks云 ☁️ -🐦 推特 🐦 - 🎙️ Twitch 🎙️ - 🎥 YouTube 🎥

使用Node.js绕过Nginx ACL规则

Nginx限制示例

location = /admin {
deny all;
}

location = /admin/ {
deny all;
}

NodeJS

  • 由于Nginx在路径名中包含字符\xa0,因此/admin URI的ACL规则不会被触发。因此Nginx将转发HTTP消息到后端
  • 当Node.js服务器接收到URI/admin\x0a时,字符\xa0将被移除,从而成功检索/admin端点。
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

Flask会从URL路径中删除字符\x85\xA0\x1F\x1E\x1D\x1C\x0C\x0B\x09但NGINX不会。

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

下面是一个演示,说明如何通过在路径名末尾添加字符\x09<tab>来绕过ACL保护

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;
}

可以通过访问/admin.php/index.php来绕过它:

如何预防

为了防止这些问题您必须在Nginx ACL规则中使用~表达式而不是=表达式,例如:

location ~* ^/admin {
deny all;
}

使用行折叠绕过 AWS WAF ACL

通过使用以下语法,可以绕过 AWS WAF 对 HTTP 头的保护,其中 AWS WAF 不会理解 X-Query 头包含的 SQL 注入有效负载,而后面的节点服务器会理解:

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

参考资料

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥