这篇关于 log4j 漏洞的文章太水了不配拥有标题

背景

由于上周偷懒没写文章,要把上周没写的文章在这周补上,所以本文就写一些前段时间的小发现,没啥特别的。

自从 log4j 漏洞被引起广泛关注后国内外黑客们纷纷开始内卷,CVE 接踵而至,其中有DOS也有RCE,让我觉得最有意思的还是 RCE 绕过。

RCE Bypass

4ra1n 在《浅谈Log4j2之2.15.0版本RCE》一文中已经写过整个分析过程,简单说就是 LdapURL 和 URL 类对 host 解析的差异导致的主机白名单绕过,且对返回的 javaSerializedData 并未做实际有效的限制,所以可以给 javaSerializedData 返回一个可用的 gadget 字节码来进行远程代码执行。

不出网回显

这个问题我在刚出洞那几天发现后在和群友讨论中提出,但并非默认配置。

WechatIMG242768.png

在 log4j 官网的文档中有提到“ignoreExceptions”这个配置属性。

“ignoreExceptions” 的作用就是用来抛出 log4j 内部代码产生的异常,默认情况下 “ignoreExceptions”是 true,内部的异常只会作为日志打印出来并不会抛出,不过官方给出的几个 xml 例子里就有 ignoreExceptions=false 使用的情况,另外使用 FailoverAppender 包装时必须为 false,还是有可能碰到这种场景的。

所以只要找到一个抛出异常且 exception message 可控的地方就好了,为有找过 iiop 和 ldap 的代码,很顺利的从端口号的处理代码中发现了 String 转 int 会抛出异常。

${jndi:ldap://127.0.0.1:${java:version}}

WechatIMG242766.jpg

WechatIMG242774.png

更细节的内容可参考4ra1n在《浅谈Log4j2信息泄露与不出网回显》一文中对这部分的分析。

DOS

DateLookup 中 SimpleDateFormat如果抛出异常就会打印日志和异常栈。只要让他大量的抛异常就会线程阻塞。

private String formatDate(final long date, final String format) {
    DateFormat dateFormat = null;
    if (format != null) {
        try {
            dateFormat = new SimpleDateFormat(format);
        } catch (final Exception ex) {
            LOGGER.error(LOOKUP, "Invalid date format: [{}], using default", format, ex);
        }
    }
    if (dateFormat == null) {
        dateFormat = DateFormat.getInstance();
    }
    return dateFormat.format(new Date(date));
}

1640451715312.jpg

SimpleDateFormat 不认识 q 没法处理,会抛异常所以占用了资源也就会阻塞一段时间,y在DateFormat是有特殊意义的所以没抛异常,代码的处理速度就很快。

发表留言

如未标注转载则文章均为本人原创,转载前先吱声,未授权转载我就锤爆你狗头。

人生在世,错别字在所难免,无需纠正。