本篇文章对Fastjson漏洞利用的过程做个简单的记录。
背景:
Fastjson是Alibaba开发的,java语言编写的高性能JSON库,采用“假定有序快速匹配”的算法,号称Java语言中最快的JSON库。
其项目地址为https://github.com/alibaba/fastjson,其提供两个主要接口toJsonString和parseObject来分别实现序列化和反序列化。示例代码:
//序列化
User user = new User("guest",2);
String jsonString = JSON.toJSONString(user)
//反序列化
String jsonString = "{\\"name\\":\\"guest\\",\\"age\\":12}"
User user = (User)JSON.parse(jsonString)
其最近几年爆出的漏洞影响都比较大,下面会进行简单的说明。
20170315第一次爆出的漏洞
2017年3月15日,Alibaba官方发布了一条安全更新:https://github.com/alibaba/fastjson/wiki/security_update_20170315。宣布fastjson<=1.2.24存在远程代码执行高危安全漏洞。
利用原理:
因为fastjson在处理以@type形式传入的类的时候,会默认调用该类的共有setgetis函数,因此我们在寻找利用类的时候思路如下:
1、类的成员变量我们可以控制;
2、想办法在调用类的某个setgetis函数的时候造成命令执行。
于是便找到了JdbcRowSetImpl类,该类在setAutoCommit函数中会对成员变量dataSourceName进行lookup,标准的jndi注入利用。(jndi注入是什么可以看下https://paper.seebug.org/417/)
其利用栈:
Exec:620,Runtime //命令执行
Lookup:417,InitalContext /jndi lookup函数通过rmi或者ldap获取恶意类
setAutoCommit:4067,JdbcRowSetImpl 通过setAutoCommit从而在后面触发了lookup函数
setValue:96,FieldDeserializer //反射调用传入类的set函数
deserialze:600, JavaBeanDeserializer 通过循环调用传入类的共有set,get,is函数
parseObject:368,DefaultJSONParser 解析传入的json字符串
原理大概就那么多,接下来搭建环境复现一下,采用doc