java 反序列化 漏洞

 
 

java在反序列化的時候會默認調用被重寫的readObject(ObjectInputStream )方法。java

在遠程服務端一個須要反序列化的接口中,好比一個web服務,他那個接口調用鏈中有反序列化方法調用,那我在post到他的web接口中的二進制裏,放一個被序列化的字節數組。web服務會根據這些字節流中的包名先解析到用哪一個本地class去反序列化,首先去調用這個本地class的readObject方法。web

 

爲了實現惡意代碼,須要確認web端普遍存在的class的readObject方法能夠根據咱們的入參進行執行代碼。因此須要找到一個特定的廣爲使用的class。發現AnnotationInvocationHandler這個類,readObject方法被重寫了。分析他的重寫方法,調用了他的類變量map的setValue方法,繼而聯想到map的value改變時能夠觸發咱們自定義的操做。想到了Apache Commons Collections的TransformedMap,普通map被他裝飾了以後,(裝飾的時候傳入一個調用鏈)key或者value被修改的時候,會執行調用鏈的方法。chrome

 

因此,先構建一個奇葩的AnnotationInvocationHandler,這個類的類變量map就是被Apache Commons Collections的TransformedMap裝飾過的map,調用鏈精心設計後,在readObject方法調用時setValue執行,整個調用鏈在遠端web被執行。因而成功。數組

 

因此,必備條件,第一AnnotationInvocationHandler,這個是sun的內部類,在rt.jar裏,確定都有。第二必須有map在setValue的時候執行調用鏈,就是Apache Commons Collections的TransformedMap。調用鏈必須有InvokerTransformer能夠根據參數反射獲得類而且執行此類的方法。post

 

 

 

 

調用鏈:url

 

執行是就是:設計

相關文章
相關標籤/搜索