Java反序列化之commons-beanutils分析

TemplatesImpl類是一個可序列化的類,其中有一個屬性_bytecodes,裏面保存的數據在defineTransletClasses函數裏將會被加載成類:
Java反序列化之commons-beanutils分析
Java反序列化之commons-beanutils分析

存在着這樣一條調用鏈條:
Java反序列化之commons-beanutils分析
簡單來說,只要是能調用到getOutputProperties函數,就能觸發包含在_bytecodes裏的類構造函數被執行(這個類是由***者來實現的)。

Payload第一部分:
Java反序列化之commons-beanutils分析
創建了一個BeanComparator對象,將其作爲參數用來創建一個PriorityQueue,向queue對象中添加兩個大整數對象(佔位用)。
接着通過反射機制設置了comparator後面將會對比對象的屬性爲outputProperties。

Payload第二部分:
Java反序列化之commons-beanutils分析
通過反射機制修改queue中數組保存的對比對象爲內置了***代碼的templates。
返回queue,將其生成序列化數據。

漏洞觸發邏輯:
反序列化的queue的時候,其對應的PriorityQueue類readObject函數會依次讀取序列化數據中的元素,放入到隊列中。然後,調用heapify函數進行排序操作。
Java反序列化之commons-beanutils分析
最終,會調用到siftDownUsingComparator函數,其中會調用comparator的compare方法:
Java反序列化之commons-beanutils分析
compare方法中將會調用被對比對象的對應屬性get方法,這裏的o1,o2就是之前傳入的templates對象,this.property就是之前通過反射機制修改的outputProperties。因此,最終就調用了TemplatesImpl的getOutputProperties函數,觸發POC代碼執行:
Java反序列化之commons-beanutils分析

Java反序列化之commons-beanutils分析

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章