利用ilspy將bagel.dll開啟
關於此目錄有可以說的內容
目錄解析
最上方的bagel是組裝名字(assemble name)
bagel_server 是命令空間(namespace)
下一級分支是類如File,Base,Handler,Orders等(class)
反序列化導致的命令執行漏洞程式碼審計思路
首先看主程式Bagel
1.透過明顯的英語翻譯可以看到main函式執行了兩個函式一個是initialzieserver()和startserver(),初始化服務和開啟服務 服務為wsserver(websocket)
值得關注的是初始化服務中存在MessageReceived(),根據下方關於messagerecevied函式的設計,可以知道此函式利用了handler類中的deserialize方法和serialize方法(反序列化函式)
而此反序列化函式獲取到的內容是json格式的內容。
因此跳轉到handlerle類中看deserialize函式是否被重寫
Handler類
可疑點
1.看到存在typenamehandling=4的設定
2.反序列化的語句是JsonConvert.DeserializeObject<Base>(json,val);
反序列化的物件是從Base類獲取的key-value值
觀察Base類
關注點:
1.Base類繼承於Orders類,因此繼承父類的所有公共函式(public函式)
2.userid和session都是私有成員,且session為Unauthorized
觀察Orders類
提煉:
1.orders類存在三個私有成員filename、order_info和new一個file類
2.存在三個公有函式RemoveOrder、WriteOrder、ReadOrder
其中Readorder讀取檔案內容存在目錄路徑過濾
writeOrder函式使用get時直接返回writefile內容
RemoveOrder函式僅僅設定了getter、setter
Order類內new了一個FIle類,因此可以使用File類設定的函式
觀察File類
提煉:
1.存在兩個類為ReadFile和WriteFile
呼叫readcontent和writecontent函式進行讀寫操作
因此我們可以確定一個路徑,如下圖
圖片來源:0xdf 師傅
需要注意的是使用getter時是不需要引數的情況下,如果呼叫setter就是傳了一個引數才會呼叫