原生反序列化利用链JDK7u21
原生反序列化利用链JDK7u21这篇继续跟着P牛的Java安全漫谈来学习 JDK7u21这条反序列化利用链不依赖于第三方库,适用于Java7u21之前的版本。 JDK7u21安装 JDK7u21核心原理某条反序列化利用链的核心点在于触发“动态方法执行”的地方,而不是TemplatasImpl或者某个类的readObject方法 举个栗子: CommonsCollectiosn系列反序列化核心店是那一堆Transformer,特别是期中的InvokerTransformer、InstantiateTransformer CommonsBeanutils反序列化的核心点是PropertyUtils#getProperty,因为这个方法会触发任意对象的getter 而JDK7u21的核心点就是sun.reflect.annotation.AnnotationInvocationHandler,之前在反序列化(2)和反序列化(3)这两篇中有介绍过但那时只用到了这个类会触发Map#get和Map#put的特点 我们下面可以看到AnnotationInvocationHandler类中的equ ...
CommonsBeanutils与无Commons-Collections的Shiro反序列化利用
CommonsBeanutils与无Commons-Collections的Shiro反序列化利用这一篇依旧是跟着P牛的Java安全漫谈学习 上一篇讲到java.util.PriorityQieie,它在java中是一个优先队列,队列中每一个元素有自己的优先级。在反序列化这个对象时,为了保证队列顺序,会进行重排序的操作,排序就会涉及到大小比较,从而执行java.util.Comparator接口的compare方法 那么我们再找找有没有其他可以利用的java.util.Comparator对象 Apache CommonsBeanutilsApache Commons Beanutils提供了对普通java类对象(也称为javabean)的一些操作方法 比如下面这个Cat类就是一个最简单的JavaBean类: 123456789final public class Cat { private String name = "catalina"; public String getName() { return name; } publi ...
Commons-Collections4与漏洞修复
Commons-Collections4与漏洞修复今天继续来学P牛的Java安全漫谈的第16篇 在2015年底Commons-Collections反序列化被提出时,Apache Commons Collections有下面两个版本: commons-collections:commons-collections org.apache.commons:commons-collections4 groupId和artifactId都变了。前者是Commons Collections的老版本包,当前版本号是3.2.1;后者是官方在2013年推出的版本,当时版本号为4.0。 因为官方认为旧的commons-collections有一些架构和API设计上的问题,但为了修复这些问题,会产生大量不能向前兼容的改动。所以commocns-collections4并不认为是一个用来替换commons-collections的新版本,而是一个新的包,两者的命名空间并不冲突,可以共存于同一个项目中。 那么既然在3.2.1中存在反序列化,在4.0中是否也存在呢? Commons-Collections4 ...
TemplatesImpl在Shiro中的利用
TemplatesImpl在Shiro中的利用通过TemplatesImpl构造的利用链,理论上可以执行任意Java代码,它不受到对于链的限制,特别是内存马逐渐流行之后,执行任意Java代码的需求就更加浓烈。 这篇继续跟着p牛,以Shiro反序列化漏洞为例实际使用一下TemplatesImpl。 使用CC6攻击Shiro先来说一下Shiro反序列化原理:为了让浏览器或服务器重启后不丢失登录状态,Shiro支持持久化信息序列化并加密后保存在Cookie、的rememberMe字段中,下次读取时进行解密再反序列化。但是在Shiro 1.2.4版本之前内置了一个默认且固定的加密Key,导致攻击者可以为在任意的rememberMe Cookie,进而触发反序列化漏洞。 这里我们直接用P牛的这个登录应用,可以在IDEA上右键运行 输入正确的账号密码,root/secret,成功登陆: 如果登录时选择了remember me的多选框,那么登录成功后服务端会返回一个rememberMe的Cookie: 诶🤓👆接下来就是攻击时间: 用前面学的CC链生成一个序列化Payload 用Shiro ...
刷题记录(1)-[网鼎杯 2018]Fakebook
刷题记录(1)-[网鼎杯 2018]Fakebook刷题遇到一个感觉还挺有意思的一道 进去之后先是一个Fakebook的页面,一个登陆一个加东西,先扫一下目录看看有没有什么能用的 不知道为什么拿dirsearch扫全是429状态,然后试了下robots.txt发现有一个/user.php.bak 那么把这个.bak文件先搞下来 1234567891011121314151617181920212223242526272829303132333435363738394041424344<?phpclass UserInfo{ public $name = ""; public $age = 0; public $blog = ""; public function __construct($name, $age, $blog) { $this->name = $name; $this->age = (int)$age; $this-> ...
CC3_POC(JAVA7与JAVA8通杀版)
CC3 POC修改在前面的这篇Java反序列化(4)中有讲过解决高版本利用问题过程差不多 先把这条链来理清楚,这里可以看看白日梦组长的视频 1newTransformer() --> getTransletInstance() --> defineTransletClasses() --> defineClass() --> newInstance() CC1是命令调用,CC3是动态类加载。 具体做法就跟Java反序列化(4)中讲的一样,把TransformerMap改成LazyMap 完整的POC: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980package org.example;import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesIm ...
CC3
CommonsCollections3这篇继续来跟着P牛的《Java安全漫谈》学习,前面有讲Java中加载字节码的一些方法,就介绍了TemplatesImpl。TemplatesImpl是一个可以加载字节码的类,通过调用其newTransformer()方法,就可以执行这段字节码的类构造器。那么,我们是否可以在反序列化漏洞中,利用这个特性来执行任意代码 利用newTransformer执行任意代码-先来想一下CommonsCollections1,前面在Java反序列化(2)这篇文章中有给出一个简单的demo,可以利用TransformedMap来执行任意Java方法 1234567891011121314151617181920package org.example;import org.apache.commons.collections.Transformer;import org.apache.commons.collections.functors.ChainedTransformer;import org.apache.commons.collections.functor ...
Java动态加载字节码
Java动态加载字节码这次是Java字节码学习,依旧是跟着P牛 Java字节码是什么Java字节码是在Java虚拟机执行时用的一类指令,这是一种中间代码,是Java源代码经过编译后生成的一种二进制文件,使得Java具有跨平台的特性 在P牛写的这篇动态加载字节码中,所有能够恢复成一个类并在JVM虚拟机里加载的字节序列,都在探讨范围内。 我前面有一篇讲过这个ClassLoader,在很多场景中,我们可以有控制一些能够加载字节码函数的能力,那么可以通过加载远程的恶意类,来完成RCE。 如何加载类URLClassLoaderJava的ClassLoader是用来加载字节码文件最基础的方法,它就是一个加载器,来告诉Java虚拟机如何加载这个类。Java默认的ClassLoader就是根据类名来加载类,这个类名是类完整路径,比如java.lang.Runtime 就先来说一下这个URLClassLoader URLClassLoader实际上就是我们平时默认使用的AppClassLoader的父类,所以,解释URLClassLoader的工作过程实际上就是在解释默认的Java类加载器的工作流程。 ...
Java反序列化(4)
Java反序列化(4)CC6前面几篇详细分析了CommonsCuollections1这个利用链和其中的LazyMap原理。但是我们说到,在Java 8u71之后,这个利用链不能再利用了,主要原因是sun.reflect.annotation.AnnotationInvocationHandler#readObject的逻辑变化了。 在ysoserial中,CommonsCollections可以说是commons-collections这个库中相对比较通用的利用链,为了解决高版本Java的利用问题,我们先来看看这个利用链。 先看看简化版利用链: 12345678910111213141516/*Gadget chain: java.io.ObjectInputStream.readObject() java.util.HashMap.readObject() java.util.HashMap.hash() org.apache.commons.collections.keyvalue.TiedMapEntry.hashCode() org.apache.commons.col ...
Java反序列化(3)
JAVA发序列化(3)这是Java反序列化学习的第三篇文章 这回来讲一下最纯正的CC1链,因为CC1链中利用的是LazyMap而不是TransformedMap。那么LazyMap又是什么 LazyMapLazyMap和TransformedMap类似,都来自Common-Collections库,并继承AbstractMapDecorator。 LazyMap的漏洞触发线和TransformedMap唯一的差别是,TransformedMap是在写入元素的时候执行teansform,而Lazymap是在其get方法中执行的factory.transform。因为LazyMap的作用是懒加载,在get找不到值的时候,会调用factory.transform方法去获取一个值: 123456789public Objecy get(Object key){ // create value for key if key is not currentls in the map if (map.containsKey(key) == false) { Object valu ...