Log4j的前因后果

简介

Log4j的进化史

Log4J的三大组件:

Logger:日志记录器,负责收集处理日志记录 (如何处理日志)

Appender:日志输出目的地,负责日志的输出 (输出到什么地方)

Layout:日志格式化,负责对输出的日志格式化(以什么形式展现)

还是一如既往的先对其的应用有个大概的了解,有利于对 漏洞的全局把控

漏洞相关知识前置

由于Log4j漏洞是利用了Log4j.lookup的解析+jndi的相关漏洞,最终触发了所谓的“核弹级”漏洞。

Log4j的应用架构

JNDI的应用结构

漏洞分析

先用网上的exp随便测了测,发现error和fetal会触发,而info和debug不会触发

所以接下来,首先要来分析为什么error和fetal会触发?又为什么info和debug不会触发

流程分析

  • 进入日志记录后,首先判断了日志是否需要记录。确认记录,继续跟进

  • 跟进后进行了日志的格式化,在对事件信息进行格式的同时进行了lookup判断,可以看到如果对于${}包含的事件消息则先对offset进行回退,也就是先不保存,然后再开始对${}进行解析

  • 先匹配到了${}中包裹的字符串



  • 再对获取到的字符串不断进行递归检测${},看是否还能进行替换

  • 继续进行识别,进行变量替换

  • 经过无数遍的字符串扫描识别后,看到了解析器组会依次对变量进行解析,而且同时看到了可以解析jndi的相关变量

  • 一直跟到jndiManager#lookup(),发现没有任何过滤。

  • 还有个问题就是为什么info和debug不能进行jndi利用



    分析了下,主要是因为我这里测试的方式不是webAPP,所以不执行WebLookup的插件。也就无法进行jndi的利用了

  • 到此,分析完了log4j的漏洞细节

    分析下来就是log4j支持${}的表达式,会对其进行递归解析。官方开启此种方式是为了能够快速获取其他信息。但对jndi的支持,却导致了此次的漏洞。

log4j中项目lookup的作用:** Lookups provide a way to add values to the Log4j configuration at arbitrary places. They are a particular type of Plugin that implements the StrLookup interface. **”

以上内容复制于log4j2的官方文档lookup - Office Site。其清晰地说明了lookup的主要功能就是提供另外一种方式以添加某些特殊的值到日志中,以最大化松散耦合地提供可配置属性供使用者以约定的格式进行调用。

漏洞利用

直接就是套用jndi的exp。

漏洞修复

官方先是给出了内网白名单的修复--》被解析漏洞绕过--》然后又被发现逻辑漏洞

泛域名解析:就是多个子域名解析到同一个ip上

流程分析小结:跟的时候总是跟的目标不对,而且似乎对jndi的底层实现不熟。对关键类中的敏感方法不够感冒。。。

[JavaWeb]Log4j的前因后果的更多相关文章

  1. javaweb log4j显示完整sql日志

    javaweb显示完整sql日志 所需jar包: log4j-1.2.17.jar log4jdbc-1.2.jar slf4j-api-1.7.12.jar slf4j-log4j12-1.7.12 ...

  2. log4j在javaWeb项目中的使用

    在前边的文章中对log4j的配置文件进行了说明,今天介绍如何在普通的javaWeb项目中使用log4j. 在日常的开发过程中,日志使用的很频繁,我们可以利用日志来跟踪程序的错误,程序运行时的输出参数等 ...

  3. 在JavaWeb中使用Log4j步骤

    在JavaWeb中使用Log4J指南.每次在开始写一个项目的时候都忘记Log4J如何配置.所以写个步骤,作为记录. 第一步 下载Log4J jar包 从Apache Logging Services ...

  4. JavaWeb应用中初始化Log4j的两种方式

    本文主要介绍了普通JavaWeb应用(基于Tomcat)中初始化Log4j的两种方式: 1.通过增加 InitServlet ,设置令其自启动来初始化 Log4j . 2.通过监听器 ServletC ...

  5. JavaWeb项目异常管理之log4j的使用教程

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6399191.html 在项目中的应用见: https://github.com/ygj0930/CoupleS ...

  6. javaweb项目添加log4j日志

    谈到我们在Java程序中经常用的日志,Log4j应该是耳熟能详了.这里先提下slf4j,英文全名是Simple Logging Facade for Java,直面意思是:Java的简单日志门面.sl ...

  7. 解决log4j:WARN Error initializing output writer. log4j:WARN Unsupported encoding?的问题

    异常名:log4j:WARN Error initializing output writer. log4j:WARN Unsupported encoding? 异常截图: 在一般的javaweb项 ...

  8. log4j的简单应用(转载)

    当程序有错误时,我们就需要找出错误的地方并进行验证,怎样才能准确快速的找到出错的地方呢,那就是在程序运行时在控制台上输出相关的信息,从而可以判断程序的运行顺序以及出错的位置.以前总是习惯使用Syste ...

  9. slf4j 和 log4j合用的(Maven)配置(转)

    简述:添加logger的日志输出,下面是配置信息供备忘 步骤:1. 在Maven的porn.xml 文件中添加dependency如下 <dependency> <groupId&g ...

随机推荐

  1. [源码解析] PyTorch 分布式之弹性训练(5)---Rendezvous 引擎

    [源码解析] PyTorch 分布式之弹性训练(5)---Rendezvous 引擎 目录 [源码解析] PyTorch 分布式之弹性训练(5)---Rendezvous 引擎 0x00 摘要 0x0 ...

  2. 【Leetcode】718. 最长重复子数组

    最长重复子数组有一下性质 A: [1,2,3,2,1] B: [3,2,1,4,7]设横是A竖是B,有规律:若横元和竖元相等,则为1,不等为0 1 2 3 2 13 0 0 1 0 12 0 1 0 ...

  3. CausalVAE: Disentangled Representation Learning via Neural Structural Causal Models

    目录 概 主要内容 模型 ELBO 关于 Yang M., Liu F., Chen Z., Shen X., Hao J. and Wang J. CausalVAE: disentangled r ...

  4. IT6563替代芯片|DP转HDMI 2.0音视频讯号转换芯片|CS5263Capstpne

    IT6563替代芯片|CS 5263|4LAN DP转HDMI 2.0音视频讯号转换芯片IT6563是一款4LAN EDP转HDMI2.0 HDMI2.0转换器芯片.IT6563FN结合Display ...

  5. 求区间内第一个大于等于x的数的下标

    int tree[4*N]; void build(int o,int l,int r) { if(l==r) {cin>>tree[o];return;} build(ls,l,mid) ...

  6. Webpack有哪些常见的Loader?他们是解决什么问题的?

    先来了解一下Loader,webpack是属于模块化方案,他能让任意类型的文件都能运行在浏览器中,怎么做到呢?这时就有了loader 定义: loader 用于对模块的源代码进行转换.loader 可 ...

  7. Java网络编程Demo,使用TCP 实现简单群聊功能Groupchat,创建一个服务端,使多个客户端都能收到消息

    效果图: 开启服务端 客户端一 客户端二 客户端三 实现代码: 客户端类 import java.io.IOException; import java.net.ServerSocket; impor ...

  8. Java面向对象笔记 • 【第3章 继承与多态】

    全部章节   >>>> 本章目录 3.1 包 3.1.1 自定义包 3.1.2 包的导入 3.1.3 包的访问权限 3.1.4 实践练习 3.2 继承 3.2.1 继承概述 3 ...

  9. 【工具】Java转换exe

    一.导出jar包 eclipse中对着要转换的项目,右键,导出 搜索jar,选择jar文件,下一步 选择要输出的项目 继续下一步 选择主程序 完成 二.下载及安装exe4j,并转换jar文件为exe文 ...

  10. Selenium_获取元素文本、属性值、尺寸(8)

    from selenium import webdriver driver = webdriver.Chrome() driver.maximize_window() driver.get(" ...