Log4j WAF Bypass 技巧详细分析+总结
1341025112991831 WEB安全 365浏览 · 2025-03-21 10:12

Log4j WAF Bypass 技巧详细分析+总结

前言

log4j 这个漏洞虽然是之前的了,但是对于一些 waf 的绕过还是非常值得去探索和分析的,这个漏洞可以说是核弹级别的漏洞了,如果没有完善的 waf 或者防护,还是有一些手法可以尝试去 bypass 的

环境搭建

只需要加入依赖

PHP
复制代码
然后可以加载远程 class 的 jdk 都可以



PHP
复制代码


log4j 漏洞简单分析

首先看到我们的调用栈

漏洞就两个关键点

MessagePatternConverter

这个类是转换器



可以看到对我们输入的数据处理部分会有很多的转换器



然后就开始调用我们的转换器处理我们的输入



这个转换器会识别我们的一些特殊的标识符,比如 jndi,{}

如何提取的逻辑具体在 substitute 方法

然后去除我们的特殊标识符后就调用对应的处理方法



resolveVariable

在这里已经初见端倪了,已经有 lookup 了





处理标签的部分有如下








这里我使用的 env,当然还有 jndi 的,就是直接去加载远程类了



JndiLookup

这个就是我们 jndi 的实现类



可以看到它的 lookup 就是我们常规的加载远程类的那个 lookup 的逻辑了,如果跟踪下去的话



参数如下





log4j 防护绕过

防护方法

当然 log4j 有自己的修复方法,那就是给了选择项是否解析我们的特殊的符号,但是如果功能确实需要,那就是对我们的输入进行 waf 了

当然是 waf 掉我们的关键字符 jndi,ladp 等这些字符

比如随便写了一个 waf 的例子

如果 waf 的逻辑是这样我们应该如何绕过呢?

我们使用普通的 payload



会被 waf 拦截

环境变量绕过

就是我们一开始使用的 payload



参考https://logging.apache.org/log4j/2.12.x/manual/configuration.html

在 Log4j 中,日志格式支持变量替换(Lookup),其中环境变量(Environment Lookup) 允许动态获取系统环境变量,语法如下:

如果环境变量不存在,还可以提供默认值:

而我们利用的就是这个默认值返回我们想要的字符

我们测试一下



我们看看返回默认值,这样的话我们就能够构造我们任意需要的 payload



成功

我们就可以这样绕过



对应的实现类为 lookup:36, EnvironmentLookup (org.apache.logging.log4j.core.lookup)





大小写标签绕过

lower



运行弹出计算器



转到对应的实现非常简单

就是直接小写

upper

但是这里大写是不能成功的,猜测可能不能识别 Jndi 这种标签或者 JNDI,当然我们可以尝试一下



是有 DNS记录的,我们更换payload

发现已经没有了,尝试全大写





发现全大写是可以的,但是如果大小写混着就不可以



但是发现这样又不行

估计是没有识别到 LDAP 协议

验证了之后确实是这样的



可以看到是匹配到了 jndi 的

最后抛出了异常



识别不了协议,只好放弃

之后发现了项目中的 payload



这样就能够绕过,很奇怪

项目的原理是大写的 Unicode 字符无效

尝试把这个转换出来发现就是大写的 I,那其实应该就是大写的 I 还是能够匹配的



事实确实如此

现在尝试各个部分大写

但是在 ldap 那里是没有办法的,所以只能这样了

前置符绕过



在匹配的时候因为匹配不到 aasdaa 这种标签就会忽略返回 j,以此类推



具体逻辑是在 substitute:1033, StrSubstitutor (org.apache.logging.log4j.core.lookup)





当然同样的还有:-



这个直接弹了一堆计算器,估计还解析了多次





System properties



这个和我们的 env 非常的类似



首先识别出我们的 sys



然后调用对应的 lookup开始处理

然后构造出完整 payload 后开始 jndi 注入



date 标签

只不过这个 payload 类型需要比较特殊一点

和处理有关系



处理 data



调用对应的 lookup






然后返回我们获得的值

最后就都是一样的了



0 条评论
某人
表情
可输入 255