1.漏洞信息
1.1 漏洞简介
· 漏洞名称:Fastjson 1.2.24远程代码执行漏洞(com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl)
· 漏洞编号:无
· 漏洞类型:远程代码执行
· CVSS评分:无
· 漏洞危害等级:高危
1.2 组件概述
Fastjson是一个Java语言编写的高性能功能完善的JSON库。它采用一种“假定有序快速匹配”的算法,把JSON Parse的性能提升到极致,是目前Java语言中最快的JSON库。Fastjson接口简单易用,已经被广泛使用在缓存序列化、协议交互、Web输出、
Android客户端等多种应用场景。下图是Fastjson组件中的反序列化流程。
1.3 漏洞概述
漏洞是利用fastjson autotype在处理json对象的时候,未对@type字段进行完全的安全性验证,攻击者可以传入危险类,奇热服务器接收到危险类执行其中恶意代码。攻击者通过这种方式可以实现远程代码执行漏洞的利用,获取服务器的敏感信息泄露,甚至可以利用此漏洞进一步对服务器数据进行修改,增加,删除等操作,对服务器造成巨大的影响。
1.4 漏洞利用条件
· 无
1.5 漏洞影响
影响版本:
Fastjson < 1.2.25
1.6 漏洞修复
获取Fastjson最新版本,下载链接:https://github.com/alibaba/fastjson
2.漏洞复现
2.1 环境拓扑
2.2 应用协议
8080/HTTP
2.3 复现过程
基于Windows平台,使用环境目录下的fastjsondemo环境,拷贝后使用Idea打开fastjsondemo文件夹,下载maven资源,运行DemoApplication类,即可启动环境。效果如图。
运行sniper工具箱,填写表单信息,点击Attack,效果如图。
3.漏洞分析
3.1 技术背景
JavaBean:
JavaBean 是特殊的 Java 类,使用 Java 语言书写,并且遵守 JavaBean API 规范。JavaBean的特征:
· 提供一个默认的无参构造函数。
· 需要被序列化并且实现了 Serializable 接口。
· 可能有一系列可读写属性。
· 可能有一系列的 getter 或 setter 方法。
方法 | 描述 |
---|---|
getPropertyName() | 举例来说,如果属性的名称为 myName,那么这个方法的名字就要写成 getMyName() 来读取这个属性。这个方法也称为访问器。 |
setPropertyName() | 举例来说,如果属性的名称为 myName,那么这个方法的名字就要写成 setMyName()来写入这个属性。这个方法也称为写入器。 |
程序实例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
public class StudentsBean implements java.io.Serializable { private String firstName = null; private String lastName = null; private int age = 0;
public StudentsBean() { } public String getFirstName(){ return firstName; } public String getLastName(){ return lastName; } public int getAge(){ return age; }
public void setFirstName(String firstName){ this.firstName = firstName; } public void setLastName(String lastName){ this.lastName = lastName; } public void setAge(int age) { this.age = age; } } |
3.2 详细分析
3.2.1 代码分析
Fastjson通过parseObject方法解析传入的json数据。
调用DefaultJSONParser缺省方法对json格式数据进行解析