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对象进行一个序列化,然后再经 ...
Write-Up
未读Lab1在java中对于bash命令的执行会把它按照空格分成三部分,也就是反弹shell命令中只能存在两个空格
序列化脚本如下:
12345678910111213141516171819202122232425package yxxx.javasec.deserialize;import com.yxxx.javasec.deserialize.Calc;import com.yxxx.javasec.deserialize.Utils;import java.io.ByteArrayOutputStream;import java.io.ObjectOutputStream;import java.lang.reflect.Field;public class Test { public static void main(String[] args) throws Exception { Calc calc = new Calc(); Class c = calc.getClass(); Field field = ...
静态代理首先定义一个接口,实现类,以及一个代理类
12345package com.sherlock;public interface IUser { void show();}
123456789101112package com.sherlock;public class UserImpl implements IUser{ public UserImpl(){ } @Override public void show() { System.out.println("展示"); }}
123456789101112package com.sherlock;public class UserProxy implements IUser { IUser user; public UserProxy(){} public UserProxy(IUser user) {this. ...
静态代码块的执行在上文JDK动态代理的代码中,在Person类定义中添加以下几点:
一个静态属性id,一个静态方法,一个静态代码块,一个构造代码块
12345678910public static int id;public static void staticAction(){ System.out.println("静态方法调用");}static { System.out.println("静态代码块调用");}{ System.out.println("构造代码块利用");}
对静态属性调用,会触发静态代码块
1Person.id = 1;
对静态方法调用,也会触发静态代码块
1Person.staticAction();
对类进行初始化,两种代码块都被调用:
1new Person();
class的获取在java中,获取一个类的class,有下面几种方式:
这样只进行了加载,没进行初始化,因此没有任何输出
1Class<?& ...