Java反序列化Commons-Collections篇07-总结反思篇
0x00 前言慢慢写,希望能写出一点深度。
0x01 总述cc1-7链子的总览图:
不用刻意去记链子的组成部分,学明白蕴含的思想就可以了。
后半链子
链子底部有两种执行危险方法的方式:反射调用、代码块执行。基于反射调用,我们需要使用InvokeTransformer类;基于代码块执行,我们需要使用InstantiateTransformer等类(在下文会探讨具体的实现过程)。
无论是哪种方法,它们的触发方式都是transform方法。不难想到,即使给了transform方法,怎么保证对应的类符合要求呢?在此基础上,使用ChainedTransformer类和ConstantTransform类去控制条件即可。
现在链子的后半部分已经确定了,只需要一个transform方法触发即可。正是这种相当独立的构造,使得cc链变得很灵活。但这毕竟是基于ChainedTransformer类,如果这个类不能使用了呢?cc2链解决了这个问题:ChainedTransformer类的作用是控制条件,详细地说,其作用是保证InvokeTransformer.transform方法接受的参数是预期的参 ...
Java反序列化Commons-Collections篇06-cc2、cc5、cc7链
0x00 前言你是否以为这是完结篇?
0x01 CC2还是使用org.apache.commons.collections4。
本链采用InvokerTransformer.transform(TemplatesImpl)作为链子底部,最外面使用priorityQueue类。本链的特点是没有用到transforms数组和ChainsedTransformer类。
原理请读者自行弄懂,下一篇文章我会给出所有链子的流程图。现在给出POC:
0x02 CC5本链不强调版本。
本链采用ChainsedTransformer类作为链子底部,使用BadAttributeValueExpException类进行readObjcet,给出POC:
0x03 CC7本链比较复杂,留给读者自行学习,只给出POC:
0x04 结语重点是下一篇博客,会给出cc链的总结反思。
Java反序列化Commons-Collections篇06-CC4链
0x00 前言读者能看到这里,想必对Java反序列化cc链有一定熟悉了。本文不再以寻找的视角学习cc4链,侧重于宏观分析和调试思路。
0x01 概述背景cc4链使用的是commons-collections4库,先载入:
12345<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-collections4</artifactId> <version>4.0</version></dependency>
commons-collections4库4.0之后的版本,InvokerTransformer不再继承Serializable接口,所以本文还是使用静态代码执行危险函数,采用的类是InstantiateTransformer。
思路cc链围绕着transform方法展开
cc4链子底部依然采用ChainedTransformer.transform方法,只需往上找即可。
0x02 ...
Java反序列化Commons-Collections篇04-CC3链
0x00 前言组长讲得还是那么好,但是这条链有点长,其中的知识有点多,所以我写得会多一点。
cc3的优点在于没有用到InvokeTransform类,相当于多了一种攻击手段。
0x01 思路
代码执行方式
从某种程度上说,Java反序列化的目的是实现任意代码执行。
但是开发者往往不会在程序里留下常见的危险方法,这就需要我们动态调用危险方法,比如通过Java反射机制或者静态代码块执行/构造函数执行。
在前面所学的cc1、cc6等链子中,我们采用的是Java反射机制(主要是InvokeTransform类),本文所学的cc3链将采用静态代码块执行(构造函数执行也是一样的),并运用到cc1、cc6等链子中。
类初始化
静态代码块执行的条件是所在类进行初始化,也就是newInstance。想要执行一个类的静态代码块,就需要想办法加载这个类并且初始化。
所以寻找底部链子的思路就是:
找到可以执行任意类加载并且将其初始化的方法,然后调用上述方法。
当底部链子找到以后,再一层层往上找,直至找到readObject方法。
0x02 cc3底部链子类加载 -> 类初始化 -> ...
Java反序列化Commons-Collections篇03-CC6链
0x00 前言本文还是采取简略概述的模式。
0x01 思路matthias_kaiser前辈给出的链子:
/* Gadget chain: java.io.ObjectInputStream.readObject() java.util.HashSet.readObject() java.util.HashMap.put() java.util.HashMap.hash() org.apache.commons.collections.keyvalue.TiedMapEntry.hashCode() org.apache.commons.collections.keyvalue.TiedMapEntry.getValue() org.apache.commons.collections.map.LazyMap.get() ...
Java反序列化Commons-Collections篇02-CC1链补充
0x00 前言本文比较简短,目的是补充cc1链的知识。
本文给出的cc1链是最先被定义为cc1的链子,但不必过多纠结,全学不就是了。
本文不完全按照寻找链子的思路,而要求读者具有一定的cc1链知识储备,可以先看本人前一篇博客,但是更推荐白日梦组长的视频。
0x01 尾部尾部仍然是InvokeTransform类的transfom方法,给出当前的poc:
有一点需要注意一下,Transformer数组的第一个元素仍然在后面发挥了不可替代的作用。
现在需要一个方法调用transform方法,查找用法即可。
0x02 中间LazyMap.get()LazyMap.get方法:
追溯factory成员参数:
factory可控,给出目前的poc:
AnnotationInvocationHandler.invoke()AnnotationInvocationHandler.invoke方法的调用点:
invoke方法需要注意一下这里:
成员参数member是String类型是一个坑点。我最开始希望member是一个Object类型,这样可以直接传Runtime.getRuntime ...
Java反序列化Commons-Collections篇01-CC1链
0x00 前言打了一个月Java反序列化的基础,开始cc链。本文先按照白日梦组长和我自己的节奏走,再补一点别人的思路。
建议在看完组长的视频后再阅读本文
参考教程:
Java反序列化CommonsCollections篇(一) CC1链手写EXP_哔哩哔哩_bilibili
Java反序列化Commons-Collections篇01-CC1链 | Drunkbaby’s Blog
0x01 准备概述这里给出闪烁之狐大佬的文章:
Apache Commons Collections包和简介
文章前面的介绍还是很推荐大家看看的
环境在学习cc1链之前,先搭好环境。大体需要以下三个:
JDK8u65
openJDK 8u65
Maven 3.6.3(其余版本可以先试试,不行再降版本)
然后添加依赖:
123456<!-- https://mvnrepository.com/artifact/commons-collections/commons-collections --> <dependency> <groupId>commons-coll ...
浅谈“越权与提权”
0x00 前言很早之前就想写这篇博客,但是Java反序列化的任务很重,就一直搁置着。偷得浮生半日闲,就这样写一篇吧。
0x01 概念我最开始并不能清晰地理解越权和提权是什么,常常把它们混为一谈,实际上二者还是有很大差别的。
越权:一般在Web服务中,由于权限控制不当,用户通过某些手段访问本不该有权限的操作。这往往是由于Web服务的逻辑漏洞造成的。
提权,一般是在拿到shell之后,由于权限较低,利用系统漏洞或配置错误来提高自己的权限。
一般来说,越权主要涉及访问控制的错误,而提权主要指在系统中提升权限的操作。
0x02 越权概述越权漏洞有两大类:水平越权、垂直越权。
水平越权发生在具有相同权限级别的用户之间,攻击者通过利用漏洞,可以访问其他用户的资源或者执行一些不符合用户现有权限的操作。
垂直越权发生在具有多个权限级别的系统中,攻击者通过利用漏洞,功能模块从低权限级别跳转到高权限级别。
举一个简单的例子:
用两个用户A、B以及管理员C。每个用户只能看自己的文章,管理员可以对用户的文章进行任意操作。
水平越权:用户A利用漏洞,成功访问到用户B的文章,这属于同一权限层级的越权行为。
垂直越 ...
Java反序列化基础篇-05-类的动态加载
0x00 前言Java反序列化基础篇的最后一篇,断断续续学习Java反序列化基础快一个月了,所幸学的都懂,基础还行。
参考教程:
类的动态加载
Java类加载机制和对象创建过程 - 个人文章 - SegmentFault 思否
Java反序列化基础篇-05-类的动态加载
类加载器详解(重点)
通俗易懂的双亲委派机制-CSDN博客
干货分享:一文让你入门 Java 字节码! - 知乎
什么是Java字节码?_字节码怎么产生的-CSDN博客
Java 反射之Class类动态加载类的用法
0x01 类加载引子学习一个事物,首先要大致了解这个事物的概念和作用,然后在学习中,从原理层面去具体分析其概念和作用。
类加载的概念是什么呢?先看下图,这一张图给出了两个层面上的类加载概念:
利用这张图片举个例子,我们先实例化一个Car对象car:
Car car = new Car();
首先,JVM利用Class Loader(类加载器)加载Car.class文件,从而得到Car类的Class对象,最后才能把Class实例化(new)为car。
上述的内容还是不够深入,我们再深入思考一下:
字节码与. ...
Java反序列化基础篇-04-JDK动态代理
0x00 前言时不我待,只争朝夕。
参考教程:
Java动态代理详细讲解-使用方式及应用场景_动态代理常用的地方-CSDN博客
JDK动态代理
0x01 概述要学习Java的动态代理,就要先了解两个概念:静态/动态、代理。
在 Java 中,编译期间即可确定的功能被称为静态功能,例如静态代理;而在程序运行时才动态确定的功能被称为动态功能,例如动态代理。
给出一个有趣的例子:
通俗来说,就是我想点份外卖,但是手机没电了,于是我让同学用他手机帮我点外卖。在这个过程中,其实就是我同学(代理对象)帮我(被代理的对象)代理了点外卖(被代理的行为),在这个过程中,同学可以完全控制点外卖的店铺、使用的APP,甚至把外卖直接吃了都行(对行为的完全控制)。
我们可以总结出代理的四个要素:
代理对象
被代理的对象
被代理的行为
对行为的完全控制
一言以蔽之:被代理的对象的被代理的行为会被代理对象执行,代理对象完全控制被代理的行为。
我们要实现代理功能,实际上就是实现上述的四个要素。
先实现静态代理
0x02 静态代理假设有一个需求:当执行一个方法excute时,需要记录该方法的执行时间, ...