一個0day的開端-失敗的man與nday

蚁景网安实验室發表於2024-10-10

最近在審計java的CMS,跟著文章進行nday審計,找準目標newbee-mall Version1.0.0(新蜂商城系統),並跟著網上文章進行審計:

https://blog.csdn.net/m0_46317063/article/details/131538307

一個0day的開端-失敗的man與nday

下載唯一的版本,且原始碼README中版本也對的上,但沒想到nday全部復現失敗,但在一番審計後找到了一個新的漏洞點:ssrf,且在前臺可以被使用者觸發。

失敗的man與nday:

失敗的sql注入漏洞:

(此漏洞原本可以在前臺與後臺進行sql注入攻擊)

分析文章中有兩sql注入漏洞,是由於引入mybatis依賴導致,但在我下的版本中根據關鍵字元${找不到任何的注入點,經過與分析文章對比發現所有注入點全部由${改成了#{由此完成修復。

一個0day的開端-失敗的man與nday

失敗的許可權繞過:

(此漏洞原本可以在admin登入後臺透過/;/admin/test完成許可權繞過)

復現文章寫到以request.getRequestURI()獲取路徑獲取路徑後再進入if判斷:

一個0day的開端-失敗的man與nday

但我下載的版本進行了修復:將獲取前端傳輸的路徑方法改為了:getServletPath()從而完成修復。

兩種方法的不同具體分析可以參考如下文章:

https://forum.butian.net/share/3730

失敗的越權漏洞:

(此漏洞原本可以根據傳入的id引數越權修改他人資訊。)

定位到具體程式碼:

一個0day的開端-失敗的man與nday

此處程式碼與復現文章一樣,都是先建立一個NewBeeMallUserVO物件,再透過是否為空判斷資訊修改是否成功。

【----幫助網安學習,以下所有學習資料免費領!加vx:dctintin,備註 “部落格園” 獲取!】

 ① 網安學習成長路徑思維導圖
 ② 60+網安經典常用工具包
 ③ 100+SRC漏洞分析報告
 ④ 150+網安攻防實戰技術電子書
 ⑤ 最權威CISSP 認證考試指南+題庫
 ⑥ 超1800頁CTF實戰技巧手冊
 ⑦ 最新網安大廠面試題合集(含答案)
 ⑧ APP客戶端安全檢測指南(安卓+IOS)

真正修改資訊的程式碼在updateUserInfo方法裡面,於是跟進該方法實現處:

螢幕截圖 2024-09-18
222508

一個0day的開端-失敗的man與nday

發現跟到了介面,於是我們繼續跟進,找該介面的實現類:

一個0day的開端-失敗的man與nday

跟進到如下類,找到具體實現的程式碼塊:

一個0day的開端-失敗的man與nday

復現文章程式碼在進入if判斷前只有一行程式碼,並且程式碼邏輯是從前端傳入的id值進行資訊修改,但可以看到我下載的程式碼有兩行:

NewBeeMallUserVO userTemp = (NewBeeMallUserVO)httpSession.getAttribute(Constants.MALL_USER_SESSION_KEY);

首先透過http.Session獲取當前使用者,再賦給建立的userTemp物件。

MallUser userFromDB =mallUserMapper.selectByPrimaryKey(userTemp.getUserId());

再從userTemp物件中獲取id值進行資訊修改,而非從前端請求中獲取引數id的值,來完成漏洞修復。

0day的發現:

登入後臺,點選修改或者新增商品:

螢幕截圖 2024-09-18
204816

隨意傳入圖片後點選儲存並抓包。

螢幕截圖 2024-09-18
204915

將POST資料包如上兩個引數修改為dnslog地址,放包,在商城前臺搜尋該商品名稱。

螢幕截圖 2024-09-18
204953

點選訪問,dns平臺出現記錄。

螢幕截圖 2024-09-18
205059

漏洞程式碼分析:

先看看商品資訊儲存過程:

根據介面定位程式碼塊:

一個0day的開端-失敗的man與nday

可以發現在接受引數後進行是否為空判斷後進入了核心方法updateNewBeeMallGoods,跟進:

一個0day的開端-失敗的man與nday

跟到介面後再找到介面實現類,最後定位到更新資訊程式碼塊。

可以看到,僅僅對傳入引數值進行為空判斷和相同判斷後,便呼叫set方法進行儲存。

接下來再看看商品資訊呼叫程式碼鏈。

根據觸發漏洞的資料包介面定位程式碼塊:

一個0day的開端-失敗的man與nday

此處程式碼根據傳入goodsid引數,將商品渲染到前端,也就是搜尋商品後,見到商品那刻觸發漏洞。

對接受goodsid引數是否<1判斷後進入取商品資訊程式碼。

跟進getNewBeeMallGoodsById方法,找到方法介面後再找介面實現類,再找方法:

一個0day的開端-失敗的man與nday

發現goodsid引數傳入selectByPrimaryKey方法。

一個0day的開端-失敗的man與nday

該方法透過資料訪問物件(DAO)goodMapper呼叫,且在方法最前處由NewBeeMallGoodsMapper對其定義:

螢幕截圖 2024-09-18
225627

全域性搜尋,找到對應xml檔案:

一個0day的開端-失敗的man與nday

發現透過id引數對資料庫操作,取出goodsCoverImg與goodsCarousel引數。

回到最先前的類:

一個0day的開端-失敗的man與nday

此時goods物件已經獲取商品相關引數值。

再進入if判斷商品是否上架,上架則進入下一輪程式碼,將商品資訊封裝為檢視模型,找到NewBeeMallGoodsDetailVO類,發現只接受了goodsCoverImg引數,也就是先前抓包修改處只用修改該引數即可:

一個0day的開端-失敗的man與nday

最後返回檢視名稱"mall/detail",表示渲染商品詳情頁面:

一個0day的開端-失敗的man與nday

由於儲存時未做任何過濾,進行檢視層渲染時直接拿出goodsCoverImg引數放到前端,導致使用者一旦訪問商品便觸發該漏洞。

更多網安技能的線上實操練習,請點選這裡>>

相關文章