XStream反序列化
XStream介绍XStream是一个简单的基于Java库,能够将Java对象和xml文档之间进行相互转换
反序列化原因XStream实现了一套序列化和反序列化机制,核心是通过Converter转换器来将XML和对象之间进行相互的转换。
XStream反序列化漏洞的存在是因为XStream支持一个名为DynamicProxyConverter的转换器,该转换器可以将XML中dynamic-proxy标签内容转换成动态代理类对象,而当程序调用了dynamic-proxy标签内的interface标签指向的接口类声明的方法时,就会通过动态代理机制代理访问dynamic-proxy标签内handler标签指定的类方法;
利用这个机制,攻击者可以构造恶意的XML内容,即dynamic-proxy标签内的handler标签指向如EventHandler类这种可实现任意函数反射调用的恶意类、interface标签指向目标程序必然会调用的接口类方法;最后当攻击者从外部输入该恶意XML内容后即可触发反序列化漏洞、达到任意代码执行的目的。
相关类介绍EventHandler类EventHandler是一 ...
C3P0利用链学习
C3P0介绍C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate,Spring等。
JDBC是Java DataBase Connectivity的缩写,它是Java程序访问数据库的标准接口。使用Java程序访问数据库时,Java代码并不是直接通过TCP连接去访问数据库,而是通过JDBC接口来访问,而JDBC接口则通过JDBC驱动来实现真正对数据库的访问。
连接池类似于线程池,在一些情况下我们会频繁地操作数据库,此时Java在连接数据库时会频繁地创建或销毁句柄,增大资源的消耗。为了避免这样一种情况,我们可以提前创建好一些连接句柄,需要使用时直接使用句柄,不需要时可将其放回连接池中,准备下一次的使用。类似这样一种能够复用句柄的技术就是池技术。
环境搭建<!-- https://mvnrepository.com/artifact/com.mchange/c3p0 --><dependency> <groupId>com.mchange</grou ...
Java Agent学习
Java Agent介绍官方文档:https://docs.oracle.com/javase/10/docs/api/java/lang/instrument/package-summary.html
java agent就是一种能够在不影响正常编译的情况下,修改java字节码,进而动态地修改已加载或未加载的类、属性和方法的技术。也就是平时所说的插桩技术,平常的热部署、诊断工具都是基于Java Agent技术来实现的。该技术从JDK1.5开始引入。
Java Agent使用Java Agent分为两种,一种是在JVM启动前加载的premain-Agent,另一种是JVM启动后加载的agentmain-Agent,有点类似特殊的拦截器的样子。
premain-Agent实现该Agent首先我们必须实现一个静态premain方法,同时我们jar文件的清单(mainfest)中必须要有Premain-Class属性,也就是jar包中常见到的MF文件,这从官方文档中可以得知
可以知道,就是在执行main方法前执行我们的premain方法,执行的类就是我们Premain-Class属性的值
...
JDK17反射限制绕过学习
JDK17反射限制在JDK9至JDK16版本之中,Java.*依赖包下所有的非公共字段和方法在进行反射调用的时候,会出现关于非法反射访问的警告,但是在JDK17之后,采用的是强封装,默认情况下不再允许这一类的反射,所有反射访问java.*的非公共字段和方法的代码将抛出InaccessibleObjectException异常
比如下面获取ClassLoader的protected的defineClass方法
import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;import java.util.Base64;public class Attack { public static void main(String[] args) throws Exception { Method defineClass = ClassLoader.class.getDeclaredMethod("defineClass", Strin ...
XML反序列化学习
XMLDecoder介绍XMLDecoder是java自带的以SAX方式解析xml的类,其在反序列化经过特殊构造的数据时可执行任意命令。
所谓的解析就是在java对象和xml文件之间的转化。
SAX是什么SAX全称为Simple API for XML,在Java中有两种原生解析xml的方式,分别是SAX和DOM。两者区别在于:
Dom解析功能强大,可增删改查,操作时会将xml文档以文档对象的方式读取到内存中,因此适用于小文档
Sax解析是从头到尾逐行逐个元素读取内容,修改较为不便,但适用于只读的大文档
SAX采用事件驱动的形式来解析xml文档,简单来讲就是触发了事件就去做事件对应的回调方法。
在SAX中,读取到文档开头、结尾,元素的开头和结尾以及编码转换等操作时会触发一些回调方法,你可以在这些回调方法中进行相应事件处理:
startDocument()
endDocument()
startElement()
endElement()
characters()
简单demo一个简单的pojo类
package org.example.XMLTest;public class ...
DASCTF 2024金秋十月部分题目复现
官方wp链接:https://www.yuque.com/chuangfeimeiyigeren/eeii37/xn0zhgp85tgoafrz?singleDoc#FAsbS
ezlogin就是一个正常的登录、注册、修改密码的服务,看了一下jar包
见到熟悉的hutool,前面的ciscn题目复现才遇到,然后spring-boot那就是有jackson
当时审了半天的逻辑,发现能给传参的参数长度都限制死了,他有一个默认的xml文件
<!-- this is /user/AAAAAA.xml --><java> <object class="org.example.auth.User"> <void property="username"> <string>AAAAAA</string> </void> <void property="password"> ...
UTF-8 Overlong Encoding绕过学习
之前只是浅浅的知道这个东西,现在来深入学习一下,因为在java题目中有时会用到该方法来进行绕过
UTF-8编码过程UTF-8(8-bit Unicode Transformation Format)是一种用于编码Unicode字符的可变长度字符编码方案。它能够表示Unicode字符集中的每个字符,并且与ASCII编码兼容。
它可以将Unicode里的所有字符转换成1到4个字节来表示
下面是一个Unicode对应UTF-8的转换表
常见的ASCII字符(U+0000到U+007F)用1个字节表示。
其他Unicode字符根据其范围使用2到4个字节。
以欧元符号€来举例,该符号的Unicode编码为U+20AC,位于U+0800和U+FFFF之间,所以为三个字节,编码长度为3,0x20AC的二进制为10 0000 1010 1100
然后根据每个字节缺的位数,从左至右按顺序分成三组,第一组长度不满在前面补零:0010,000010,101100
然后填进去,转换成十六进制,欧元符号的UTF-8编码就是\xE2\x82\xAC
python来decode验证一下
Overlong E ...
ciscn2023国赛DeserBug复现
虽说题目不是很难,但是由于java题目做的还不是很多不太熟悉,而且java基础不牢,导致一些点让我思考了很久,这里记录一下
DeserBug题目jadx反编译源码
Testapp这里,直接根目录传一个bugstr参数,然后将内容base64解码后反序列化
Myexpect是一个异常类,没看出有什么特别的地方
然后题目附件还给了两个包commons-collections-3.2.2.jar,hutool-all-5.8.18.jar
特意给了一个3.2.2是为什么呢,查了一下commons-collections从3.2.2版本开始尝试序列化或反序列化InvokerTransformer类都会抛出UnsupportedOperationException异常
且该版本在一些危险的Transformer实现类的readObject前加上了FunctorUtils#checkUnsafeSerialization来检测反序列化是否安全。
然后没什么思路了,去看wp当时题目还给了两个提示
cn.hutool.json.JSONObject.put->com.app.Myex ...
Jackson原生反序列化
参考文章:https://xz.aliyun.com/t/12509?u_atoken=0f8fa2b10f046b73ed286030e1ee9f9e&u_asig=1a0c381017287414696367848e00f7
前言Jackson的原生反序列化主要是为了触发任意getter方法调用链子,类似fastjson原生反序列化触发getter那样
getter触发流程既然要调用任意getter方法,那我们就要触发getter方法的流程
Jackson触发getter是在ObjectMapper#writeValueAsString方法执行的时候
打个断点跟踪一下
这里说几个关键方法
先走到DefaultSerializerProvider#serializeValue方法
这里获取一个序列化器,我们传入了POJO对象,所以返回一个BeanSerializer
然后去到BeanSerializer#serialize方法
writeStartObject和writeEndObject就是分别在首尾写上’{‘和’}’
调用getter方法就在serializeFie ...
fastjson原生反序列化
看了fastjson的各版本链子,再看一下fastjson的原生反序列化,看的是y4师傅的两篇文章
https://y4tacker.github.io/2023/03/20/year/2023/3/FastJson%E4%B8%8E%E5%8E%9F%E7%94%9F%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96/
https://y4tacker.github.io/2023/04/26/year/2023/4/FastJson%E4%B8%8E%E5%8E%9F%E7%94%9F%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96-%E4%BA%8C/
来简单的学习复现一下
利用限制Fastjson1版本小于等于1.2.48(不过1.2.49之后也有绕过方法,这里指的是直接用不需要绕过的)
Fastjson2<=2.0.26(我自己测试刚好在文章版本的下一个版本2.0.27开始就不行了)
找链子要用原生反序列化,就需要寻找fastjson中继承了Serializable接口的类,fastjson里面有两个这样的类:JS ...