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 利用 ...
随机推荐
- Android第七周作业
1.三个界面,界面1点击按钮使用显式意图开启界面2.界面2点击按钮隐式意图开启界面3 package com.example.myapplication; import androidx.appcom ...
- 《手把手教你》系列基础篇(九十二)-java+ selenium自动化测试-框架设计基础-POM设计模式简介(详解教程)
1.简介 页面对象模型(Page Object Model)在Selenium Webdriver自动化测试中使用非常流行和受欢迎,作为自动化测试工程师应该至少听说过POM这个概念.本篇介绍POM的简 ...
- linux开机报警无法进入系统
一.开机无法进入系统提示如下 二.输入"journactl"命令查看红色的日志提示什么错误 三.问题分析: 这是由于swap告警,根据报错信息可以分析出是这两个device设备访问 ...
- 实战 target 选择器,解放生产力!
大家好,我是半夏,一个刚刚开始写文的沙雕程序员.如果喜欢我的文章,可以关注 点赞 加我微信:frontendpicker,一起学习交流前端,成为更优秀的工程师-关注公众号:搞前端的半夏,了解更多前端知 ...
- JS 一些概念
JS 内存机制 基本类型: String | Boolean | Undefined | Number | Nll | Symbol 数据保存在"栈"--先进后出. 数据类型: A ...
- p2p-tunnel 打洞内网穿透系列(二)TCP转发访问内网共享文件夹
系列文章 p2p-tunnel 打洞内网穿透系列(一)客户端配置及打洞 p2p-tunnel 打洞内网穿透系列(二)TCP转发访问远程共享文件夹 p2p-tunnel 打洞内网穿透系列(三)TCP转发 ...
- v82.01 鸿蒙内核源码分析 (协处理器篇) | CPU 的好帮手 | 百篇博客分析 OpenHarmony 源码
本篇关键词:CP15 .MCR.MRC.ASID.MMU 硬件架构相关篇为: v65.01 鸿蒙内核源码分析(芯片模式) | 回顾芯片行业各位大佬 v66.03 鸿蒙内核源码分析(ARM架构) | A ...
- 项目完成小结 - Django3.x版本 - 开发部署小结 (2)
前言 好久没更新博客了,最近依然是在做之前博客说的这个项目:项目完成 - 基于Django3.x版本 - 开发部署小结 这项目因为前期工作出了问题,需求没确定好,导致了现在要做很多麻烦的工作,搞得大家 ...
- 面试突击49:说一下 JUC 中的 Exchange 交换器?
Exchange(交换器)顾名思义,它是用来实现两个线程间的数据交换的,它诞生于 JDK 1.5,它有两个核心方法: exchange(V x):等待另一个线程到达此交换点,然后将对象传输给另一个线程 ...
- 890. Find and Replace Pattern - LeetCode
Question 890. Find and Replace Pattern Solution 题目大意:从字符串数组中找到类型匹配的如xyy,xxx 思路: 举例:words = ["ab ...