Java反序列化Fastjson篇01-FastJson基础
0x00 前言本文将缩减调试配图,增加言语概述,对于新手理解本文有一定的难度(新手也不会看本文吧)。
0x01 概述概念
Fastjson 是 Alibaba 开发的 Java 语言编写的高性能 JSON 库,用于将数据在 JSON 和 Java Object 之间互相转换。
提供两个主要接口来分别实现序列化和反序列化操作。
JSON.toJSONString 将 Java 对象转换为 json 对象,序列化的过程
JSON.parseObject/JSON.parse 将 json 对象重新变回 Java 对象;反序列化的过程
依赖
12345<dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.24</version> </dependency>
0x02 表象假设服务端要解析一串JSON数据:
对应的Person类:
123 ...
JavaDeserializeLabs02-Lab3
0x00 前言我打算深入分析具体的流程,进而总结出更多的调试经验。
0x01 正文问题表象搭建Docker和本地环境,开启服务:
观察题目文件和jar包:
看到CC包,难免想试试cc链攻击。但是在此之前,需要先观察题目文件的具体逻辑:
自定义了MyObjectInputStream类来替代ObjectInputStream类,并且重载了resolveClass方法(resolveClass方法通常用于根据类名动态加载相应的类):
没多想这样的改动,先用CC6试试。
事实上,当发现类和方法被修改时,应该与原始的代码去对比,比较不同之处,进而针对性地解决问题。
CC6_POC如下:
1234567891011121314151617181920212223242526272829303132333435363738394041package com.yxxx.javasec.deserialize;import org.apache.commons.collections.Transformer;import org.apache.commons.collections.fun ...
Java反序列化之JDNI学习
0x00 前言JNDI内容也不少,原理和方法都要弄清楚。
本文前面概念部分存在大量原话引用,先叠个甲,因为我觉得这些引用表述的非常清晰。
0x01 概述JNDI概念JNDI(Java Naming and Directory Interface,Java命名和目录接口)是SUN公司提供的一种标准的Java命名系统接口。JNDI提供统一的客户端API,并由管理者将JNDI API映射为特定的命名服务和目录服务,为开发人员查找和访问各种资源提供了统一的通用接口,可以用来定义用户、网络、机器、对象和服务等各种资源。简单来说,开发人员通过合理的使用JNDI,能够让用户通过统一的方式访问获取网络上的各种资源和服务。如下图:
上文提到了两个名词:命名服务(Naming Server)、目录服务(Directory Server),它们分别是什么,在JNDI中又扮演着什么作用呢?
命名服务(Naming Server)命名服务,简单来说,就是一种通过名称来查找实际对象的服务。比如RMI协议,可以通过名称来查找并调用具体的远程对象。再比如DNS协议,通过域名来查找具体的IP地址。这些都可以叫做命名服 ...
Java反序列化之RMI专题02-RMI攻击方式
0x00 前言RMI攻击对象有三个:注册中心、客户端、服务端。
每一种攻击方式,除了确定受害者,还要确定攻击者、攻击场景和攻击条件。
0x01 攻击注册中心
只有客户端打注册中心一种方式
概述要想攻击注册中心,先要确定注册中心的反序列化点。RegistryImpl_Skel#dispatch给了几个case:
0->bind
1->list
2->lookup
3->rebind
4->unbind
不难发现,case1(响应list方法)不存在readObject方法,所以此处不存在反序列化点。但是其余的case有,所以我们不妨一试。
bind & rebind先分析整个流程,再构造POC。
bind方法有两个参数,第一个参数是绑定对象的名称,String类型;第二个参数是绑定对象本身,Remote类型。bind方法会把两个参数交给前文对应的case0处理:
事实上,我们只需要readObject方法执行就可以了,不需要在意之后的操作。但是bind方法限定了参数类型,所以我们仍然要在最外层套一层壳。
如果注册中心(一般与服务端在同一台JV ...
Java反序列化之RMI专题01-RMI基础
0x00 RMI简述RMI是什么
RMI 全称 Remote Method Invocation(远程方法调用),是Java语言执行远程方法调用的Java API。RMI允许一个 JVM 中 Java 程序调用在另一个远程 JVM 中运行的 Java 程序,这个远程 JVM 既可以在同一台实体机上,也可以在不同的实体机上,两者之间通过网络进行通信。
JRMP是什么
RMI里两个JVM通信所采用的协议正是JRMP(Java Remote Method Protocol, Java远程方法协议)。RMI用JRMP协议去组织数据格式然后通过TCP进行传输,从而实现远程方法调用。
RMI时序图
RMI的流程较为复杂,不妨先从下图入手:
服务端先创建远程对象并向注册中心注册该远程对象,客户端向注册中心查找该远程对象,注册中心会返回该远程对象的存根(Stub),客户端对存根调用service进而与服务器骨架(Skeleton)通信,服务器对骨架调用service并返回给本地存根,本地存根返回给客户端。
0x01 基础环境本文有相当一部分的调试内容,但在此之前需要准备RMI工作的基本代码。
起两个 ...
2025ROIS冬令营第一周Web题目讲解
2025ROIS冬令营第一周Web题目讲解第一题 ez_http题目:
重点:
HTTP - 基本认证 - huey2672 - 博客园
自学能力
解答:12345678POST /?year=2025 HTTP/1.1Host: challenge.ctf.rois.team:30667Authorization: Basic Uk9JUzpST0lTUser-Agent: HappyNewYearContent-Type: application/x-www-form-urlencodedReferer: rois.fzu.edu.cnteam=ROIS
第二题 header题目:
重点:
稍微了解网络发包流程
系统性思维
解答:使用BurpSuite发包并拦截第一个响应包
第三题 error题目:
重点:
sql注入流程,sql注入点探测
sql注释:SQL注入注释符(#、– 、/**/)使用条件及其他注释方式的探索 - impulse- - 博客园
报错注入相关知识:文章 - SQL 注入总结 - 先知社区
学会使用工具,比如sqlmap( ...
Java反序列化Shiro篇02-无cc依赖链与纯cc链
0x00 前言完结,亦是开始
0x01 无cc链前文讲的cb链是有用到cc库的,具体如下:
前文我们无参调用构造器,便调用了cc库。如果不想使用cc库,加上参数就可以了。但是加什么类型的参数,参数是否符合链子的后续利用等都需要思考。
其实该参数是什么都不影响,所以我们只要确保类型即可:
一言以蔽之,找到了cc库被调用的点,换掉即可。给出cb无cc依赖POC:
0x02 纯cc链也叫cc11链,是cc2与cc6的结合体。因为shiro550传数组会报错,所以我们不能使用Transformer[],给出思路图,慢慢想:
en,为什么前半段要cc6呢,经过LazyMap的都可以吧······待会试试。
一次反射LazyMap类只能提供一次反射,不难想到采用加载字节码(静态代码块执行)的方式。正好TemplatesImpl类前可以链入InvokeTransformer类,这样一次反射就可以触发危险类。给出流程图:
给出POC:
1234567891011121314151617181920212223242526272829303132333435363738394041424344 ...
Java反序列化Shiro篇01-入门与cc依赖
0x00 前言本篇先配置环境,分析源码,给出URLDNS,最后给出cb的cc依赖的Gadget Chain。
本文尝试以独立发现的视角去寻找漏洞点,如有不妥还望海涵。
0x01 配置环境本文基于P神所给的环境:点这里下载项目。
将shirodemo项目用IDEA打开,然后对该项目配置tomcat环境(自行下载tomcat),如图:
其余配置照上图自行调整即可,然后启动项目,如图:(我已经启动过一次,所以这里是“重新运行”)
然后shirodemo项目下会生成target目录,把该目录下的shirodemo目录部署到tmocat中,如下图:
找到shirodemo目录
部署到tomcat中
最后再重新启动一遍项目即可。登录界面如下:
0x02 分析源码从前端开始账户:root;密码:secret;勾选Remember me,抓包:
再抓一次包:
那一长串的rememberMe不见了,只多了一串JESSIONID。不难猜到JESSIONID用于会话跟踪。那么rememberMe和JESSIONID会不会有什么关系呢?重开项目,不勾选rememberMe,抓包:
二者 ...
Java反序列化Commons-BeanUtils篇
0x00 前言忙活了一下午才解决了这条链子。这条链子并不难,当自己静下心细细沉思,便能发现问题存在。
静心方能得意,得意方能成事。
0x01 概述Commons-BeanUtils与JavaBean
Apache Commons 工具集不仅有 collections,还有 BeanUtils,后者主要用来JavaBean。
何为JavaBean?
JavaBean 是一种JAVA语言写成的可重用组件,它是一个类
所谓javaBean,是指符合如下标准的Java类:
类是公共的
有一个无参的公共的构造器
有私有属性,且须有对应的get、set方法去设置属性
对于boolean类型的成员变量,允许使用”is”代替上面的”get”和”set”
比如这样一个类:
上述的Person类包含了一个私有属性name,以及读取和设置name的两个public方法 getName和setName,即getter和setter。遵守上述规范的类就称之为JavaBean。
类似setName()这种对属性进行修改的方法,称之为属性修改器或setter方法;类似getName()这种对属性进行读取的 ...
JavaDeserializeLabs01-Lab1&Lab2
0x00 前言Lab1和Lab2算是对Java反序列化基础和CC链的锻炼,还学到了很多知识。
0x01 入手搭建环境JavaDeserializeLabs既可以本地直接用Class文件起服务,也可以在Docker上起服务,当然也可以复刻Java文件再起服务——便于调试。
第一种和第三种方法都是在本地起服务,因为JavaDeserializeLabs是由springboot启动的,所以需要先搭建springboot环境。
搭建springboot环境,类型是maven,jdk用1.8,java用8
springboot用 2.* , 因为3.* 之上的不兼容Java8;勾选spring web,然后创建
创建lib文件夹,将对应的jar包拷贝至此,先解压再入库
查看、启动项目:
我比较习惯用第三种方法:复刻项目,本地调试(多的文件是自己新建的,不影响题目运行)
至于在Docker上如何运行题目,只需要一个口令:
1docker-compose up -d
0x02 Lab1源码
前端页面
第一步永远是先看懂源码!
先把十六进制的data转换成字节数组, ...