0x00 前言
艱難徘徊這么久,終於邁出第一步,畏畏縮縮是阻礙大多數人前進的絆腳石,共勉。
系統是租車系統,這個系統是Adog師傅之前發在freebuf(http://www.freebuf.com/articles/web/162910.html)的,他審的時候沒有發現sql注入,但在評論中有個師傅說有前台sql注入。
那么我就來找找前台的sql注入吧,雖說是java但其實代碼審計的點都是通用的,萬變不離其宗。
扯遠了,這篇文章,算是踏入java代碼審計領域的開篇。
0x01 基礎環境搭建
源碼下載:http://down.admin5.com/jsp/135501.html
環境還是某study一把梭,下載鏈接(http://phpstudy.php.cn/phpstudy/JspStudy.zip)
IDE的話用的是IDEA
安裝步驟按照使用說明來就是了

安裝步驟1中,注意要把tomcat的server.xml中的這一行注釋掉

步驟2:在數據庫的目錄中打開cmd窗口,導入mysql的命令: (jspstudy的mysql默認賬號密碼是root/root)
mysql -u root -p opencar <opencar.sql
順便一提這個租車系統的默認配置賬號密碼也是root/root,見db.properties

接着重啟jspstudy即可。
訪問url:http://localhost:8080/opencarrun/,無報錯則表示成功安裝。
0x02 前台sql注入
加載源碼到IDEA,打開大概是這樣子的。

xss和短信轟炸就不說了,直接找sql注入。
根據Adog師傅的文章,我找到了幾個處理sql語句的類,比如

加紅的原因是因為IDEA找不到類的位置,加載的opencar文件夾也確實沒有源碼。
那么如何找到這里的源碼呢?其實在opencarrun\WEB-INF\lib\中存放了相關的依賴jar包,其中有一個名為car-weishang-1.0.jar的jar包
因為是jar包,我們需要反編譯回java文件。
下載jd-gui(http://jd.benow.ca/),可以單獨下載,也可以下載idea的插件,我這里是單獨下載。
反編譯一下這個包,可以拿到相關的源碼:

重點關注service下的,因為是前台,所以權限有限,可以重點關注get前綴的方法(表示查詢)
找sql注入的話其實也沒有比較好的方法,就是一個個看,再輔以一定的搜索技巧(看源碼規律配上正則來搜)。
這套系統從Adog師傅的文章知道是用了預編譯的,那么我們要考慮的就是預編譯防御不了的地方,比如like,in,order by這三個位置的。
參考京東安全的這篇文章(https://mp.weixin.qq.com/s?__biz=MjM5OTk2MTMxOQ==&mid=2727827368&idx=1&sn=765d0835f0069b5145523c31e8229850&mpshare=1&scene=1&srcid=0926a6QC3pGbQ3Pznszb4n2q),雖然說的是mybatis框架的,但是預編譯的道理還是一樣。

再結合,java是強類型語言,要注入的話就必須是String類型,那么我們只需要分析可傳String參數的方法即可。

經過刷選,最終符合條件的方法沒幾個,再一一去看代碼是否會有注入,有注入了再去回調調用的地方,最終找到外部傳進來的參數和訪問url。
很幸運找到了幾個。
看到ShopService類的getGoodsPojoListByTypeAndcatAndBranAndPrice方法

回溯看看方法在哪里調用到(Ctrl+Shift+F)

在GoodList.java文件中,跟進去。

這個方法的幾個參數都是有注入的。
同理還有ShopService類的getGoodsPojoListByTypeAndcatAndBranAndPriceCount方法、getGoodsListByExtendCat方法也是一樣,但是位置都是在getGoodsPojoListByTypeAndcatAndBranAndPrice方法之后,所以利用的話還是getGoodsPojoListByTypeAndcatAndBranAndPrice方法比較好利用,至於其他service類也是有可能有注入,就不再一一分析。
分析GoodList.java的訪問url是什么,看到匹配的是/goods url下面。

直接訪問會跳404頁面

通過對前端頁面研究發現是通過首頁的搜索頁面進去的。

其中的cat_id就是我們的注入參數(當然還有其他的,不一一舉例),因為系統是對異常進行了捕獲的,所以不能直接進行報錯注入。
那么就只能進行盲注了,用union回顯也是不行的,因為這里的三條語句都是受影響,那么就只能用延時盲注了。
但因為受影響的字段較多,且會執行三遍,並且這里用不了and,只能用or。
那么用or 1=1 和 or 1=2查詢的時間就已經足夠了。
or 1=2的時候大約執行7-8秒,or 1=1的時候大約執行24-26秒左右。
那么我們可以使false的時候為or 1=2,true為or 1=1 ,payload如下:
http://localhost:8080/opencarrun/goods?cat_id=1)%20or+1=if(ascii(substr(user(),1))=114,1,2)%23&menuId=7+
底層不知道為什么還有一個報錯,但不影響注入

雖然是前台注入,但是這個注入點頗為雞肋,實戰意義不大,僅供參考。
到此,該CMS告一段落。
0x03 總結
剛開始還有很多生疏的地方,慢慢來吧。
