Java代碼審計(jì)項(xiàng)目-某在線教育開(kāi)源系統(tǒng)
環(huán)境部署
- 下載源代碼,使用IDEA進(jìn)行部署,項(xiàng)目pom.xml進(jìn)行maven依賴(lài)包添加、配置數(shù)據(jù)庫(kù)賬號(hào)密碼、配置開(kāi)啟端口后即可使用tomcat7插件運(yùn)行項(xiàng)目。
- 搭建過(guò)程遇見(jiàn)兩個(gè)坑點(diǎn):
mysql建議直接使用5.5.*版本的,高版本的會(huì)因?yàn)閙ysql的默認(rèn)配置需要額外配置而遇見(jiàn)各種問(wèn)題,雖然最后都能搭建成功,但是直接使用低版本的就無(wú)需額外配置。
項(xiàng)目路徑建議直接使用 http://IP:port 形式,后面不要配置額外的路徑,加入額外項(xiàng)目配置后雖然可以部署成功,但是會(huì)導(dǎo)致一些頁(yè)面或者圖片加載不成功。
- 進(jìn)行代碼審計(jì)時(shí),記得需要額外把\src\main\webapp\WEB-INF\lib\目錄下的jar包反編譯后再進(jìn)行代碼審計(jì),因?yàn)槭褂肐DEA進(jìn)行源碼關(guān)鍵字搜索時(shí)不會(huì)搜索jar包中的代碼,我審計(jì)之前就沒(méi)有注意到項(xiàng)目下的這個(gè)目錄,導(dǎo)致前面審計(jì)過(guò)程中某些功能找不到源代碼。
項(xiàng)目結(jié)構(gòu)分析
這是一個(gè)SSM(即Spring Framework、Spring MVC、MyBatis)架構(gòu)項(xiàng)目。
百科是這樣介紹的:
- pom.xml:審計(jì)maven項(xiàng)目首先應(yīng)該查看pom.xm,通過(guò)查看此文件可以知道項(xiàng)目用了哪些組件及組件版本,這樣可以快速查看組件對(duì)應(yīng)的版本是否有漏洞。
觀察到項(xiàng)目使用了log4j 且版本為1.2.17,此版本存在反序列化漏洞CVE-2019-17571(經(jīng)過(guò)分析,不存在此漏洞,因?yàn)楸卷?xiàng)目未使用產(chǎn)生此漏洞的類(lèi)即SocketNode類(lèi))。
還使用了druid 1.0.1 組件,可以找一些未授權(quán)接口(經(jīng)過(guò)測(cè)試未發(fā)現(xiàn)此組件產(chǎn)生的未授權(quán))。
mybatis 3.2.7 組件存在反序列化漏洞CVE-2020-26945(經(jīng)過(guò)分析,不存在此漏洞,因?yàn)榇隧?xiàng)目未開(kāi)啟mybatis二級(jí)緩存功能)。
- web.xml:程序啟動(dòng)時(shí)會(huì)先加載這個(gè)文件,此文件用來(lái)配置Filter、Listener、Servlet。此文件需要重點(diǎn)關(guān)注Filter過(guò)濾器的全局配置。此項(xiàng)目只配置了兩個(gè)全局的過(guò)濾器且這兩個(gè)過(guò)濾器都未對(duì)輸入輸出進(jìn)行轉(zhuǎn)義之類(lèi)的字符處理,所以未配置全局的XSS過(guò)濾。
- applicationContext.xml: spring的默認(rèn)配置文件,當(dāng)容器啟動(dòng)時(shí)找不到其他指定配置文檔時(shí),將加載這個(gè)配置文件,此文件也包含引用其他的配置文件。
- spring-mvc.xml:此文件主要的工作是:?jiǎn)?dòng)注解、掃描controller包注解;靜態(tài)資源映射;視圖解析(defaultViewResolver);文件上傳(multipartResolver);返回消息json配置。
- web項(xiàng)目啟動(dòng)時(shí),讀取web.xml配置文件,首先解析的是applicationContext.xml文件,其次才是sping-mvc.xml文件。
- Interceptor:攔截器,用于攔截用戶(hù)請(qǐng)求并進(jìn)行相應(yīng)的處理。比如通過(guò)它來(lái)進(jìn)行權(quán)限驗(yàn)證,或者是來(lái)判斷用戶(hù)是否登陸,或者是像12306 那樣子判斷當(dāng)前時(shí)間是否是購(gòu)票時(shí)間。此項(xiàng)目有3個(gè)攔截器,分別對(duì)前臺(tái)用戶(hù)、后臺(tái)用戶(hù)、網(wǎng)站配置管理處的用戶(hù)是否登錄與權(quán)限做相應(yīng)處理。
代碼審計(jì)
前臺(tái)找回密碼處驗(yàn)證碼重復(fù)利用
直接在代碼中搜索關(guān)鍵字驗(yàn)證碼,對(duì)相關(guān)代碼進(jìn)行分析。
此處是找回密碼功能,先后獲取客戶(hù)端與服務(wù)端驗(yàn)證碼進(jìn)行校驗(yàn),校驗(yàn)成功后進(jìn)入校驗(yàn)郵箱是否注冊(cè),若未注冊(cè)則直接返回結(jié)果,未刪除服務(wù)端中的舊驗(yàn)證碼,所以此處可對(duì)驗(yàn)證碼重復(fù)使用來(lái)爆破出已經(jīng)注冊(cè)的郵箱。
繼續(xù)分析可知,郵箱存在且重置密碼之后才清除服務(wù)端中的驗(yàn)證碼。因?yàn)榍芭_(tái)登錄處無(wú)驗(yàn)證碼,所以此處可配合登錄處繼續(xù)密碼爆破。
但是經(jīng)過(guò)分析,后臺(tái)管理員登錄處就不存在驗(yàn)證碼重復(fù)利用,因?yàn)轵?yàn)證碼校驗(yàn)正確后就會(huì)立馬進(jìn)行清除。
XSS
開(kāi)頭已經(jīng)分析未發(fā)現(xiàn)全局的XSS過(guò)濾器,所以直接注冊(cè)賬號(hào)進(jìn)行登錄,見(jiàn)框就插入XSS payload。
在問(wèn)答功能下的我要提問(wèn)功能處發(fā)現(xiàn)存儲(chǔ)型XSS。
此處只有標(biāo)題有XSS而內(nèi)容無(wú)XSS,找到對(duì)應(yīng)的入口進(jìn)行分析原因,questionsService.addQuestions()為添加問(wèn)答方法,追蹤此方法
QuestionsController-->QuestionsService-->QuestionsServiceImpl-->QuestionsDao-->QuestionsDaoImpl-->QuestionsMapper
根據(jù)追蹤過(guò)程分析未做字符過(guò)濾就直接保存到數(shù)據(jù)庫(kù)中。并且標(biāo)題和內(nèi)容都保存數(shù)據(jù)庫(kù)中。
由此可知,存儲(chǔ)過(guò)程標(biāo)題和內(nèi)容未做差異化處理,說(shuō)明在輸出的時(shí)候?qū)?nèi)容進(jìn)行了過(guò)濾,繼續(xù)分析輸出部分。由以上可知,存在XSS的url為http://127.0.0.1:8080/question/list。
直接在*.jsp文件中搜索question/list找到對(duì)應(yīng)的輸出點(diǎn)。很明顯標(biāo)題處是直接拼接數(shù)據(jù)庫(kù)中的值并未使用標(biāo)簽包裹,而內(nèi)容處則使用了<c:out>標(biāo)簽。在jsp文件中,使用<c:out>標(biāo)簽是直接對(duì)代碼進(jìn)行輸出而不當(dāng)成js代碼執(zhí)行。
自此,產(chǎn)生XSS的來(lái)龍去脈都已經(jīng)知道了,所以輸出變量時(shí),沒(méi)有使用<c:out>標(biāo)簽進(jìn)行防護(hù)的都會(huì)產(chǎn)生XSS,經(jīng)分析其他還有多處有XSS。
SQL注入
因?yàn)槭褂玫臅r(shí)mybatis框架,所以直接在*Mapper.xml文件中搜索${即可。
發(fā)現(xiàn)存在多處使用${}進(jìn)行拼接的地方,選擇一處進(jìn)行分析
找到對(duì)應(yīng)的controller層入口。此處為后臺(tái)管理員用戶(hù)刪除文章功能處。
抓取請(qǐng)求包直接使用sqlmap爆破即可。
其他還有幾處也存在sql注入。類(lèi)似分析即可。有幾處因?yàn)槭侵苯悠唇勇窂街械淖址鳛閰?shù)的,所以這種情況即使使用${}也不會(huì)造成sql注入。
前臺(tái)用戶(hù)橫向越權(quán)
在用戶(hù)修改個(gè)人資料時(shí),直接抓包修改 user.userId參數(shù)值即可越權(quán)登錄到其他存在的用戶(hù)。
分析代碼可知,未對(duì)用戶(hù)進(jìn)行判斷就直接把用戶(hù)信息更新到數(shù)據(jù)庫(kù)中,更新數(shù)據(jù)庫(kù)中后直接使用userid進(jìn)行自動(dòng)重新登錄從而可導(dǎo)致直接登錄其他用戶(hù)界面。
CSRF
后臺(tái)管理員創(chuàng)建用戶(hù)處存在CSRF漏洞,攻擊者可結(jié)合此系統(tǒng)的XSS漏洞構(gòu)造惡意代碼從而導(dǎo)致創(chuàng)建系統(tǒng)管理員用戶(hù)。
可用burpsuite自帶的CSRF工具生成payload進(jìn)行測(cè)試。
從代碼處可知,未對(duì)請(qǐng)求體校驗(yàn)Referer字段,也無(wú)token機(jī)制。因此可造成CSRF。
前臺(tái)文件上傳getshell
前置知識(shí)點(diǎn)
jspx:以xml語(yǔ)法來(lái)書(shū)寫(xiě)jsp的文件,自定義的映射類(lèi)型,jspx=jsp+xml;jspx文件本身符合x(chóng)ml的規(guī)范,但是它本質(zhì)又是一個(gè)jsp文件,所以在所有jsp里面能夠做到的事情在jspx里同樣可以做到。
tomcat的web.xml中org.apache.jasper.servlet.Jspservlet配置關(guān)于jsp服務(wù)的解析,默認(rèn)是都會(huì)解析jsp和jspx。
此處漏洞發(fā)生在前臺(tái)用戶(hù)上傳頭像處。
直接找到源代碼進(jìn)行分析,源碼在\src\main\webapp\WEB-INF\lib\inxedu-jar.jar包中。
此處的fileType即為前端傳入的文件類(lèi)型后綴,分析代碼可知,此處只過(guò)濾了jsp文件其他文件可隨意上傳,可以上傳html文件造成XSS漏洞,由于此項(xiàng)目使用tomcat,所以可以上傳jspx文件getshell。
使用哥斯拉工具生成jspx木馬上傳文件,上傳成功。
連接成功。