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

java17及以上版本如何抵御TemplatesImpl注入

最近有一篇写的很好的关于java17反序列化绕过模块化的文章:https://mp.weixin.qq.com/s/DrUUAJaLig_RtXZWaAm1IQ

关于本篇的方式方法也比较传统,直接jep290在java运行时增加命令行参数:

-Djdk.serialFilter=!com.sun.org.apache.xalan.internal.xsltc.**

有没有办法在反射时也能限制对TemplatesImpl的反射呢?可以使用如下java代码

import jdk.internal.reflect.Reflection;

import之后在反射形成反序列化链之前限制对TemplatesImpl的反射,如下

Reflection.registerMethodsToFilter(TemplatesImpl.class, Set.of("*"));
Reflection.registerFieldsToFilter(TemplatesImpl.class, Set.of("*"));

 增加完之后发现系统提示:

Exception in thread "main" java.lang.IllegalAccessError: class SerializeJDK8 (in unnamed module @0x6d311334) cannot access class jdk.internal.reflect.Reflection (in module java.base) because module java.base does not export jdk.internal.reflect to unnamed module @0x6d311334at SerializeJDK8.main(SerializeJDK8.java:20)

所以我们要在java进程执行时增加vm参数:

--add-opens=java.base/jdk.internal.reflect=ALL-UNNAMED

其中我们要看一下Reflection的源代码:

static {fieldFilterMap = Map.of(Reflection.class, ALL_MEMBERS,AccessibleObject.class, ALL_MEMBERS,Class.class, Set.of("classLoader", "classData", "modifiers", "protectionDomain", "primitive"),ClassLoader.class, ALL_MEMBERS,Constructor.class, ALL_MEMBERS,Field.class, ALL_MEMBERS,Method.class, ALL_MEMBERS,Module.class, ALL_MEMBERS);methodFilterMap = Map.of();
}

Reflection的所有字段被限制反射了,但是方法却没有,所以还可以把上述代码增加一下改成:

Reflection.registerMethodsToFilter(TemplatesImpl.class, Set.of("*"));
Reflection.registerFieldsToFilter(TemplatesImpl.class, Set.of("*"));
Reflection.registerMethodsToFilter(Reflection.class, Set.of("*"));

防止对Reflection的方法进行随意反射减少未知绕过的可能性

上述代码在java8中略有不同,代码如下:

Reflection.registerMethodsToFilter(TemplatesImpl.class, Set.of("readObject","writeObject"));
Reflection.registerFieldsToFilter(TemplatesImpl.class, Set.of("_bytecodes"));
Reflection.registerMethodsToFilter(Reflection.class, Set.of("*"));

 

总结:

1)反序列化时对流进行反序列校验增加未知漏洞的防护

2)反射限制可以增加对未知的反射导致0day的防护能力

3)参照:https://alibaba.github.io/fastjson2/autotype_cn.html  对输入的校验使用白名单是目前已知最好的编码方式

http://www.jsqmd.com/news/6789/

相关文章:

  • 详细介绍:【C++实战(53)】C++11线程库:开启多线程编程新世界
  • 将图片某个区域批量填充白色(jsx代码)
  • 详细介绍:四数之和_优选算法(C++)双指针法总结
  • 《初等数论(第四版,北京大学出版社,潘承洞,潘承彪著)》阅读笔记+心得
  • 完整教程:Ansible Playbook
  • 完整教程:Word和WPS文字中的自动编号和文字间距过大怎么办?
  • NOIP2025模拟赛28
  • markdown笔记文件批量打上时间戳
  • 微服务调整中心高可用设计:从踩坑到落地的实战指南(二)
  • 十月数据结构题没做
  • NOIP2025模拟赛30
  • 图文讲解k8s中Service、Selector、EndpointSlice的运行原理 - 详解
  • 2025西安品牌新房,西安刚需新房,陕西优质新房住宅推荐,地建嘉信臻境,超2000㎡高端会所,满足多元化生活需求
  • 2025年未央区高端楼盘,西咸新区品质楼盘,西安高新品牌楼盘住宅口碑推荐,地建嘉信臻境周边配套丰富,教育医疗商业齐全
  • copyparty.exe 怎么用?局域网文件共享工具安装与运行教程
  • 2025西安高端新房,西安优质新房,西安品牌新房住宅推荐,地建嘉信臻境,沣东文商板块门户,享双地铁便利
  • 2025年西安洋房楼盘,陕西优质楼盘,西咸新区现房楼盘住宅口碑推荐,地建嘉信臻境超2000㎡高端会所,功能多样
  • Python 闭包的应用场景与实战案例
  • STM32 智能垃圾桶项目笔记(二):超声波测距功能实现 - 指南
  • 通过配置 GitLab 自动触发项目自动化构建与部署 - 指南
  • 双网卡服务器校园网访问故障排查与解决​ - 教程
  • US$9 TF Card 4GB Flash Memory Card Can Work on Ksuite
  • 详细介绍:MySQL备份策略核心知识点总结
  • input() 函数
  • 近期
  • Playwright MCP 的使用与调试技巧
  • 详细介绍:手把手教你用 ESP32 接入 OneNet 平台(MQTT 方式)
  • 完整教程:Python学习历程——组织结构(包含for、if、while等等)
  • Nginx 反向代理、负载均衡与 Keepalived 高可用 - 实践
  • 文件上传攻击全面指南:从侦察到防御