Web应用中Log4j与JNDI结合2 -- JNDI指定日志路径

Log4j2日志框架JNDI注入漏洞分析与复现 1、漏洞背景 大家在实际开发中,几乎无可避免的需要用到日志框架,不管你是前端后端客户端,他们可以追踪和记录我们的程序运行中的信息,我们可以利用日志很快定位问题,追踪分析。 而对于Java开发人员来说,最常用的日志框架便是Log4j2和logback,而本次漏洞的主角便是Apache Log4j2,它有一个特别强大的功能插件Lookups 如果我们试图通过日志去输出一个程序中不存在的对象,而在其他地方,那么我们便可以通过这个插件去通过某些方式去查找目标内容,它只提供一种规范,具体使用哪些方式去查找 阅读详情

在Web应用中Log4j与JNDI结合1 – JNDI指定配置文件一文中,我展示了如何通过定制ServletListener来从JNDI指定地址读取log4j配置文件。这一篇我来讲解如何通过JNDI指定日志路径。普通的log4j appender没有办法处理JNDI相关的日志文件。同ServletListener定制一样,我们要定制Appender。这里以DailyRollingFileAppender为例。普通按照天来自动截断,例如:

<appender name="FILE" class="org.apache.log4j.DailyRollingFileAppender">
    <param name="file" value="default.log" />
    <param name="append" value="false" />
    <param name="datePattern" value="'.'yyyy-MM-dd" />
    <layout class="org.apache.log4j.PatternLayout">
      <param name="ConversionPattern" value="%d{ABSOLUTE} [%-5p] [%t] [%c{1}] %m%n" />
    </layout>
  </appender>

通过Log4j源码分析(org.apache.log4j.LogManager.java, org.apache.log4j.xml.DOMConfigurator.java and DailyRollingFileAppender.java),我们可以知道,在Web应用XML的配置方式下,LogManager.java的static初始化块会根据log4j.configuration的配置,通过org.apache.log4j.helpers.OptionConverter.selectAndConfigure方法找到对应的log4j xml配置文件,然后通过Call org.apache.log4j.xml.DOMConfigurator.java的doConfigure方法,去到parse方法,根据Logger和Root node的APPENDER_REF_TAG调用findAppenderByReference,最后在parseAppender 中把param配置赋值给appender的属性,然后通过调用appender的activeOptions来打开日志记录文件。

DailyRollingFileAppender.java
public void setFile(String file) {
    // Trim spaces from both ends. The users probably does not want
    // trailing spaces in file names.
    String val = file.trim();
    fileName = val;
  }

public void activateOptions() {
    //based on fileName to open log file
    super.activateOptions();
    if(datePattern != null && fileName != null) {
      now.setTime(System.currentTimeMillis());
      sdf = new SimpleDateFormat(datePattern);
      int type = computeCheckPeriod();
      printPeriodicity(type);
      rc.setType(type);
      File file = new File(fileName);
      scheduledFilename = fileName+sdf.format(new Date(file.lastModified()));

    } else {
      LogLog.error("Either File or DatePattern options are not set for appender ["
           +name+"].");
    }
  }

那么想通过jndi来指定日志文件,就是要给修改对filename赋值。简单实现可以通过继承DailyRollingFileAppender,在新的子类(JndiDailyRollingFileAppender )中加入新的属性jndiDirURL来接受JNDI指定日志路径文件夹(在xml配置中必须放在file参数之前),然后重写filename赋值的setFile方法,获取基于JNDI的完整文件路径。列出参考代码如下:

public class JndiDailyRollingFileAppender extends DailyRollingFileAppender  {
   private String jndiDirURL;
   public void setJndiDirURL(String jndiDirURL){
       this.jndiDirURL= jndiDirURL;
   }
   public String getJndiDirURL(){
       return this.jndiDirURL;
   }
   public JndiDailyRollingFileAppender (String jndiDirURL, Layout layout, String filename, String datePattern) throws IOException {
       super(layout, getAbsoluteName(jndiDirURL,filename), datePattern);
   }
   private String getAbsoluteName(String filename){
       try{
        Context ic = new InitialContext();
        String parent= ((URL)ic.lookup(jndiDirURL)).toExternalForm();
        String absolutePath = parent + File.separator + filename;
        return absolutePath;
        }catch(Exception e){
           LOG.error("unable to find jndidirurl: {}, JndiDirURL);
           return filename;
        }
  }

   @Override
   public void setFile(String file) {
      return super.setFile(getAbsoluteName(file));
   }
}

对应的log4j.xml中的配置文件如下:

<appender name="default" class="com.demo.JndiDailyRollingFileAppender">
    <param name="jndiDirURL" value="java:comp/env/demo_log" />
    <param name="file" value="default.log" />
    <param name="append" value="false" />
    <param name="datePattern" value="'.'yyyy-MM-dd" />
    <layout class="org.apache.log4j.PatternLayout">
      <param name="ConversionPattern" value="%d{ABSOLUTE} [%-5p] [%t] [%c{1}] %m%n" />
    </layout>
  </appender>
东方通TongWeb多应用部署实战:规划、配置与运维指南 在企业级Java应用部署中,应用服务器作为核心运行时容器,其资源管理与多应用部署能力直接影响IT架构的效率和成本。通过资源池化与统一管理,可以在单台服务器上高效运行多个Web应用,从而显著提升硬件利用率并降低运维复杂度。这一技术实践对于微服务架构下的模块化部署、前后端分离项目以及多业务线系统整合具有重要价值。其核心在于妥善处理端口、上下文路径、会话及资源隔离等关键技术细节。本文以广泛应用的东方通TongWeb服务器为例,深入探讨了多应用部署的规划原则、三种主流部署方法(自动部署、server.xml配置、独 阅读详情

相关推荐

Log4Shell漏洞检测器原理、部署与实战指南

在网络安全领域,漏洞检测是识别和防御潜在攻击的关键环节。其核心原理在于通过分析网络流量、系统日志或应用程序行为,匹配已知的攻击模式或异常特征。从技术价值看,高效的检测工具能极大提升安全运维的响应速度,帮助企业在漏洞被大规模利用前进行预警和处置。常见的应用场景包括实时网络入侵检测、安全事件回溯分析以及合规性审计。针对Log4Shell这类影响广泛的远程代码执行漏洞,专用的检测器通过深度解析JNDI注入等流量特征,结合上下文关联分析,能有效在海量数据中定位恶意利用行为。本文以log4shell-detector

weixin_34006965的博客 372

扩展Log4j支持JNDI数据源

log4j.properties配置文件: log4j.rootLogger=INFO,db #使用log4j扩展支持JNDI数据源 log4j.appender.db=com.qdgswx.log4j.ds.JndiDSAppender log4j.appender.db.jndiName=wstjndi log4j.appender.db.BufferSize=1 log4...

weixin_33816821的博客 342

Java Web项目部署实战:从Tomcat到Docker的完整指南

在软件开发生命周期中,部署是将应用程序从开发环境迁移到生产环境的关键环节,它直接决定了服务的可用性与可访问性。其核心原理在于构建一个标准化的运行时环境,将源代码、依赖和配置组装成可对外提供网络服务的成品。这一过程的技术价值在于实现了开发与运维的衔接,保障了应用的稳定、安全运行。典型的应用场景包括企业级Web应用、微服务架构的后端服务等。本文聚焦于Java Web项目的部署实践,深入讲解了基于Servlet容器(如Tomcat)的传统部署方法,涵盖了环境准备、项目打包、配置分离等核心步骤。同时,也探讨了现代化

weixin_34268579的博客 365

log4j jndi注入漏洞

JNDI、LDAP、log for java: log4j Java程序日志监控组件

Ye的博客 1581

Suricata规则深度解析:从字符串匹配到协议语义检测

网络入侵检测规则本质上是将原始流量转化为可理解攻击意图的语义翻译器。其核心原理在于协议解析引擎与规则引擎解耦,通过HTTP/2、TLS 1.3、DNS over HTTPS等应用层语义对象实现精准匹配,而非传统‘高级grep’式字节流扫描。这种架构赋予Suricata对加密流量(如SNI、JA3指纹)、状态化会话(flow修饰符)和分层防御(预过滤+精确匹配)的技术能力,显著提升检测精度与生产环境可用性。典型应用场景包括Webshell识别、Log4j RCE检测、DNS隧道发现及Cobalt Strike

weixin_30267785的博客 347

Log4j2的JNDI注入漏洞原理分析与思考

前言 最近Log4j2的JNDI注入漏洞(CVE-2021-44228)可以称之为“核弹”级别。Log4j2作为类似JDK级别的基础类库,几乎没人能够幸免。极盾科技技术总监对该漏洞进行复现和分析其形成原理。在此分享。 以下涉及的代码,均在mac OS 10.14.5,JDK1.8.0_91环境下成功运行。 一、 前置知识 1.1 Log4j2 Log4j2是一个Java日志组件,被各类Java框架广泛地使用。它的前身是Log4j,Log4j2重新构建和设计了框架,可以认为两者是完全独立的两个日志组

uuuyy_的博客 3042

JAVA安全之Log4j-Jndi注入原理以及利用方式

JDNI(Java Naming and Directory Interface)是Java命名和目录接口,它提供了统一的访问命名和目录服务的API。JDNI主要通过JNDI SPI(Service ProviderInterface)规范来实现,该规范定义了对JNDI提供者应实现的接口。在JNDI体系中,JNDI提供者是指实际提供命名和目录服务的软件组件。JNDISPI规范包含了多个接口,其中最为重要的是Context接口。

qq_53058639的博客 1424

MATLAB AppDesigner 中TextArea保留原有信息并换行显示提示信息

App Designer 中的文本区域TextArea组件,一般可以用来作为matlab app设计中的信息显示。 app.TextArea.Value = 'Hello Matlab'; Value可以是字符向量、字符向量元胞数组、字符串数组或一维分类数组。这样直接给TextArea赋值,每次赋值都会消除先前的信息,然后显示新的信息。如果想要在app实现保留原有信息、多行信息的输出,在MathWorks官方帮助中心给出了一种方法: cellArrayText{1} = sprintf('%s\n

我是麻瓜喔的博客 1万+

JNDI RMI 注入(Log4j2漏洞)

目录 ■相关知识 1.SLF4J(Simple logging Facade for Java) // 简单日志门面 ■(log4j2)漏洞 ■JNDI 注入代码实现(RMI) ■代码细节说明 1.javax.naming.Reference // 构造方法 2.代码中使用的服务如何构建 SimpleHTTPServer // (Python)快速共享目录 3.RMI的利用版本限制 4.问答 5.RMI(Remote Method Invocation)为远程方法调用 ●在攻击..

sun0322 1万+

FreeModbus V1.6主机模式实战:如何在STM32上实现Modbus RTU主从一体通信

本文详细介绍了如何在STM32平台上利用FreeModbus V1.6开源协议栈实现Modbus RTU主从一体通信。文章深入剖析了V1.6版本主机模式的架构设计,提供了从硬件配置、串口与定时器移植到FreeRTOS操作系统适配的完整实战指南,并分享了数据缓冲区管理、多线程协同及高级调试技巧,为构建稳定可靠的工业通信网关提供了系统化解决方案。

weixin_29194255的博客 372

Spring Cloud 整合(一) CRUD

Springcloud 整合之 CRUDSpringcloud介绍功能概述为什么要选用Springcloud Springcloud介绍 功能概述 实现微服务 Spring Cloud为开发人员提供了工具,以快速构建分布式系统中的某些常见模式(例如,配置管理,服务发现,断路器,智能路由,微代理,控制总线,一次性令牌,全局锁,领导选举,分布式会话,群集状态)。分布式系统的协调导致样板式样,并且使用Spring Cloud开发人员可以快速站起来实现这些样板的服务和应用程序。 为什么要选用Springcloud

Kerwin-Lin的博客 1501

Log4j2与JNDI结合

Log4j2和JNDI结合指定配置文件路径和日志文件

cloud的技术积累 4631

Cesium功能集(十二):Cesium中流体仿真

【代码】Cesium功能集(十二):Cesium中流体仿真。

GIS肆月 600

SecGPT-14B效果展示:支持中文安全术语与英文CVE混用提问,理解准确率91.5%

本文介绍了专为网络安全设计的AI大模型SecGPT-14B,其核心优势在于能精准理解中英文术语混用的复杂提问。用户可在星图GPU平台上自动化部署该镜像,快速搭建智能安全分析环境,典型应用场景包括自动化代码安全审计与漏洞分析,有效辅助安全工程师提升工作效率。

weixin_42462474的博客 18

Access查询中的Dlookup函数的妙用

在Microsoft Access中,处理和分析数据的过程中,常常会遇到需要根据条件从其他记录中提取特定数据的情况。这时候,Dlookup函数就成了开发者和数据分析师的得力助手。今天我们将通过一个具体的实例,详细探讨如何利用Dlookup函数来解决复杂的查询问题。

m0_62153576的博客 294

Unity的粒子系统使用shadergraph(内置管线)制作的一个顶点偏移shader,但是粒子模型移动时,顶点也会偏移?

🏆本文收录于 《全栈Bug调优(实战版)》 专栏,该专栏专注于分享我在真实项目开发中遇到的各类疑难Bug及其深层成因,并系统提供高效、可复现的解决思路和实操方案。无论你是刚入行的新手开发者,还是拥有多年项目经验的资深工程师,本专栏都将为你提供一条系统化、高质量的问题排查与优化路径,助力你加速成长,攻克技术壁垒,迈向技术价值最大化与职业发展的更高峰🚀!

**My Coding Family** 1174

Web应用中Log4j与JNDI结合1 -- JNDI指定配置文件

Web应用中Log4j和JNDI结合指定Log4j配置文件和Log路径第一步:JNDI指定配置文件

cloud的技术积累 1952

2024年CSP-X复赛真题题解(T1:购物)

2024年CSP-X复赛真题题解(T1:购物)

王老师青少年编程 1179

记录一次针对log4j的jndi注入攻击

事件经过 今天一到公司就被钉钉监控报警群@了,报错类型如下图所示: com.mysql.jdbc.MysqlDataTruncation:Data truncation:Data too long for column这个错误很常见,就是插入数据到数据库中,字段长度超过了数据库限制的长度。 于是我就去skywalking上找日志,看到底是什么参数超过了长度限制,于是我找到了报错的链路看到了网关打印的日志信息如下: 重点看我红线框出的部分,这一看就不是一个正常的传参,看起来像是某种攻击。 由此让我联想到,

大兵的博客 3834

华为OD机试真题 新系统 2026-04-26 Python&JS 实现【项目模块依赖构建顺序规划】

某公司正在开发一个大型软件系统,系统包含 N 个模块,每个模块之间存在构建依赖关系。例如,模块 A 可能依赖于模块 B,这意味着必须先构建模块 B,才能构建模块 A。 请根据依赖关系,输出所有可能的模块构建顺序(按照构建顺序排列模块名称),要求:

MISAYAONE的博客 404

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Apache Log4j 漏洞(JNDI注入 CVE-2021-44228)

影响范围 2.0 <= Apache log4j <= 2.14.1 利用 import org.apache.log4j.Logger; import java.io.*; import java.sql.SQLException; import java.util.*; public class VulnerableLog4jExampleHandler implements HttpHandler { static Logger log = Logger.getLogger(l

小龙在线 3万+

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

log4j2 JNDI注入复现

复现现象: 这个镜像使用了log4j2用来当做靶机程序 1、拉取一个docker镜像 docker pull vulfocus/log4j2-rce-2021-12-09 2、跑起来docker run -tid -p 38080:8080 vulfocus/log4j2-rce-2021-12-09 3、进入这个平台 https://log.xn–9tr.com/ 点击获取一个域名 4、执行一个post curl -X POST -F “payload=${jndi:ldap://

qq_20504373的博客 6695

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

log4j jndi 漏洞解决办法

log4j jndi 漏洞解决办法

fuyun996的专栏 4837

Apache Log4j任意代码执行漏洞安全风险通告第三次更新

奇安信CERT致力于第一时间为企业级用户提供安全风险通告和有效解决方案。风险通告近日,奇安信CERT监测到Apache Log4j存在任意代码执行漏洞。经过分析,该组件存在Java JND...

smellycat000的专栏 4665
上一篇: Web应用中Log4j与JNDI结合1 -- JNDI指定配置文件
下一篇: WAS(Websphere) 7升级到8.5遇到的头疼Verify Error问题
开心的D哥
博客等级 码龄22年 63粉丝 110原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值