当前位置:   article > 正文

Fastjson反序列化漏洞自动化检测-安全优化

fastjson反序列化远程代码执行漏洞检测工具

fastjson 是 java 中常用的一个用来序列化反序列化 JSON 数据的库。因其优异的性能表现,在 java web 开放中应用比较广泛。最近需要写一个 fastjson 的检测插件,稍微研究了一下后,感觉有一个比较不错的检测方法,在这里和大家分享下。

在文章开始之前我想说明一点这里介绍的是检测方法而不是利用方法。这是两个不同的目标实现这两个目标需要考虑的细节也是不同的。在做漏洞检测时尤其是自动化检测时关注的往往有以下几点:

  • 利用入口点是什么
  • 如何确认漏洞存在
  • 如何高效检测
  • 如何无损检测

围绕着这几点我这个从未接触 java 安全的弟弟打开了 idea ,开始了 fastjson 反序列化 debug 之路。

漏洞成因

我刚接触的时候,感觉很多文章都在说@type,但@type是什么,为什么需要@type大家好像都没有提及,而且既然@type这么多问题,官方为何不去掉这个用法。带着这些疑问,我写了一个简单的 case,在 1.2.24 版本运行一下:

  1. public class User {
  2. private String name;
  3. public User() {
  4. System.out.println("User()");
  5. }
  6. public String getName() {
  7. System.out.println("getName");
  8. return name;
  9. }
  10. public void setName(String name) {
  11. System.out.println("setName");
  12. this.name = name;
  13. }
  14. }
  15. class Testfastjson {
  16. public static void main(String[] args) {
  17. String x = "{"name": "test"}";
  18. Object xx = JSON.parseObject(x);
  19. System.out.println(xx);
  20. System.out.println();
  21. String y = "{"@type":"com.koalr.fastjson.User","name": "test"}";
  22. User yy = (User) JSON.parse(y);
  23. System.out.println(yy);
  24. System.out.println();
  25. String z = "{"name": "test"}";
  26. User zz = (User) JSON.parseObject(z, User.class);
  27. System.out.println(zz);
  28. }
  29. }

结果为:

  1. {"name":"test"}
  2. User()
  3. setName
  4. com.koalr.fastjson.User@18769467
  5. User()
  6. setName
  7. com.koalr.fastjson.User@46ee7fe8

仔细观察这个这个 case,它主要说明了两点:一是如果没有指定类型,得到的是 fastjson 的内置类型 JSONObject,这个模式下没有类型信息,使用起来和 python dict 比较像;二是如果用某种方式制

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号