序列化與反序列化,簡單來說就是JAVA對象與字節之間的相互轉化。
實質上,序列化機制並不只局限於JAVA語言,序列化的本質是內存對象到數據流的一種轉換,我們知道內存中的東西不具備持久性,但有些場景卻需要將對象持久化保存或傳輸。
例如緩存系統中存儲了用戶的Session,如果緩存系統直接下線,待系統重啟後用戶就需要重新登陸,為了使緩存系統內存中的Session對象一直有效,就需要有一種機制將對象從內存中保存入磁碟,並且待系統重啟後還能將Session對象恢復到內存中,這個過程就是對象序列化與反序列化的過程。
今天i春秋通過一期《JAVA反序列化學習-基礎篇》公開課,帶大家快速了解預期效果、JAVA編程基礎、漏洞基礎、靶項目搭建四個模塊內容,感興趣的小夥伴速來學習吧!
感興趣的小夥伴,識別二維碼立即看課
PS:Web端看課體驗會更佳,看課地址:
https://www.ichunqiu.com/open/68626
暱稱:bigbig
1、國內大廠安全研究員;
2、職業紅隊;
3、擅長代碼審計、隱藏通信隧道技術、權限維持、域內橫向移動等後滲透技術;
4、擁有軟體設計技能國家證書、曾任入侵檢測產品線負責人。
1、漏洞原理
我們既然已經知道了序列化與反序列化的過程,那麼如果在反序列化時,這些即將被反序列化的數據是經過特殊構造的呢?
如果Java應用對用戶輸入,即不可信數據做了反序列化處理,那麼攻擊者可以通過構造惡意輸入,讓反序列化產生非預期的對象,非預期的對象在產生過程中就有可能帶來任意代碼執行。
2、漏洞危害
案例1:Apache ActiveMQ 5.12.0 遠程代碼執行漏洞(JMS)
Apache ActiveMQ 5.13.0之前5.x版本中存在安全漏洞,該漏洞源於程序未能限制可在代理中序列化的類。遠程攻擊者可藉助特製的序列化的Java Message Service (JMS) ObjectMessage對象利用該漏洞執行任意代碼。
受到影響的產品如下:
Apache ActiveMQ 5.12.0 and earlierHornetQ 2.4.0 and earlierOracle OpenMQ 5.1 and earlierIBM Websphere MQ 8.0.0.4 and earlierOracle Weblogic 12c and earlierPivotal RabbitMQ JMS client 1.4.6 andearlierIBM MessageSight MessageSight V1.2JMSClient and earlierSwiftMQ JMS client 9.7.3 and earlierApache ActiveMQ Artemis client 1.2.0 andearlierApache Qpid JMS client 0.9.0 and earlierAmazon SQS Java Messaging Library 1.0.0and earlier案例2:JBoss反序列化漏洞(JMX)
JBoss利用的是HTTP協議,可以在任何埠上運行,默認安裝在8080埠中。JMX是一個Java的管理協議,在JBoss中的JMXInvokerServlet可以使用HTTP協議與其進行通話。這一通信功能依賴於Java的序列化類。
本地構造惡意的序列化對象
構造惡意的序列化對象發送給目標主機:
執行系統命令:
受影響的產品有:
案例3:
Jenkins Remoting的相關API是用於實現分布式環境中master和slave節點或者master和CLI的訪問,API沒有身份認證並且支持序列化對象。CVE-2016-0788通過Jenkins Remoting巧妙地開啟JRMP,JRMP觸發反序列化操作,從而進行漏洞的利用。
作者提供了完整利用POC,在遠程伺服器開啟JRMI服務:
連接遠程服務埠,發送惡意序列化數據包。
這樣在Jenkins的根目錄就會生成一個pwned文件。
受到影響的產品:
All Jenkins main line releases up to andincluding 1.649
All Jenkins LTS releases up to andincluding 1.642.1
3、漏洞防禦
(1)反序列化對象白名單控制,在resolveClass方法中校驗對象名字:
public class LookAheadObjectInputStream extends ObjectInputStream { public LookAheadObjectInputStream(InputStream inputStream) throws IOException { super(inputStream); } @Override protected Class<?> resolveClass(ObjectStreamClass desc) throws IOException, ClassNotFoundException { if (!desc.getName().equals(Bicycle.class.getName())) { throw new InvalidClas**ception( "Unauthorized deserialization attempt", desc.getName()); } return super.resolveClass(desc); }}(2)序列化數據採用對稱加密進行傳輸,接口調用增加身份認證。(此種方法僅僅能提升攻擊成本)
(3)因為序列化機制不能保證數據的完整和和保密性,如果類中存在敏感數據,並且這個類還需要序列化,就需要在特定對象的一個域上關閉serialization,在這個域前加上關鍵字transient即可。
延伸內容來源於i春秋社區
i春秋官方公眾號為大家提供
前沿的網絡安全技術
簡單易懂的實用工具
緊張刺激的安全競賽
還有網絡安全大講堂
更多技能等你來解鎖