php 使用fastjson,Fastjson caucho-quercus远程代码执行漏洞

Fastjson 组件介绍

Fastjson 是一个 Java 语言编写的高性能功能完善的 JSON 库。它采用一种 " 假定有序快速匹配 " 的算法,把 JSON Parse 的性能提升到极致,是目前 Java 语言中最快的 JSON 库。Fastjson 接口简单易用,已经被广泛使用在缓存序列化、协议交互、Web 输出、Android 客户端等多种应用场景。

漏洞描述

Fastjson 远程代码执行漏洞是由于使用 com.caucho.config.types.ResourceRef 类,绕过了 Fastjson1.2.66 及以前版本的黑名单而导致。当服务端加载了存在受漏洞影响的 resin 依赖,并且开启了 Fastjson 的 autotype 时,远程攻击者可以通过构造的攻击代码触发远程代码执行漏洞,最终可以获取到服务器的控制权限。

漏洞分析

以 Fastjson1.2.66 + resin-4.0.63.jar 作为漏洞环境分析。传入构造好的 payload,经过 JSON 类中的 parse 方法的解析入口。

article.php?pk=5e783b938e9f096b782f252b

在 DefaultJSONParser 类中进行格式解析,利用特殊符号作为标志符进行数据提取。

article.php?pk=5e783b938e9f096b782f252b

当获取到 @type 传入的类名后,会通过 checkAutoType 方法检查 @type 传入的类是否在黑名单中。

article.php?pk=5e783b938e9f096b782f252b

传入的类会经过 hash 转换,生成 hash 值

article.php?pk=5e783b938e9f096b782f252b

生成的 hash 值会与 Fastjson 设置的黑名单中的 hash 进行对比,如果匹配成功,直接抛出异常退出程序。

article.php?pk=5e783b938e9f096b782f252b

通过 checkAutoType 检查之后,会在 getClassLoader ( ) 方法中获取本地类库资源,并从中加载目标类所在的类库。

article.php?pk=5e783b938e9f096b782f252b

继续跟进代码,通过调用 TypeUtils.loadClass ( ) 方法为 clazz 赋值,最终返回 clazz。

article.php?pk=5e783b938e9f096b782f252b

进入 map.put ( ) 方法,经过反序列化获取传入的类中属性和方法,通过 JavaBean,直接为属性赋值。

article.php?pk=5e783b938e9f096b782f252b

article.php?pk=5e783b938e9f096b782f252b

最终在 getValue ( ) 方法中调用 Jndi.lookup ( ) 方法,在 lookup ( ) 方法中会实例化 InitialContext,并调用 lookup ( ) 方法进行寻址,加载传入的链接上的恶意文件,在服务器上执行文件中的命令。

article.php?pk=5e783b938e9f096b782f252b

article.php?pk=5e783b938e9f096b782f252b

至此漏洞利用过程基本完成。

漏洞复现

搭建 Fastjson1.2.66 + resin-4.0.63.jar 漏洞环境,传入精心构造的 json 数据,让目标服务器加载远程主机上的恶意文件,从而在目标主机上执行任意代码。效果如图:

article.php?pk=5e783b938e9f096b782f252b

影响范围

Fastjson 版本:

Fastjson < 1.2.6

修复建议

1.   Alibaba 发布的最新版本 Fastjson1.2.67 已经防御此漏洞,请受漏洞影响的用户下载最新版本,下载链接:https://github.com/alibaba/fastjson

2.   Fastjson 默认关闭 autotype,如果项目中不需要该功能,可以删除以下代码:

ParserConfig.getGlobalInstance ( ) .setAutoTypeSupport ( true ) ;

时间轴

2020/3/18   Fastxml Jackson-databind 发布的补丁中新增一个黑名单类。

2020/3/21   深信服千里目安全实验室成功复现漏洞并发布漏洞分析文章。

参考链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值