引用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<?& ...
java反序列化
未读前言12Commons Collections <= 3.2.1jdk <= 8u65
CC1危险的方法调用:Transform.transform()
Transformer接口,该接口主要就是定义了一个接口方法transform()
ConstantTransformer类:ConstantTransformer类中的transform()方法:
返回一个常量,该常量在构造方法调用的时候就确定了,因此,后续不管transform()方法传入什么对象,都将返回构造对象时构造方法传入的那个对象
InvokerTransformer我们可以查看实现这个接口的类(idea中选中接口名+ctrl+h)
然后在其中有一个实现类为InvokerTransformer.java,其中的transform方法如下
可以发现该方法接受任意一个对象实例,进行反射调用执行任意方法
所以让我们来测试一下,我们先看一下InvokerTransformer类的构造函数:接收参数名,参数类型,参数值
测试代码如下,成功弹出计算器
ChainedTransformer类:该类的transfo ...
引用java序列化,看这篇就够了
大白话说Java反射:入门、使用、原理 - 陈树义 - 博客园
序列化的含义、意义及使用场景
序列化:将对象写入到IO流中
反序列化:从IO流中恢复对象
意义:序列化机制允许将实现序列化的Java对象转换位字节序列,这些字节序列可以保存在磁盘上,或通过网络传输,以达到以后恢复成原来的对象。序列化机制使得对象可以脱离程序的运行而独立存在。
使用场景:所有可在网络上传输的对象都必须是可序列化的,比如RMI(remote method invoke,即远程方法调用),传入的参数或返回的对象都是可序列化的,否则会出错;所有需要保存到磁盘的java对象都必须是可序列化的。通常建议:程序创建的每个JavaBean类都实现Serializeable接口。
序列化实现的方式如果需要将某个对象保存到磁盘上或者通过网络传输,那么这个类应该实现Serializable接口或者Externalizable接口之一。
Serializable普通序列化Serializable接口是一个标记接口,不用实现任何方法。一旦实现了此接口,该类的对象就是可序列化的;不实现此接口的类将不 ...