引用教程: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接口是一个标记接口,不用实现任何方法。一旦实现了此接口,该类的对象就是可序列化的;不实现此接口的类将不 ...
前言本篇复盘仅仅是针对于本次比赛中我不会的题目进行一次复盘,对于做出来的题目并不会写上相关的题解
并且仅仅是web方向的题目
Re: 从零开始的 XDU 教书生活该题首先要对题目提供的源码理解透彻,明白每个函数的功能
题目要求是要让每个学生都正常签到才可以获得flag
其实本质上就是需要我们重复发送请求
脚本如下:
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495import requestsfrom Crypto.Cipher import AESimport base64# 请替换为您的靶机BASE_URL = "http://127.0.0.1:8888"def encrypt_by_aes(data: str, key: str, iv: str) ...
借鉴JWT渗透姿势
JWT(JSON Web Token)是一种无状态认证机制,通过将用户身份和权限信息存储在令牌中,实现安全地在网络应用间传递信息。它具有跨域支持、扩展性和灵活性、安全性以及可扩展的验证方式等特点,成为现代应用开发中重要的认证和授权解决方案。
JWT的组成JWT的结构由三部分组成,分别是Header、Payload和Signature,下面是每一部分的详细介绍和示例:
Header 部分在 JWT 中 Header 部分存储的是 Token 类型和加密算法,通常使用JSON对象表示并使用Base64编码,其中包含两个字段:alg和typ
alg(algorithm):指定了使用的加密算法,常见的有HMAC、RSA和ECDSA等算法
typ(type):指定了JWT的类型,通常为JWT
下面是一个示例Header:
1234{ "alg": "HS256", "typ": "JWT"}
Payload 部分Payload包含了JWT的主要信息,通常使用JSO ...