【深蓝实验室天魁战队】WAF的识别、检测、绕过原理与实战案例
字数 2575 2025-08-12 11:33:43
WAF的识别、检测与绕过技术详解
1. WAF基础概念
1.1 WAF简介
Web应用防火墙(WAF)是一种专门用于保护Web应用程序的安全解决方案,通过分析HTTP/HTTPS流量来识别和阻止恶意请求。
1.2 WAF检测原理
WAF主要通过以下方式检测攻击:
1.2.1 基于规则匹配
- 使用正则表达式匹配攻击特征
- 示例:匹配
concat()函数但不会匹配字符concat - 绕过方法:利用解析差异,如
concat ()(添加空格)
1.2.2 基于语义分析
- 模拟执行输入参数并判断结果
- 类似于webshell检测引擎
- 绕过更复杂,需利用WAF引擎与后端服务器引擎的解析差异
1.2.3 RASP技术
- 运行时应用自我保护技术
- 示例:拦截所有PHP/JSP脚本文件的写入操作
1.3 WAF部署方式
- DNS解析地址部署
- 软件部署
- 串联部署
- 透明部署
- 网桥部署
- 反向代理部署
- 旁路部署
2. WAF分类
2.1 云WAF
- 通过DNS技术实现
- 移交域名解析权进行防护
- 请求先发送到云端节点检测
2.2 硬件WAF
- 部署在Web服务器前
- 过滤所有外部流量
- 通过规则库匹配攻击特征
2.3 软件WAF
- 安装在防护服务器上
- 通过监听端口或Web容器扩展方式检测
2.4 其他WAF
- 中间件自带WAF模块
- 网站内置WAF
- 开源WAF:Naxsi、OpenRASP、ModSecurity
3. WAF识别技术
3.1 识别工具
- wafw00f:默认155个指纹
- nmap:默认19个指纹
- sqlmap:默认94个指纹
3.2 常见WAF识别示例
3.2.1 阿里云盾
def is_waf(self):
schemes = [
self.matchContent(r'error(s)?\.aliyun(dun)?\.(com|net)?'),
self.matchCookie(r'^aliyungf_tc='),
self.matchContent(r'cdn\.aliyun(cs)?\.com'),
self.matchStatus(405)
]
if all(i for i in schemes):
return True
return False
3.2.2 安全狗
def is_waf(self):
schemes = [
self.matchCookie(r'^safedog\-flow\-item='),
self.matchHeader(('Server', 'Safedog')),
self.matchContent(r'safedogsite/broswer_logo\.jpg'),
self.matchContent(r'404\.safedog\.cn/sitedog_stat.html'),
self.matchContent(r'404\.safedog\.cn/images/safedogsite/head\.png')
]
if any(i for i in schemes):
return True
return False
3.2.3 腾讯云
def is_waf(self):
schemes = [
self.matchContent(r'waf\.tencent\-?cloud\.com/')
]
if any(i for i in schemes):
return True
return False
3.2.4 云锁
def is_waf(self):
schemes = [
self.matchCookie(r'^yunsuo_session='),
self.matchContent(r'class=\"yunsuologo\"')
]
if any(i for i in schemes):
return True
return False
4. WAF拦截页面特征
4.1 云WAF拦截页面
- 阿里云盾:
https://errors.aliyun.com/images/TB1TpamHpXXXXaJXXXXeB7nYVXX-104-162.png - 腾讯云:进程名
BaradAgent.exe、sgagent.exe等 - 360磐云:服务名
QHWafUpdata,进程名360WebSafe.exe
4.2 硬件WAF拦截页面
- 安恒明御WAF
- 长亭SafeLine
- 盛邦RayWAF
4.3 软件WAF拦截页面
- 网站安全狗:服务名
SafeDogCloudHelper - 云锁:监听端口5555,服务名
YunSuoAgent - D盾:服务名
d_safe
5. WAF绕过技术
5.1 架构层绕过
5.1.1 绕过云WAF寻找源站
- 目标域名历史解析IP查询
site.ip138.comipchaxun.com- DNSDB:
dnsdb.io/zh-cn/
- 页面/js源码爬取IP
- 工具:JSFinder
- Burp敏感信息高亮插件
- 暴露真实IP的边缘业务
- 通过子域名定位真实IP
- HOSTS碰撞
- 其他思路:
- SSL证书查询
- 搜索引擎快照
- GitHub源代码泄露
- 子站攻击
5.2 资源限制绕过
5.2.1 填充垃圾字符
- URI:
/xxx?data=aaaaaaa...aaaaa&cmd=whaomi - SQL:
11111111...111111111' and 1=1 --1'/*aaa...aaa*/ and 1=1 -- - Body:
a=aaaaaaa- --&b=bbbb...&pay1oad=... - filename:
name="uploaded"; filename222... ="xxxx.filename="x.txt"
5.2.2 高并发
- 爆破模块持续发包
- 结合payload字典进行fuzz
5.3 协议层绕过
- 利用HTTPS协议(若WAF未配置SSL解密)
- 利用chunk分块传输
- 去掉请求头中的请求方法
5.4 规则层绕过
5.4.1 等价替换
- 字符集编码绕过(IBM037、IBM500等)
- 不同服务器支持的编码:
- Nginx,uWSGI-Django-Python3: IBM037、IBM500等
- Apache-TOMCAT8-JVM1.8-JSP: IBM037、IBM500等
- IIS6、7.5、8、10 -ASPX: IBM037,IBM500等
5.4.2 字符干扰
- 空字符
- 注释符
- 空白字符
5.4.3 特殊符号利用
- MySQL注入允许符号:
.,%.0,0,&\N,-.0,=\N,<0.,>0.,e0,^0. - MSSQL注入允许符号:
%00-%20范围内的控制字符
6. WAF绕过实战案例
6.1 脏数据填充绕WAF
Content-Type: multipart/form-data;此处填充12187以上个字符Boundary=1750181627257789624103726579
Content-Type: multipart/form-data;Boundary此处填充12187以上个字符=1750181627257789624103726579
6.2 SQL注入绕WAF
- 默认payload被拦截
- 绕过payload:
1'+/*!33441and*/+1=1%23
6.3 双写filename绕WAF
- 绕WAF传压缩文件技巧
- 专业版传压缩文件可能无法利用,社区版Burp可规避
6.4 文件上传绕WAF思路
- 截断思路:filename前加
%00、空格、换行 - 特殊字符:
form-data;改为~form-data; - 大小写敏感:
content-Type改为content-type - 畸形格式:删除
form-data冒号及属性 - 空格思路:
Content-Type : multipart/form-data ; boundary = - 换行思路:filename=后换行,文件名每个字符换行
- 畸形数据包:删除
content-Type: image/jpeg - 特殊协议:通过chunked编码提交
- 转义符号:
boundary="aa\ "bbb" - 特殊字符扩展名:
fi1ename=file_name: .php - 重复参数:多个boundary或filename
- 特殊字符编码:使用ibm037、utf-32等编码
7. 参考资源
- WAF介绍:https://www.cnblogs.com/realjimmy/p/12937247.html
- WAF攻防研究之四个层次Bypass WAF:https://xz.aliyun.com/t/15/
- 编码导致的WAF安全性研究
- 隐藏资产探测:https://www.cnblogs.com/Rain99-/p/13756032.html