fastjson反序列化漏洞_Fastjson反序列化漏洞的检测和利用

Fastjson是Alibaba开发的,Java语言编写的高性能Json库,号称Java语言中最快的Json库。针对Fastjson反序列化漏洞原理分析和Poc网上以及有很多,本文仅分享如何快速发现Fastjson反序列化漏洞,方便安全测试人员开展安全测试及修补漏洞。

文章中涉及到的工具和源码仅供安全测试和学习使用,否则后果自负,与作者无关。

0x01 反序列化原理

Fastjson反序列化,即在代码中调用JSON.parse(jsonstr)、JSON.parseObject(jsonstr)等方法的时候,实现将json格式的字符转换为一个Java对象的过程。在进行反序列化的时候会根据json中的字段自动调用对象的set和get方法,当方法中存在可利用点的时候就会造成安全漏洞。具体分析原理分析网上已经很多了,这里不做太多阐述。

0x02 Poc分析

在大多数应用场景中,Fastjson仅仅作为第三方依赖嵌入到项目中,这种形式导致了Poc无法控制Web容器的Response对象(当然针对特定容器可以,使用TemplatesImpl加载字节码,这个poc比较老了,基本都补了)实现命令执行结果回显输出。目前网上公开的Poc基本都是利用JNDI注入,使用JNDI注入实现代码执行的Poc都有一个弱点,就是需要目标服务器能够出互联网。

0x03 漏洞检测

对于需要出网才能利用的漏洞检测,最简便的方法就是使用Dnslog,通过域名的dns解析日志判断漏洞是否存在。数据传输流程如下图,其中第二步就要求服务器能出网才能实现漏洞检测。

c52e0c439e32399fa645d564af623624.png

0x04 漏洞利用

关于漏洞利用,对于JNDI注入这种Poc,会使用到RmiServer或者LdapServer,常规的利用方式就是向服务器发送Payload,反弹一个shell到攻击机上,反弹shell与操作系统相关,所以发送的payload是不一样的。然而目标服务器能出网,我们可以通过Socket这种方式将java代码在目标服务器执行操作系统命令结果返回回来。这种利用方式要求目标服务器能够访问到攻击机上启动的相关服务,具体数据流如下:

835a1549fead21c5cff15e04e5754d70.png

1.1.发送Payload让目标访问攻击机的Ldap服务1.2.访问Ldap服务2.1.Ldap服务要求目标服务器访问HTTP服务获取需要执行的代码2.2.访问HTTP服务3.1.发送需要执行的java代码到目标服务器3.2.执行代码,启动socket客户端连接socket服务器3.3.发送要执行的命令到目标服务器3.4.发送命令执行结果到攻击机

综合利用

Fastjson的利用工具和Poc Github上有很多了,这里用了个工具来改造

一个是FastjsonExploit 地址:https://github.com/c0ny1/FastjsonExploit,这个工具集成了公开的Poc,另外使用到一个Jndi注入利用工具JNDI-Injection-Exploit 地址:https://github.com/welk1n/JNDI-Injection-Exploit,整合这两个工具,使用JNDI-Injection-Exploit中的Ldap服务(在Jndi注入中Ldap比Rmi的条件限制少)和FastjsonExploit中的Poc。

通过Dnslog检查漏洞是否存在

82fa0bf15ec585b7965212210426eb31.png

漏洞利用,通过在目标服务器上加载类反弹一个shell回来,这里的shell是java写的仿shell,就是在服务器上执行命令,然后通过socket回传命令结果,所以与操作系统无关,输入exit退出shell。

345e0804979973345243c8ab71c6be43.png

工具参数

cfe8bb5d780e7d4c0e54354fccffe3d9.png

这里记录几个注意的点:

  1. 在使用TemplatesImpl相关Poc中加载的字节码需要继承AbstractTranslet类

  2. Socket进行数据传输的过程中,不会自动判断数据传输是否结束,需要在发送数据前先发送数据的长度,方便判断需要读取多少字节的数据

  3. 发送的Paylaod以Post方式提交,存在两种可能,一个是Post body都是Json字符串,一个是Post的某个参数是Json字符串

  4. 攻击机和目标服务器之间需要互访,也就意味着攻击机器最好在互联网上,对于攻击机Vps是私有地址,需要映射对应服务的端口到公有地址上

代码已经放到github,地址:

https://github.com/21superman/fastjson_exploit

参考文献:

https://paper.seebug.org/994/

https://paper.seebug.org/1192/#fastjson_2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值