日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【关于学习渗透】手把手教你玩转java反序列化cb链

發布時間:2025/3/21 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【关于学习渗透】手把手教你玩转java反序列化cb链 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

java反序列化cb鏈大家應該都玩過,博主當初是通過看shiro無依賴了解到的,最近在重學基礎,就手把手一點一點調試一遍。記得11月份自博主反思之后,認為自己滲透的學習深度廣度都太差,對漏洞的學習只是學了一層表面,老是這么搞可不行啊,花一兩個月時間重新看了幾百集java語言基礎。這篇文章嚴格來說是學習java利用鏈的部分學習筆記,這也算博主部分學習的一小段總結吧,話不多說,直接開始。【資料】

一、利用鏈流程


畫了一張流程圖,供大家參考。如圖所示,這里我將從下往上分為三部分來講解利用鏈流程

TemplatesImpt類->調用惡意類

BeanComparator類->利用javabean調用getOutputProperties()

PriorityQueue類->反射調用PropertyUtils.getPropert

二、TemplatesImpt類

根據上面的流程圖我們可以知道TemplatesImpt類的危險方法是getOutputProperties(),我們從頭開始調試。

跑到newTransformer().getOutputProperties(),我們跟進newTransformer()

一路跟進,進入getTransletInstance()

我們看到做了兩個空判斷,_null、_class,之后_class不為空執行defineTransletClasses(),繼續跟進。


如圖所示,這里defineClass從_bytecodes[]中還原出一個Class對象并放在_class中,我們回到getTransletInstance()處,此時_class不為空,繼續往下走。

AbstractTranslet translet = (AbstractTranslet) _class[_transletIndex].newInstance();


此時對還原的class做了一個實例化,到這里我們可以得知,在這里傳入一個惡意類,通過靜態代碼塊或者構造方法就可以執行惡意操作。

三、BeanComparator類

我們通過分析TemplatesImpt類已經得知該類可以惡意執行命令,那我們如何調用呢?

這里我們就要引入javabean這個概念了。而TemplatesImpl符合javabean的使用條件

PropertyUtils.getProperty(person,"name")




我們可以通過如上的形式去調用getOutputProperties()方法。接下來我們可以看看都什么函數調用了。



我們可以看到o1為我們傳遞的TemplatesImpt類,構造函數直接賦值,property為_outputProperties。接下來我們只需要找一個同名調用的compare,例如…CC4的優先隊列。

四、PriorityQueue類

首先我們看一下PriorityQueue類,存在Serializable接口,readObject方法。


我們跟進readObject的heapify()方法

可以看到heapify方法做了一個循環,然后將queue數組傳入siftDown方法。跟進siftDown

如果comparator不為空執行siftDownUsingComparator,進行跟進siftDownUsingComparator。



到這里,我們可以看到siftDownUsingComparator方法最終執行了comparator.compare,且comparator我們可以直接反射成BeanComparator。接下來我們只需要將queue添加TemplatesImpl類就可以了。我們看一下add方法。

跟進offer方法

這里我們如果直接傳入一個類,會報int類型錯誤,這里我是先傳數值,之后在通過反射改回來的。

//獲取comparator屬性,將聲明的priorityQueue的comparator修改為beanComparator Class c = PriorityQueue.class; Field comparatorField = c.getDeclaredField("comparator"); comparatorField.setAccessible(true); comparatorField.set(priorityQueue,beanComparator);//對priorityQueue中的queue重新賦值 Field addField = priorityQueue.getClass().getDeclaredField("queue"); addField.setAccessible(true); Object[] arr = (Object[]) addField.get(priorityQueue); Array.set(arr,0,templates); addField.set(priorityQueue,arr); //System.out.println(Array.get(arr,0));

接下來我們的走向很清晰明了,首先我們通過add添加數據,之后做兩步反射,最終執行BeanComparator.compare(TemplatesImpl,1),之后觸發PropertyUtils.getProperty,通過寫好的_name、_bytecodes執行TemplatesImpl的getOutputProperties()。

五、斷點調試利用鏈

首先執行反序列化執行PriorityQueue類的readObject(),進入heapify

做兩步反射,跳轉到BeanComparator.compare,繼續跟進

跳轉到PropertyUtilsBean類,獲取到_outputProperties的get方法。繼續跟進

跳轉到getOutputProperties方法,一路往下走,最終還原class,實例化惡意類。


成功觸發惡意類執行命令

總結

一個個基礎很差 技術很菜的小菜雞,文章里面有什么不足之處,望各位大神多加指正;【學習資料來源】

總結

以上是生活随笔為你收集整理的【关于学习渗透】手把手教你玩转java反序列化cb链的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。