環境:
??JDK 8u202
??MySQL 5.5.29
??RuoYi 4.7.6
參考公眾號(這不是我公眾號啊)
https://mp.weixin.qq.com/s/IrqLp2Z3c941NiN0fFcDMA

這是一個最新版漏洞

其中關鍵請求需要3個(新增計劃任務、執行計劃任務、下文檔案),沒有給出內部實作關鍵資訊,嘗試審計

首先去官網下載最新版本

選擇最新版本

解壓并部署,只需配置好mysql資料庫即可

匯入sql資料

springboot啟動!

看一下登錄密碼,先去登錄界面

默認賬戶密碼已經填寫好了,輸入驗證碼即可登錄

找到定時任務

嘗試一下默認計劃任務,點擊編輯,查看該功能的作用

發現計劃任務可以呼叫bean或以包全稱呼叫方法

執行一次試試

發現終端有輸出

找到呼叫 ryTask.ryParams('ry') 的 bean

所以計劃任務是可以直接呼叫bean并執行對應的方法的,那回傳看公眾號內發的請求,發現跟換指定的bean
、
去查看一下指定 ruoYiConfig 的 bean 中 setProfile 方法的作用

發現修改的是當前類屬性

是一個上傳路徑

那一般情況下,上傳路徑都是在組態檔中提前配置好的,找到組態檔,發現默認是 D 盤的某目錄下

回到計劃任務頁面,添加一個新任務

填寫好對應引數,修改成我們要下載的檔案地址,cron表示式按照原有的測驗計劃任務模板填寫即可

提交,追蹤請求,發現提交到 /monitor/job/add 路徑下

追蹤請求鏈

發現有很多過濾

最重要的是最后的黑白名單過濾,打斷點

進入第一個黑名單判斷

這里的 JOB_ERROR_STR 是黑名單串列

跟進到 containsAnyIgnoreCase 方法,發現只是對字串進行黑名單判斷,未作修改

繼續跟進到下一個白名單判斷

方法里面首先將傳入的值進行了拆分,拆分后的值準備通過 getBean 的方式轉換為 bean

這里成獲取到物件,將轉換為bean的物件再進行白名單檢測

跟進 containsAuyIgnoreCase 方法,這里是將物件包名傳了進來,用來判斷呼叫的是不是頂級包下的物件

這里成功繞過,回傳 true 繞過判斷,進入到 service 層

發現只是將請求保存到了資料庫

回到 計劃任務頁面,發現新增 Test 計劃任務 成功

之前正常流程是需要執行一次計劃任務,就會呼叫對應bean的方法,這里執行一次 Test 計劃任務

發現請求到 /monitor/job/run 路徑下
找到該路徑

并打上斷點,跟進到服務層

進入到服務層,首先通過ID取出之前存入的物件

跳到下一個斷點,發現這里實際執行的是 StdScheduler 類的 triggerJob 方法

找到這個方法,發現是第三方包 quaryz 2.3.2 版本

去 google 查找到一下這個第三方包的檔案,看實作的是什么功能,找到官方檔案
https://javadoc.io/doc/org.quartz-scheduler/quartz/latest/index.html

就是以代理的方式去執行類的方法

執行成功,這里在完成最后一步操作,根據公眾號發送的最后一個包,去請求檔案

嘗試訪問,下載成功(這里這個檔案實際存放在 C://Users/Test01/Desktop/target.txt ,之前由于我的環境沒有E盤,所以前面的計劃任務傳參都要改成C盤,重新編輯計劃任務后再執行一次即可,然后再下載)

但為什么這里要傳 info.xml:.zip 呢,跟進到請求地址 /common/download/resource

這里有過濾,打上斷點,進入一個判斷

跟進 checkAllowDownload 方法,這里進行 .. 過濾,還進行了后綴名過濾

查看 DEFAULT_ALLOWED_EXTENSION 后綴名白名單有哪些

這里的匹配規則是取最后一個 . 的后綴,所以取得 zip 去比較,在范圍內,繞過白名單


回到最上層方法,這里通過 RouYiConfig.getProfile() 獲取我們之前計劃任務修改的地址,也就是 C盤的指定地址
然后在通過 StringUtils.substringAfter() 拼接 路徑 和 檔案名

跟進 substringAfter 方法,這里做了檔案名判斷,判斷是否包含 / profile 路徑名稱,找不到對應路徑所以回傳 -1,所以回傳為空

所以和空拼接后根據路徑沒有變化

然后以最后一個 / 符號拆分出來檔案名字
然后跟進 writeBytes 方法,其實該方法就是去請求 downloadPath 中對應的檔案路徑,并寫入到 reponse 中并回傳給用戶

進入 write Bytes 方法,請求檔案,并以 Stream 流的方式寫入到 os 中,os 就是 reponse 用于回傳給前端用戶,

所以這里的請求只需要繞過白名單即可,請求檔案名即可以是 xxx.html、yyy.ppt、zzz.mp4,便可繞過白名單判斷,并繞過檔案名的路徑判斷,回傳為空后去拼接根目錄,便完成任意檔案下載漏洞,
更改路徑名稱一樣也能訪問該檔案

蕪湖完工!
總結:這種漏洞不可能通過黑盒測驗出來,只能通過白盒測驗,并且需要對站點代碼和組件使用非常熟悉,才能通過代碼審計的方式挖掘此洞,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/549749.html
標籤:其他
