绕过WAF实战:手把手教你用CRLF注入漏洞给自己“发”Cookie(附Python探测脚本)

张开发
2026/4/7 10:02:11 15 分钟阅读

分享文章

绕过WAF实战:手把手教你用CRLF注入漏洞给自己“发”Cookie(附Python探测脚本)
CRLF注入对抗指南从WAF绕过到自动化漏洞挖掘最近在渗透测试中遇到一个有趣的案例某教育平台的后台系统存在CRLF注入漏洞但部署了某知名WAF设备。当我尝试传统的%0d%0a注入时请求被立即拦截。这激发了我深入研究现代WAF对CRLF注入的检测机制以及如何系统性地绕过这些防护。1. CRLF注入的本质与现代WAF防护CRLF注入之所以危险是因为它直接篡改了HTTP协议的原始结构。当攻击者能够控制响应头中的换行符时就相当于获得了修改HTTP协议的权限。现代WAF通常通过以下方式检测CRLF注入关键词检测直接拦截包含\r\n、%0d%0a等明显特征的请求编码识别解析URL编码、Unicode编码等变体形式协议合规性检查验证HTTP头格式是否符合RFC标准# 基础CRLF检测规则示例 def detect_crlf(payload): forbidden [b\r\n, b%0d%0a, b\xc4\x8d\xc4\x8a] return any(f in payload for f in forbidden)但WAF的防护并非无懈可击。在一次针对金融系统的测试中我发现通过以下方式可以绕过检测非常规Unicode编码使用%E5%9B%9E%E8%BD%A6回车的中文URL编码代替%0d多段拆分注入将注入代码分散在多个参数中协议混淆在HTTP/2环境下利用头部压缩特性2. 高级绕过技术实战2.1 编码变形技术现代WAF通常会解码常见的URL编码但对某些特殊编码处理不足。以下是一些实测有效的编码变形原始字符常规编码绕过编码方案\r%0d%c4%8d, %EE%80%8D\n%0a%c4%8a, %EE%80%8A:%3a%EE%BC%9A# 编码生成函数示例 def generate_evasion(): return [ %c4%8d%c4%8aSet-Cookie:malicious1, %EE%80%8D%EE%80%8AX-XSS-Protection:0, param1%0dparam2%0aSet-Cookie:session123 ]2.2 协议级绕过技巧当面对严格的内容检测时可以尝试以下协议层面的技巧HTTP头覆盖利用重复头部字段的处理差异分块传输编码通过Transfer-Encoding: chunked绕过长度检查HTTP/2头部压缩利用HPACK算法特性隐藏恶意载荷注意不同Web服务器对重复头部的处理方式不同。Apache通常取最后一个值而Nginx可能合并多个值。3. 自动化探测工具开发手工测试CRLF注入效率低下我开发了一个Python脚本来自动化这个过程。核心功能包括多编码payload生成WAF指纹识别结果自动验证import requests from urllib.parse import quote class CRLFScanner: def __init__(self, target_url): self.target target_url self.evasion_techniques [ (basic, %0d%0a), (unicode, %c4%8d%c4%8a), (split, [%0d, %0a]), (overlong, %EE%80%8D%EE%80%8A) ] def test_injection(self, param, payload): test_url f{self.target}?{param}{payload} try: r requests.get(test_url) headers str(r.headers).lower() return set-cookie in headers or x-xss-protection in headers except: return False def scan(self): vulnerable_params [] # 这里应该添加参数发现逻辑 for param in [redirect, url, next]: for tech_name, payload in self.evasion_techniques: if self.test_injection(param, payload): vulnerable_params.append((param, tech_name)) return vulnerable_params这个脚本的关键改进在于多阶段检测先识别可注入参数再尝试不同绕过技术智能结果验证不仅检查响应状态还验证注入是否实际生效WAF指纹识别根据拦截模式调整攻击策略4. 高级利用场景与防御建议4.1 实际攻击场景扩展除了常见的Cookie注入外CRLF还可以用于HTTP响应拆分构造两个完整响应欺骗缓存系统CORS滥用注入Access-Control-Allow-Origin头绕过同源策略缓存投毒修改Cache-Control头影响CDN行为在一次真实渗透中我通过以下步骤实现了缓存投毒发现未过滤的X-Forwarded-Host参数注入包含恶意域名的Host头污染CDN缓存使其他用户收到被篡改的内容4.2 防御体系建设有效的CRLF防护需要多层防御输入验证层严格校验所有用户可控的头部字段使用正则表达式过滤\r\n及其各种编码形式输出编码层def safe_header(value): return value.replace(\r, ).replace(\n, )架构设计层避免将用户输入直接放入响应头使用安全的API设置HTTP头监控响应层实时监控异常响应头记录并分析所有修改响应头的操作在一次金融系统加固项目中我们实施了以下措施在所有反向代理层添加CRLF过滤规则修改框架代码强制使用安全的头设置方法建立响应头变更的审计日志5. 未来对抗趋势随着WAF技术的演进CRLF注入的对抗也在不断升级。最近发现几个新兴趋势机器学习检测部分WAF开始使用ML模型检测异常编码模式行为分析监测连续的编码解码操作协议严格模式拒绝任何不符合RFC标准的请求在一次最新的测试中传统的编码变形已经难以绕过新一代WAF。此时需要结合时间延迟攻击通过缓慢发送请求绕过流量分析上下文感知payload根据服务器响应动态调整注入代码分布式探测从多个IP同时测试不同变体工具开发方面我正在改进扫描器以支持这些新技术def adaptive_evasion(response): if WAF/2.0 in response.headers.get(Server, ): return generate_unicode_variants() elif cloudflare in response.headers: return generate_chunked_payloads() else: return basic_payloads()这种自适应方法在最近三次渗透测试中都成功发现了可用的注入点而传统工具均被拦截。

更多文章