引用Java安全学习——ROME反序列化
Java反序列化之Rome
什么是ROMEROME 是一个可以兼容多种格式的 feeds 解析器,可以从一种格式转换成另一种格式,也可返回指定格式或 Java 对象。ROME 兼容了 RSS (0.90, 0.91, 0.92, 0.93, 0.94, 1.0, 2.0), Atom 0.3 以及 Atom 1.0 feeds 格式。
Rome 提供了 ToStringBean 这个类,提供深入的 toString 方法对JavaBean进行操作
依赖1234567<dependencies> <dependency> <groupId>rome</groupId> <artifactId>rome</artifactId> <version>1.0</version> </dependency></dependencies>
典型gadget我们看yso中链子是怎么写的 ...
java反序列化
未读java反序列化
未读hibernate1hibernate>=5导入依赖12345<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>5.6.15.Final</version></dependency>
分析先看一手yso中的gadget
12345678910/** * org.hibernate.property.access.spi.GetterMethodImpl.get() * org.hibernate.tuple.component.AbstractComponentTuplizer.getPropertyValue() * org.hibernate.type.ComponentType.getPropertyValue(C) * org.hibernate.type.ComponentType.getHashCode() ...
java反序列化
未读引用深入浅出解析Jackson反序列化
前言jackson相关基础知识这里就不赘述了,可参看引用
逻辑跟fastjson差不多
jackson简单使用依赖
1234567891011121314151617<dependencies> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.9.3</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</ ...
java反序列化
未读引用fastjson
FastJson<=1.2.68RCE原理详细分析
fastjson 1.2.80 漏洞浅析及利用payload
FastJson与原生反序列化
FastJson与原生反序列化(二)
前言maven依赖:https://mvnrepository.com/artifact/com.alibaba/fastjson/1.2.24
12345<dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.24</version></dependency>
FastJSON 在序列化时,利用 Java 的反射机制,通过调用 JavaBean 的 getter 方法获取属性值。
在反序列化时,FastJSON 通过无参构造方法创建对象,并利用 setter 方法设置属性值
基础流程分析JSONObject是一个Map类
12 ...
java反序列化
未读引用Java安全学习——JNDI注入
JNDI概述JNDI(Java Naming and Directory Interface,Java命名和目录接口)是SUN公司提供的一种标准的Java命名系统接口。JNDI提供统一的客户端API,并由管理者将JNDI API映射为特定的命名服务和目录服务,为开发人员查找和访问各种资源提供了统一的通用接口,可以用来定义用户、网络、机器、对象和服务等各种资源。简单来说,开发人员通过合理的使用JNDI,能够让用户通过统一的方式访问获取网络上的各种资源和服务。如下图所示
命名服务(Naming Server)命名服务,简单来说,就是一种通过名称来查找实际对象的服务。比如我们的RMI协议,可以通过名称来查找并调用具体的远程对象。再比如我们的DNS协议,通过域名来查找具体的IP地址。这些都可以叫做命名服务。
例子:DNS(域名系统)
场景:当你在浏览器中输入 www.google.com 时,浏览器需要知道这个域名对应的 IP 地址才能访问网站。
命名服务的作用:
DNS 将域名(名称)映射到 IP 地址(对象)。
例如:
名称:www.google. ...
java反序列化
未读引用Java安全之RMI反序列化
攻击注册中心客户端与注册中心进行交互可以使用以下几种方式:
list
bind
rebind
unbind
lookup
这几种方法位于RegistryImpl_Skel.class文件中的dispatch方法中,如果存在readObject则可以进行反序列化攻击,具体方法内容可以自己去看一下
dispatch里面对应关系如下
0->bind
1->list
2->lookup
3->rebind
4->unbind
case1相关代码中没有readObject方法,所以无法利用
当调用bind时,会用readObject读出参数名以及远程对象,此时则可以利用
当调用rebind时,会用readObject读出参数名和远程对象,这里和bind是一样的,所以都可以利用
如果服务端存在cc1相关组件漏洞,那么就可以使用反序列化攻击(有cc依赖的话相关poc都可以使用)
注册中心上调用的是RegistryImpl_Skel.class文件中的dispatch方法里面的bind(),而在客户端上调用的是RegistryIm ...
java反序列化
未读引用教程:RMI - Java™教程
基于Java反序列化RCE - 搞懂RMI、JRMP、JNDI
如何创建java rmi环境
JAVA安全基础(四)– RMI机制
RMI概述以下是wiki的描述:
123Java远程方法调用,即Java RMI(Java Remote Method Invocation)是Java编程语言里,一种用于实现远程过程调用的应用程序编程接口。它使客户机上运行的程序可以调用远程服务器上的对象。远程方法调用特性使Java编程人员能够在网络环境中分布操作。RMI全部的宗旨就是尽可能简化远程接口对象的使用。Java RMI极大地依赖于接口。在需要创建一个远程对象的时候,程序员通过传递一个接口来隐藏底层的实现细节。客户端得到的远程对象句柄正好与本地的根代码连接,由后者负责透过网络通信。这样一来,程序员只需关心如何通过自己的接口句柄发送消息。
根据wiki所说RMI全称为Remote Method Invocation,也就是远程方法调用,通俗点解释,就是跨越jvm,调用一个远程方法。众所周知,一般情况下java方法调用指的是同一个jvm内方法的调用,而RMI与 ...
java反序列化
未读引用Java反序列化之CommonsBeanutils
依赖导入首先我们先导入依赖
12345<dependency> <groupId>commons-beanutils</groupId> <artifactId>commons-beanutils</artifactId> <version>1.9.3</version></dependency>
BeanJava Bean是一种特定规范的类,使得开发中更加模块化,一个bean需要包括几种特点:
实现Serializable接口,使得类可序列化
无参构造函数,JavaBean应有一个公共的无参构造函数以便使用的时候快速实例化
私有属性,bean的属性一般被声明为private
公有getter和setter用于修改和读取私有属性
注意:getter和setter方法命名要规范
举个简单的例子:
123456789publc class User() implements Serializable{ pr ...
java反序列化
未读感谢P神提供的环境:shirodemo
环境部署具体过程这边看
账号密码:root/secret
序列化Apache Shiro框架提供了记住密码的功能(RememberMe),用户登录成功后会生成经过加密并编码的cookie;数据通过Cookie中rememberMe的值传入后端之后,经过解密,反序列化获得到存储的数据
全局搜索cookie,选中CookieRemberMeManager类文件
我们对该文件进行审计,找到了以下的关键函数rememberSerializedIdentity(Subject subject, byte[] serialized)
可以看到函数中对参数serialized进行了base64编码并储存到了cookie当中,参数serialized肯定是跟序列化后的内容有关系,我们现在找一下哪个方法调用了该函数,在文件AbstractRememberMeManager.java中
可以看到rememberIdentity方法传入了一个subject对象以及一个PrincipalCollection对象,先对principals对象进行一个序列化,然后再经 ...