本文授權轉載自FreeBuf.COM
鏈接:https://www.freebuf.com/vuls/240578.html
前言
SQL注入漏洞作為WEB安全的最常見的漏洞之一,在java中隨著預編譯與各種ORM框架的使用,注入問題也越來越少,
新手代碼審計者往往對Java Web應用的多個框架組合而心生畏懼,不知如何下手,希望通過Mybatis框架使用不當導致的SQL注入問題為例,能夠拋磚引玉給新手一些思路,
一、Mybatis的SQL注入
Mybatis的SQL陳述句可以基于注解的方式寫在類方法上面,更多的是以xml的方式寫到xml檔案,
Mybatis中SQL陳述句需要我們自己手動撰寫或者用generator自動生成,撰寫xml檔案時,Mybatis支持兩種引數符號,一種是#,另一種是$,比如:
<select id="queryAll" resultMap="resultMap">
SELECT * FROM NEWS WHERE ID = #{id}
</select>
使用預編譯,$使用拼接SQL,
Mybatis框架下易產生SQL注入漏洞的情況主要分為以下三種:
1、模糊查詢
Select * from news where title like ‘%#{title}%’
在這種情況下使用#程式會報錯,新手程式員就把#號改成了$,這樣如果java代碼層面沒有對用戶輸入的內容做處理勢必會產生SQL注入漏洞,
正確寫法:
select * from news where tile like concat(‘%’,#{title}, ‘%’)
2、in 之后的多個引數
in之后多個id查詢時使用# 同樣會報錯,
Select * from news where id in (#{ids})
正確用法為使用foreach,而不是將#替換為$
id in
<foreach collection="ids" item="item" open="("separatosr="," close=")">
#{ids}
</foreach>
3、order by 之后
這種場景應當在Java層面做映射,設定一個欄位/表名陣列,僅允許用戶傳入索引值,這樣保證傳入的欄位或者表名都在白名單里面,需要注意的是在mybatis-generator自動生成的SQL陳述句中,order by使用的也是$,而like和in沒有問題,
二、實戰思路
我們使用一個開源的cms來分析,java sql注入問題適合使用反推,先搜索xml查找可能存在注入的漏洞點→反推到DAO→再到實作類→再通過呼叫鏈找到前臺URL,找到利用點,話不多說走起
1、idea匯入專案
Idea首頁 點擊Get from Version Control
下載完成,等待maven把專案下載完成

2、搜索$關鍵字
Ctrl+shift+F 調出Find in Path,篩選后綴xml,搜索$關鍵字

根據檔案名帶Dao的xml為我們需要的,以IContentDao.xml為例,雙擊打開,ctrl +F 搜索$,查找到16個前三個為資料庫選擇,跳過,

繼續往下看到疑似order by 暫時擱置

繼續往下看發現多個普通拼接,此點更容易利用,我們以此為例深入,只查找ids從前端哪里傳入

3、搜索映射物件
Mybatis 的select id對應要映射的物件名,我們以getSearchCount為關鍵字搜索映射的物件

搜到了IContentDao.java,IContentDaoimpl.java和McmsAction.java,分別對應映射的物件,物件的實作類和前端controler,直接跳轉到controler類

發現只有categoryIds與目標引數ids相似,需進一步確認,回傳到IContentDao.java按照標準流繼續反推

找到ids為getSearchCount的最后一個引數,alt+f7查看呼叫鏈

調轉到ContentBizImpl,確認前臺引數為categoryIds

回傳到McmsAction,引數由BasicUtil.getString接收,

跟進BasicUtil.getString

繼續跳到SpringUtil.getRequest(),前端未做處理,sql注入實錘

4、漏洞確認
專案運行起來,構造sql陳述句http://localhost:8080/ms-mcms/mcms/search.do?categoryId=1%27)%20%20or+updatexml(1,concat(0x7e,(SELECT+%40%40version),0x7e),1)%23 得到mysql的版本5.7.27,驗證注入存在,

三、總結
以上就是Mybatis的sql注入審計的基本方法,我們沒有分析的幾個點也有問題,新手可以嘗試分析一下不同的注入點來實操一遍,相信會有更多的識訓,當我們再遇到類似問題時可以考慮:
1、Mybatis框架下審計SQL注入,重點關注在三個方面like,in和order by
2、xml方式撰寫sql時,可以先篩選xml檔案搜索$,逐個分析,要特別注意mybatis-generator的order by注入
3、Mybatis注解撰寫sql時方法類似
4、java層面應該做好引數檢查,假定用戶輸入均為惡意輸入,防范潛在的攻擊
學習了不?在看分享下給身邊的人吧!
關注公眾號Java技術堆疊回復"面試"獲取我整理的2020最全面試題及答案,
推薦去我的博客閱讀更多:
1.Java JVM、集合、多執行緒、新特性系列教程
2.Spring MVC、Spring Boot、Spring Cloud 系列教程
3.Maven、Git、Eclipse、Intellij IDEA 系列工具教程
4.Java、后端、架構、阿里巴巴等大廠最新面試題
覺得不錯,別忘了點贊+轉發哦!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/147244.html
標籤:Java
