5000篇網安資料庫https://mp.weixin.qq.com/s?__biz=MzkwNjY1Mzc0Nw==&mid=2247486065&idx=2&sn=b30ade8200e842743339d428f414475e&chksm=c0e4732df793fa3bf39a6eab17cc0ed0fca5f0e4c979ce64bd112762def9ee7cf0112a7e76af&scene=21#wechat_redirect
1. 原理深度:Java反序列化漏洞的底層機制是什么?為什么反序列化可能導致RCE?
參考答案:
-
機制:Java反序列化通過
ObjectInputStream
將二進制數據還原為對象。若攻擊者控制輸入,可構造惡意對象,在反序列化時觸發危險操作(如動態代理、反射調用)。 - RCE成因:
-
Gadget鏈:利用類庫中多個可串聯的類(如
InvokerTransformer
、TemplatesImpl
),通過鏈式調用執行任意代碼。 -
動態加載:某些類(如
URLClassLoader
)允許加載遠程代碼,結合反序列化觸發類初始化邏輯。 -
反射調用:利用
Method.invoke()
或Runtime.exec()
等實現命令執行。
-
-
關鍵點:反序列化過程中未對輸入數據進行校驗,導致惡意類的
readObject()
或readExternal()
方法被觸發。
2. 框架漏洞:Apache Commons Collections如何被用于構造反序列化利用鏈?請描述具體類和方法的作用。
參考答案:
- 核心類:
-
InvokerTransformer
:通過反射調用任意方法,如Runtime.getRuntime().exec("cmd")
。 -
ChainedTransformer
:將多個Transformer
串聯,形成鏈式調用。 -
ConstantTransformer
:返回固定值,用于傳遞惡意對象。 -
TransformedMap
/LazyMap
:在Map操作時觸發Transformer鏈。
-
- 利用鏈構造:
-
構造
ChainedTransformer
鏈,串聯反射調用Runtime.exec()
。 -
通過
TransformedMap.decorate()
包裝Map,使Map的put()
或get()
操作觸發Transformer鏈。 -
利用
AnnotationInvocationHandler
的readObject()
反序列化入口,觸發Map操作。
-
- 示例Payload:
Transformer[]?transformers?=?new?Transformer[]{new?ConstantTransformer(Runtime.class),new?InvokerTransformer("getMethod",?new?Class[]{String.class,?Class[].class},?new?Object[]{"getRuntime",?null}),new?InvokerTransformer("invoke",?new?Class[]{Object.class,?Object[].class},?new?Object[]{null,?null}),new?InvokerTransformer("exec",?new?Class[]{String.class},?new?Object[]{"calc.exe"}) }; ChainedTransformer?chain?=?new?ChainedTransformer(transformers);
3. 防御機制:如何有效防御Java反序列化漏洞?對比黑名單與白名單方案的優缺點。
參考答案:
- 防御手段:
-
輸入驗證:禁止反序列化不可信數據。
-
白名單:使用
ValidatingObjectInputStream
(VOIS)僅允許反序列化安全類。 -
替換序列化機制:使用JSON(如Jackson)或Protocol Buffers替代Java原生序列化。
-
JEP 290:JDK9+的過濾器機制,通過模式匹配限制反序列化類。
-
安全加固:移除危險類庫(如Commons Collections 3.x升級至4+)。
-
- 黑名單 vs 白名單:
-
黑名單:攔截已知危險類(如
InvokerTransformer
),但易被繞過(新增Gadget或組合類)。 -
白名單:僅允許已知安全類,安全性更高,但維護成本較大(需覆蓋業務所有合法類)。
-
4. 框架案例:Fastjson反序列化漏洞的原理是什么?如何利用TemplatesImpl
類實現RCE?
參考答案:
-
漏洞原理:Fastjson的
autoType
功能允許反序列化時指定任意類。攻擊者可構造惡意JSON,觸發目標類的setter
/getter
或構造函數中的危險操作。 - TemplatesImpl利用:
-
構造惡意類:生成一個繼承
AbstractTranslet
的類,在靜態代碼塊或構造函數中插入惡意代碼。 -
Base64編碼:將類字節碼Base64編碼后嵌入JSON。
-
觸發加載:通過
@type
指定com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl
,并設置_bytecodes
和_outputProperties
字段,觸發類加載與初始化。
-
- Payload示例:
{"@type":?"com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl","_bytecodes":?["惡意類Base64編碼"],"_outputProperties":?{} }
5. 高級繞過:如何繞過反序列化黑名單機制?請舉例說明一種非傳統的Gadget鏈構造方法。
參考答案:
- 繞過手段:
-
利用冷門類庫:如使用
groovy.util.Expando
或org.apache.xbean
等非默認黑名單類構造鏈。 -
動態加載字節碼:通過
BCEL ClassLoader
或ClassLoader.defineClass()
加載遠程字節碼。 -
二次反序列化:利用
Serializable
對象內部嵌套另一個反序列化入口點。
-
- 示例:BCEL繞過:
String?className?=?"$$BCEL$$...";?//?BCEL格式的惡意類字節碼 ClassLoader?loader?=?new?ClassLoader()?{}; Class?clazz?=?loader.loadClass(className); clazz.newInstance();
-
反射+動態代理:通過
Proxy.newProxyInstance()
創建代理類,結合InvocationHandler
執行命令。