当前位置: 首页 > news >正文

应用安全系列之四十五:日志伪造(Log_Forging)之三

1、简介

针对Java的日志系统有多种,本文主要描述如何通过修改配置文件来解决logback和log4j的日志伪造问题。

2、logback

2.1、系统提供的解决方案

logback.xml中配置编码器自动转义特殊字符:

复制
<configuration>
  <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %replace(%msg){'[\r\n]', '\\n'}%n</pattern>
    </encoder>
  </appender>
  
  <root level="INFO">
    <appender-ref ref="CONSOLE" />
  </root>
</configuration>

2.2、自定义的解决方案

对于Logback,可以创建自定义转换器:

public class SanitizingConverter extends ClassicConverter {
    @Override
    public String convert(ILoggingEvent event) {
        return event.getFormattedMessage()
                   .replace("\n", "\\n")
                   .replace("\r", "\\r");
    }
}

再在配置文件中配置自定义的转换器:

<configuration>
  <conversionRule conversionWord="sanitizedMsg" 
                 converterClass="com.example.SanitizingConverter"/>
                 
  <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <pattern>%d %sanitizedMsg%n</pattern>
    </encoder>
  </appender>
</configuration>

 

2、log4J

2.1 使用过滤器(Filter)

创建自定义Filter:

import org.apache.log4j.spi.Filter;
import org.apache.log4j.spi.LoggingEvent;

public class LogForgeFilter extends Filter {
    @Override
    public int decide(LoggingEvent event) {
        String message = event.getRenderedMessage();
        if (message != null && (message.contains("\n") || message.contains("\r"))) {
            return Filter.DENY; // 拒绝包含换行符的日志
        }
        return Filter.NEUTRAL;
    }
}

然后在配置中添加:

log4j.appender.CONSOLE.filter.1=com.yourpackage.LogForgeFilter

 这种方法由于在异常情况下,会不记录日志,就会导致有些异常的日志被过滤调了,不利于后期的攻击的调查。建议还是使用其它方案,把所有的日志都记录下来。

2.2、Log4J 1.x

2.2.1、系统提供的解决方案

log4j.properties中添加或修改以下配置:

log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
log4j.appender.CONSOLE.layout.replaceNewlines=true

2.2.2、自定义的解决方案

  1. 首先创建一个自定义的Layout类:

import org.apache.log4j.PatternLayout;
import org.apache.log4j.spi.LoggingEvent;

public class SanitizingPatternLayout extends PatternLayout {
    @Override
    public String format(LoggingEvent event) {
        String message = super.format(event);
        // 替换换行符和回车符
        return message.replace("\n", "\\n").replace("\r", "\\r");
    }
}

   2. 在log4j.properties中使用这个自定义Layout: 

log4j.appender.CONSOLE.layout=com.example.SanitizingPatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

2.3、Log4J 2

2.3.1、系统提供的解决方案

log4j2.xml中使用encode{}或替换模式:

<Configuration>
  <Appenders>
    <Console name="Console" target="SYSTEM_OUT">
      <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5level %logger{36} - %encode{%msg}{CRLF}%n"/>
    </Console>
  </Appenders>
  <Loggers>
    <Root level="info">
      <AppenderRef ref="Console"/>
    </Root>
  </Loggers>
</Configuration>

2.3.2、对所有输出进行编码处理

log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} [%t] %-5p %c - %encode{%m}%n

注意:标准Log4j 1.x不直接支持%encode,需要自定义PatternLayout或使用扩展库

相关文章:

  • DeepSeek实战:如何用AI工具提升销售转化率?
  • newspaper公共库获取每个 URL 对应的新闻内容,并将提取的新闻正文保存到一个文件中
  • 数字集成电路中时延不可综合与时间单位介绍
  • 用实体识别模型提取每一条事实性句子的关键词(实体),并保存到 JSON 文件中
  • JVM不同环境不同参数配置文件覆盖
  • C++中作用域(public,private,protected
  • CSS 过渡与变形:让交互更丝滑
  • STM32中Hz和时间的转换
  • context上下文(一)
  • C#里使用MaterialDesign来构造自定义窗口
  • 希哈表的学习
  • 9-函数的定义及用法
  • ASP.NET Core 性能优化:服务器端响应缓存
  • Lab Cloud FPGA 硬件在线实验云平台介绍
  • aviator 自定义表达式
  • 猫咪如厕检测与分类识别系统系列【二】多图上传及猫咪分类特征提取更新
  • 设计模式:工厂方法模式 - 高扩展性与低耦合的设计之道
  • 【AI】免费GPU算力平台部署wan2.1
  • 三肽-10瓜氨酸(核心蛋白聚糖肽)-抗皱抗衰 改善肤质
  • 华为的欧拉操作系统怎么进行开发、环境搭建、编译、调试等
  • 洛阳做网站哪家便宜/搜索引擎营销是什么意思
  • 南京做网站seo的/百度下载安装app
  • 网站开发对cpu要求高吗/跨境电商平台有哪些?
  • php动态网站怎么做/重庆企业免费建站
  • 广州17做网站/佛山优化推广
  • 智通人才网招聘信息/信息流优化师培训