
0x01 背景介紹
(資料圖)
CodeQLpy是一款半自動化的代碼審計工具,能有效提高代碼審計的效率,目前項目仍處于測試階段。項目地址https://github.com/webraybtl/CodeQLpy,在github主頁有對應的安裝和使用介紹,如圖1.1所示。
-t: 指定待掃描的源碼路徑。支持文件夾,jar包和war包,如果是文件夾,則必須是網站跟目錄。
-d: 指定待掃描的CodeQL數據庫。
-c: 指定待掃描的源碼是編譯前源碼還是編譯后源碼。
-s: 指定是否跳過環境檢查,本項目運行依賴于codeql和java環境,首次運行建議不跳過。
-v: 指定待測試源碼的jdk版本,目前支持6,7,8,11。默認為8。
這里以某通用WEB應用為例,通過指紋body="changeAccount(\"varAccount\")" || body="KoronCom.TrustedSites"可以在資產測繪平臺上找到近3000個資產。
0x02 工具使用
該系統的源碼是主要由jsp文件和class文件組成,其中部分源碼經過混淆,如圖2.1所示。其中類名稱和字段名稱的可讀性很差,不方便閱讀,而且該系統的代碼量較大,大約有4600個文件。如果通過傳統的方式來進行代碼審計,對審計人員的要求將會非常高。
圖2.1 經過混淆的源碼
使用CodeQLpy可以方便的幫助審計人員從大量源碼中發現可能存在的安全隱患,使用步驟如下。
Step1:生成數據庫初始化
python3 main.py -t /Users/xxx/Downloads/OAapp/ -c
圖2.2 數據庫初始化
最終運行成功之后會相應下一步進行數據庫創建的命令。
Step2:生成數據庫
這一步直接使用上一步命令最終返回的生成數據庫的命令在cmd/bash環境中運行即可
mac命令如下
arch -x86_64 codeql database create out/database/OAapp --language=java --command="/bin/bash -c /Users/xxx/CodeQLpy/out/decode/run.sh" --overwrite
windows命令如下
codeql database create out/database/OAapp --language=java --command="run.cmd" --overwrite
生成的過程中會報很多錯誤,可以忽略,如圖2.3所示。因為這一步創建的數據庫是用上一步反編譯的源碼進行編譯,反編譯的源碼不能保證完全正確,所以會有錯。但是有錯的源碼仍然可以創建數據庫,不影響我們進行代碼審計。
圖2.3 創建數據庫
Step3:代碼審計
這一步需要使用上一步命令最終相應的生成數據庫的路徑,如圖2.4所示。
python3 main.py -d /Users/xxx/CodeQLpy/out/database/OAapp/
圖2.4 使用ql插件分析可能存在的漏洞
最終得到的結果是csv文件,保存路徑在out/result/目錄,打開對應的文件,如圖2.5所示。
圖2.5 掃描結果內容
0x03 結果驗證
掃描出來的結果很多,我們挑選幾個有代表性的進行驗證。
1)BeanShell遠程命令執行漏洞
相關存在漏洞的文件在com/menyi/web/util/UtilServlet.class,如圖3.1所示。從圖中可以看出用戶可控的輸入value,傳入了Interpreter類的eval方法,導致BeanShell任意代碼執行。
圖3.1 BeanShell遠程命令執行漏洞
在測試平臺上利用此漏洞,如圖3.2所示。
圖3.2 BeanShell遠程命令執行漏洞exp
2)FilePathInjection任意文件讀取漏洞
相關存在漏洞的代碼在com.menyi.web.util.ReportServlet.class。如圖3.3所示。
圖3.3 任意文件讀取漏洞
在測試平臺上利用此漏洞,如圖3.4所示。
圖3.4 任意文件讀取漏洞Exp
3)SQL注入漏洞
漏洞文件是在com.koron.oa.workflow.OAMyWorkFlowAction.class。如圖3.5所示。
圖3.5 用戶可控輸入tablename
繼續跟進getOAMyWorkFlowInfo,如圖3.6所示。
圖3.6 tableName參數傳遞到SQL語句