Java 反序列化漏洞原理(三)fastjson 1.2.24 Templateslmpl 利用原理

声明 本文章中所有内容仅供学习交流,严禁用于非法用途,否则由此产生的一切后果均与作者无关。 Fastjson 是什么 fastjson是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean。 fastjson相对其他JSON库的特点是快。fastjson在阿里巴巴大规模使用,在数万台服务器上部署,fastjson在业界被广泛接受。在2012年被开源中国评选为最受欢迎的国产开源软件之一。 以上摘自Fastjson GitHub 介绍。 但近年来随着 Fastjson 不断爆出漏洞,各大中小型公司都逐渐弃用 Fastjson ,甚至阿里自己开源的服务注册、配置管理平台 NACOS 在 1.3.0 版本之后都从 Fastjson 替换为了 Jackson (详见 https://github.com/alibaba/nacos/releases/tag/1.3.0) ,可见漏洞危害之大。 为什么会弃用 Fastjson ? 想要研究一个产品的漏洞其中有一条很好的途径就是去查询 CVE 编号,但是我在检索之后发现 Fastjson 只有 CVE-2017-18349 这一条,而 Jackson 竟然有高达 76 条。 这能否证明 Fastjson 比 Jackson 更安全呢?答案并不是,都是半斤八两,有些 Fastjson 里面出现的漏洞在 Jackson 里面也同样存在。 那为什么会有公司弃用 Fastjson 呢? 或许是 Jackson 有更完善且公开的漏洞管理机制,或许是国外的月亮比较圆,或许是随大流,也或许是 Fastjson 代码质量不过关(知乎上有很多回答批判 Fastjson 代码糟糕的),真实原因就不得而知了。 尽管近年来有公司不断弃用 Fastjson ,但还有很多公司在使用,并且已经开发上线的系统想要替换或者升级 Fastjson 还需要时间,因此我们很有必要学习一下 Fastjson 漏洞的产因。 Fastjson 漏洞产生原因 Fastjson 第一次被爆出有漏洞是官方在2017年3月15日主动披露的,详见 https://github....

十月 21, 2021 · 5 分钟 · dushixiang

Java 反序列化漏洞原理(二)新版本JDK利用方式和Shiro举例

声明 本文章中所有内容仅供学习交流,严禁用于非法用途,否则由此产生的一切后果均与作者无关。 新的希望 0x00 在上一节中我们介绍了 Java 反序列化漏洞的成因和利用 commons-collections 3.1 搭配 sun.reflect.annotation.AnnotationInvocationHandler 实现远程命令执行的方式。但sun.reflect.annotation.AnnotationInvocationHandler 的问题已经在最新版 jdk 中修复,可利用范围仅能够局限于旧版本的jdk。经过安全人员的审计,另一个类 javax.management.BadAttributeValueExpException 出现在了安全人员的视野。 javax.management.BadAttributeValueExpException 继承自 java.lang.Exception,java.lang.Exception 继承自 java.lang.Throwable,而 java.lang.Throwable 实现了 java.io.Serializable。因此 javax.management.BadAttributeValueExpException 符合了 可序列化 这个要求,同样的它也增加了 readObject 方法,这个类的完整代码如下: package javax.management; import java.io.IOException; import java.io.ObjectInputStream; /** * Thrown when an invalid MBean attribute is passed to a query * constructing method. This exception is used internally by JMX * during the evaluation of a query. User code does not usually * see it....

十月 16, 2021 · 7 分钟 · dushixiang

Java 反序列化漏洞原理(一)Serializable

声明 本文章中所有内容仅供学习交流,严禁用于非法用途,否则由此产生的一切后果均与作者无关。 序列化的定义 序列化是指将数据结构或对象状态转换成可取用格式,以留待后续在相同或另一台计算机环境中,能恢复原先状态的过程。依照序列化格式重新获取字节的结果时,可以利用它来产生与原始对象相同语义的副本。 Java 中的序列化 Java 自身提供了序列化的功能,需要实现 java.io.Serializable 接口,标明该对象是可序列化的。 java.io.Serializable 是一个空接口,不需要对象实现方法。 以下面这段代码为例,展示了一个对象的序列化和反序列化的过程。 import java.io.*; import java.nio.charset.StandardCharsets; import java.util.Base64; public class Eval0 { public static class Command implements Serializable { private String cmd; public String getCmd() { return cmd; } public void setCmd(String cmd) { this.cmd = cmd; } } public static void main(String[] args) throws Exception { // 定义一个对象 Command command = new Command(); command....

十月 14, 2021 · 7 分钟 · dushixiang

分享一款非常好用的kafka可视化web管理工具

使用过kafka的小伙伴应该都知道kafka本身是没有管理界面的,所有操作都需要手动执行命令来完成。但有些命令又多又长,如果没有做笔记,别说是新手,就连老手也不一定能记得住,每次想要使用的时候都要上网搜索一下。有些崇尚geek精神的人或许觉得命令行才是真爱,但使用一款好用的可视化管理工具真的可以极大的提升效率。 今天给大家介绍的这款工具叫做kafka-map,是我针对日常工作中高频使用的场景开发的,使用了这款工具之后就不必费心费力的去查资料某个命令要怎么写,就像是:“给编程插上翅膀,给kafka装上导航”。 kafka-map 介绍 kafka map是使用Java11和React开发的一款kafka可视化工具。 目前支持的功能有: 多集群管理 集群状态监控(分区数量、副本数量、存储大小、offset) 主题创建、删除、扩容(删除需配置delete.topic.enable = true) broker状态监控 消费者组查看、删除 重置offset 消息查询(支持String和json方式展示) 发送消息(支持向指定的topic和partition发送字符串消息) 功能截图 添加集群 集群管理 broker 主题管理 消费组 查看消费组已订阅主题 topic详情——分区 topic详情——broker topic详情——消费组 topic详情——消费组重置offset topic详情——配置信息 生产消息 消费消息 docker 方式安装 一行命令即可完成安装 docker run -d \ -p 8080:8080 \ -v /opt/kafka-map/data:/usr/local/kafka-map/data \ -e DEFAULT_USERNAME=admin -e DEFAULT_PASSWORD=admin --name kafka-map \ --restart always dushixiang/kafka-map:latest 更多安装方式以及相信信息可查看: https://github.com/dushixiang/kafka-map 欢迎star和分享给其他小伙伴。

六月 13, 2021 · 1 分钟 · dushixiang

openstack victoria版安装

近期公司业务需求,需要安装一套Openstack环境学习,看了一下现在已经出了wallaby版了,我果断选择了上一个版本victoria。因为没有足够多的物理服务器了,只好找了一台64核256G内存6T硬盘的机器来创建几台虚拟机来搭环境了。 实验环境 此次实验使用到了三台虚拟机,都是使用centos8系统,一台机器当作控制和网络节点,另外两台当作计算节点,使用OVS+VLAN的网络模式,eth0作为管理网络,eth1互相连接到OVS网桥上模拟trunk网卡,controller多增加一个eth2用于访问外部网络。 节点 作用 eth0 eth1 eth2 controller 控制节点、网络节点 172.16.10.100 无IP 桥接,无IP compute-101 计算节点 172.16.10.101 无IP ❌ compute-102 计算节点 172.16.10.102 无IP ❌ 安装虚拟机 安装依赖 安装KVM和Linux网桥 yum install -y qemu-kvm libvirt virt-install bridge-utils virt-manager dejavu-lgc-sans-fonts dejavu-lgc-sans-fonts用于解决 virt-manaer 乱码 启动 systemctl enable libvirtd && systemctl start libvirtd 安装OVS yum install openvswitch 启动OVS systemctl enable openvswitch && systemctl start openvswitch 创建虚拟机 使用 virt-manager 创建三台虚拟机...

六月 12, 2021 · 10 分钟 · dushixiang