上一篇
http长连接绕过waf
- 行业动态
- 2025-04-26
- 4126
通过HTTP长连接维持TCP会话,降低请求频率,结合请求头随机化及参数混淆,可规避WAF基于行为特征的检测
HTTP长连接基础
HTTP长连接(Keep-Alive)通过复用TCP连接减少握手次数,提升性能,与短连接(每次请求新建TCP连接)相比,长连接可降低网络开销并改变请求模式特征。
特性 | 短连接 | 长连接 |
---|---|---|
TCP连接生命周期 | 每次请求新建/关闭 | 连接保持直至主动关闭 |
典型头信息 | Connection: close | Connection: keep-alive |
WAF检测难度 | 高频次独立连接易触发规则 | 低频持久连接隐蔽性更强 |
WAF核心检测机制
现代WAF主要通过以下维度识别反面请求:
- 频率检测:单位时间内相同源IP的请求突增
- 协议合规性:非常规HTTP协议使用(如畸形头/方法)
- 行为模式:扫描器特征(如目录遍历、参数拼接)
- Payload特征:SQL注入、XSS攻击等攻击载荷
- 响应分析:异常状态码比例或错误页面访问
长连接绕过WAF原理
通过复用TCP连接实现:
- 请求速率平滑化:将爆发式请求转化为低速持续流
- 协议特征模糊化:避免频繁三次握手引起的关注
- 会话状态保持:减少Cookie/Session重传频率
- 请求伪装增强:可混合合法请求降低异常度
实战绕过技巧
技术手段 | 实现方式 |
---|---|
连接复用控制 | 使用requests.session() 保持连接,设置keep_alive=True |
请求间隔随机化 | 在合法业务允许范围内插入1-5秒随机延迟 |
多连接并行策略 | 同时维持2-3个长连接分散请求压力 |
请求类型混合 | 将攻击请求与正常业务请求(如图片加载)交替发送 |
头部动态调整 | 每间隔N个请求修改User-Agent 或添加无害自定义头(如X-Forwarded-For ) |
代码实现示例(Python)
import requests import time import random session = requests.Session() session.headers.update({ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0)', 'Connection': 'keep-alive' }) target_url = "http://example.com/vuln.php" for i in range(50): # 混合正常请求与攻击请求 if i % 3 == 0: # 构造正常GET请求 response = session.get("http://example.com/image.jpg") else: # 发送带payload的请求 payload = "id=1' OR '1'='1" response = session.post(target_url, data={'query': payload}) # 随机延迟规避频率检测 time.sleep(random.uniform(0.5, 3))
注意事项
- 业务兼容性:需确保目标站点支持长连接(部分服务器主动关闭)
- 连接超时:多数服务器设置60-300秒超时,需定期发送心跳包
- 线程安全:多线程场景需为每个线程创建独立Session对象
- 响应处理:及时读取响应内容避免连接阻塞
- 法律风险:仅用于授权渗透测试,违反《网络安全法》需承担法律责任
相关问题与解答
Q1:HTTP长连接是否一定能绕过WAF?
A1:不能保证完全绕过,高级WAF会结合连接持续时间、请求总量、熵值分析等多维度检测,建议结合以下技术:
- 动态调整Keep-Alive时长(如每5个请求后重建连接)
- 使用中间代理服务器分段转发请求
- 模拟真实用户浏览路径(如先访问首页再触发攻击)
Q2:如何应对WAF的机器学习检测模型?
A2:可采用以下对抗策略:
- 请求拟真化:模仿真实用户行为(如加入滚动条加载、表单提交)
- 环境仿真:使用真实浏览器自动化工具(Selenium/Playwright)
- 噪声注入:在请求中混入10%-20%无效参数(如随机cookie键值)
- 节奏模仿:参照网站平均响应时间动态调整请求间隔