当前位置: 首页 > 后端技术 > Java

我也想谈日志,但不想谈漏洞

时间:2023-04-01 21:06:29 Java

大家好,我是伟伟。上周大家应该都被log4j的日志漏洞刷屏了吧?当我看到这个漏洞时,我注意到它具有“影响范围很广,上手难度很低”的特点。只是想验证一下上手的难易程度,于是看了很多文章,都是大同小异,漏洞都提到了,牛逼,赶紧修,来不及就完了。然后加上一张唤起计算器的截图,就完了,没人告诉我怎么玩。我也想唤起计算器,学会装逼。于是上网查了一系列资料,摸索着。从找到信息到完成攻击,大约用了一个小时。当时我就震惊了:这东西的难度真的很低啊!本来还想写漏洞复现的,写着写着打消了念头。首先,即使我重现了它,我仍然不太明白它是如何工作的。我只知道可以通过JNDI加载攻击者的类,而且因为这个类是攻击者写的,所以里面可以做很多事情。你想想,我可以在你的代码环境下执行我写的一些代码,就算我不会攻击,我也可以写个死循环,写个sleep语句把你弄死。如果真的想写出有价值的文章,研究方向可以看看JNDI相关技术。但是我觉得我不能动,所以我就不写了。其次,我查了,不能写的太详细。毕竟是漏洞,传播其复现的方法也不是很好。好像涉及到法律问题,所以大家都知道如何预防。再说了,这是保安组的工作,我不想吃他们的饭。最后居然发现B站上已经有比较详细的视频演示了,贴个链接,不知道这个视频能保存多久:https://www.bilibili.com/video。..因为目前的解决办法是升级jar包,所以这篇文章我主要介绍给大家介绍一个插件,可以在一定程度上提高你的升级速度。我也经常用,用起来很顺手,味道很好闻。sb日志我没有骂人,我只想说说SpringBoot的日志。现在大家的应用都是基于SpringBoot构建的,那么SpringBoot默认的日志框架是什么呢?我也不知道,所以准备自己搭建一个纯SpringBoot项目来看看。有多纯?即我在通过IDEA新建项目时,除了指定SpringBoot版本号为2.6.1外,没有引入其他包。然后,我们看pom文件,很少的东西:真的很纯净,像纯净水一样。然后我们开始了这个项目:你看,神奇的事情发生了。一行代码都没动,什么也没配置,日志自动打出来了。所以之前一直没有注意到,但是这件事让我想到了这个问题:SpringBoot默认的日志框架是什么?我第一个想到的方法是这样的:猜猜看,如果能用代码解决问题,哔哔声会少一些,再加上两行日志打印出来就完了?从输出可以知道,哦,原来是用了logback。其他方法除了前面的方法,还有什么方法可以知道是logback吗?于是立马想到了看pom依赖图。IDEA中有一种一键查看pom依赖图的方式,非常简单。在maven标签中点击这个图标即可:如果找不到这个图标,也可以在pom文件中右击,然后选择Maven->ShowDependencies:然后会看到这样一个界面,里面包含了logback-corepackage显示引入了logback日志的实现:有朋友会问:依赖里有log4j-api吗?为什么说没有用log4j呢?老铁,只有api没有核心包,核心实现都在核心包里。比如这次导致log4j问题的代码,也就是查找的逻辑,都在core包里面。但是,为什么建议我们耗尽log4j-api和log4j-core的修复程序?个人认为core已经不需要了,api留着意义不大。如果只有log4j-api的依赖,按照我掌握的攻击原理,是没有问题的。好了,话不多说,说说这个纯SpringBoot项目。前面跟大家说的看依赖图的方式,其实我一般不会用。为什么?因为在真实的项目中,依赖关系可能极其复杂,看起来密密麻麻。你不想看到它。比如给大家看一下dubbo项目的pom依赖图。这是非常令人兴奋和震惊的。:说到这里,我们先来思考一个问题:你平时打开pom文件是为了什么?是不是要检查jar包冲突或者找jar包?所以在之前的页面中,可以按Ctrl+F进行搜索,像这样:但是用的时候,真的不好用。于是乎,我要给大家介绍的插件就到这里了。https://plugins.jetbrains.com...这个插件很香。具体如何安装我就不介绍了,注意自己对应的IDEA版本即可。主要是教大家怎么用。安装完成后,你再次打开pom文件,可以看到下面这个东西:长这样:我们主要关注这个地方,我也会给大家写下注意事项:在这个里面,主要有两个核心功能。检查依赖冲突。查询jar包依赖。比如我们看一下我们纯项目中的日志相关的包:一眼望去,我们也看到了上面提到的logback-core包。实战演练只是讲不练假动作。下面给大家来个maven-helper的实战演练。比如我们用Dubbo做手术,其实用起来很简单。以这次log4j漏洞事件为例,我们需要找出项目中所有的log4j-api和log4j-core包。我在Dubbo项目中选择这个模块进行演示:比如先打开autoconfigure包下的pom文件:然后搜索log4j:可以看到spring-boot-starter-logging引入了log4j-api。在这里右击,然后点击Exclude排除:刷新依赖,再次查询就没有了:就这么简单,其他模块也一样,就不一一演示了。但有一个问题。Dubbo作为一个中间件,出院后也不容忽视,不得不推出新的安全版本。我们可以看看这次Dubbo针对log4j漏洞提交的pr:https://github.com/apache/dub...可以看到排除了log4j-api,新版本的log4j-api还介绍了。版本号放在父pom中,实现了版本的统一管理:如果以后需要升级log4j-api,只需要在父pom中调整版本号即可。让我再举一个例子来练习。这个例子借用这个链接:https://juejin.cn/post/694522...首先在之前的纯SpringBoot项目中引入Dubbo包,然后引入zookeeper作为注册中心:org.springframework.bootspring-boot-starterorg.apache.dubbodubbo-spring-boot-starter2.7.9org.apache.dubbodubbo-registry-zookeeper2.7.9同时记得在application.properties文件中加上这一行配置,否则启动不了:dubbo.application.name=xxx时你开始,你可以看到这样一条提醒日志:怎么样,是不是很眼熟?大多数项目开始时遇到过?上面的提醒日志可以分为两组,一组是SLF4J,一组是log4j。很多人都知道,这个问题肯定是由于日志框架的依赖冲突和混乱造成的。那么首先我们再看一下项目中的log依赖,发现有log4j依赖冲突:废话少说,先右键drain一下,在pom文件中体现出来:不过应该需要注意的是,我们不能直接删除log4j包就不管了。这里参考一下,说明项目中使用了log4j,所以需要将log4j桥接到slf4j上,从而淘汰log4j,但仍然可以正常打印日志:dependency>org.slf4jlog4j-over-slf4j1.7.30再次启动项目,你我发现只有SLF4J是唯一剩下的问题:再次打开依赖分析:可以发现项目中既有slf4j-log4j12,也有log4j-to-slf4j,还有一个logback。因此,项目中共存了两套slf4j的实现,分别是log4j和logback。其实这一点从日志也能看出来:日志提示:ClasspathcontainsmultipleSLF4Jbindings。有两组实现。项目启动时先加载一个,用哪个就用哪个,是非常不靠谱的。根本的解决办法是排除其中之一。比如我们还是使用默认的logback,那么排除slf4j-log4j的依赖。再次启动项目,之前的冲突日志都没有了,心里舒坦:OK,不想用logback又想用log4j牛逼怎么办?https://docs.spring.io/spring...修改maven即可:打印log可以知道,目前实现的是log4j。然后,关于log4j的漏洞,我想说的是日志应该做好日志记录,那么你搞那么多复杂的功能干什么?完成KPI啊?说实话,在这个漏洞曝光之前,我并不知道它有这些高级功能,想了想也好像不能用。感觉就像有人故意留下后门一样。仔细想想还是挺可怕的,脑子里都是大戏。最后看到一个笑话,送给大家。快过年了,不讨论log4j、cs、bypass、流量检测之类的了。你把坏掉的电脑带回家,它不能给你带来任何实际效果。朋友掏腰包吃喝玩乐,你在家默默玩你的破米。亲戚朋友吃完饭问你有什么收获。你说我装个虚拟机,各种工具都玩玩。亲人一头雾水,你还在心里默默地笑他们,笑他们不懂你的自动注入,不懂你的10层代理,不懂你的流量混乱,笑他们谁不会甚至记住一个复杂的密码。你父母的同事都在谈论他们孩子一年的收获。儿子买房,女儿买车,女孩升职加薪。你爸妈闭口不谈,说是我儿子造的破电脑,开始嗡嗡作响,家里的电表越跑越快。本文已收录在我的个人博客中,欢迎大家来玩。https://www.whywhy.vip/