声明 本文章中所有内容仅供学习交流,严禁用于非法用途,否则由此产生的一切后果均与作者无关。
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.com/alibaba/fastjson/wiki/security_update_20170315 。漏洞影响 1....
声明 本文章中所有内容仅供学习交流,严禁用于非法用途,否则由此产生的一切后果均与作者无关。
新的希望 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....
声明 本文章中所有内容仅供学习交流,严禁用于非法用途,否则由此产生的一切后果均与作者无关。
序列化的定义 序列化是指将数据结构或对象状态转换成可取用格式,以留待后续在相同或另一台计算机环境中,能恢复原先状态的过程。依照序列化格式重新获取字节的结果时,可以利用它来产生与原始对象相同语义的副本。
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.setCmd("calc"); System.out.println("序列化前: " + command.getCmd()); // 将用户序列化为字节数组 ByteArrayOutputStream buffer = new ByteArrayOutputStream(); try (ObjectOutputStream outputStream = new ObjectOutputStream(buffer)) { outputStream....
Java是一种广泛使用的计算机编程语言、面向对象、泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发。
1995年3月23日Sun公司发布了Java,至今已有近26年,可以说是一门十分成熟的开发语言了,但在某些不为人知的地方存在着一些意料之外的特性。
Java的保留关键字 goto和const 在Java里面没有goto这个功能,但它作为保留字是无法当做变量来使用的,const也是同样。
int goto = 0; int const = 0; 上面这两行代码的写法存在问题,无法正常编译通过。
Java标签Label 上面说了在Java里面没有goto这个功能,但为了处理多重循环引入了Label,目的是为了在多重循环中方便的使用 break 和coutinue ,但好像在其他地方也可以用。
outerLoop: while (true) { System.out.println("I'm the outer loop"); int i = 0; while (true) { System.out.println("I am the inner loop"); i++; if (i >= 3) { break outerLoop; } } } System.out.println("Complete the loop"); // 输出 I'm the outer loop I am the inner loop I am the inner loop I am the inner loop Complete the loop test: { System....