全站資源開放下載,感謝廣大網友的支持
鏈接失效請移步職業司平臺
非盈利平臺

非盈利平臺

只為分享一些優質內容

Java幫幫-微信公眾號

Java幫幫-微信公眾號

將分享做到極致

微信小程序

微信小程序

更方便的閱讀

職業司微信公眾號

職業司微信公眾號

實時動態通知

安卓APP

安卓APP

我們從此不分開

程序員生活志-公眾號

程序員生活志-公眾號

程序員生活學習圈,互聯網八卦黑料

支付寶贊助-Java幫幫社區
微信贊助-Java幫幫社區

Mybatis 框架下 SQL 注入攻擊的 3 種方式,真是防不勝防!【云圖智聯】

23
發表時間:2020-07-15 10:43

前言

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把項目下載完成

B8887946_04A4_4b52_BCA5_935E4C129318

2、搜索關鍵字Ctrl+shift+F調出FindinPath,篩選后綴xml,搜索關鍵字

61827E0E_2AC6_4084_95A8_E226E0CE6A11

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

B4223386_2AA1_451d_B9A6_CB7346385897

C6DF984C_37D4_4c32_B08A_4677F3E1D86D

59CAEB9E_3136_4c11_8874_F07A4DB12652

3、搜索映射對象

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

97905870_F59E_497b_B8E0_5BED8A0EED78

28D5457B_D914_4180_9EBB_8552E9D979A2

2CBECE63_9FF2_40b9_A497_21B522456EBE

3035C2A8_96D3_4c39_ABF3_3F3D905EEAF7
99E12CD0_7535_468e_A5C1_A52A037ACAC1

4、漏洞確認

項目運行起來,構造sql語句 得到mysql的版本5.7.27,驗證注入存在。

0F470E84_C82A_45cf_8DFE_25A06015E7D3

三、總結

以上就是Mybatis的sql注入審計的基本方法,我們沒有分析的幾個點也有問題,新手可以嘗試分析一下不同的注入點來實操一遍,相信會有更多的收獲。當我們再遇到類似問題時可以考慮:

1、Mybatis框架下審計SQL注入,重點關注在三個方面like,in和order by
2、xml方式編寫sql時,可以先篩選xml文件搜索$,逐個分析,要特別注意mybatis-generator的order by注入
3、Mybatis注解編寫sql時方法類似
4、java層面應該做好參數檢查,假定用戶輸入均為惡意輸入,防范潛在的攻擊

免費學習視頻歡迎關注云圖智聯:


Java幫幫學習群生態

Java幫幫學習群生態

總有一款能幫到你

Java學習群

Java學習群

與大牛一起交流

大數據學習群

大數據學習群

在數據中成長

九點編程學習群

九點編程學習群

深夜九點學編程

python學習群

python學習群

人工智能,爬蟲

測試學習群

測試學習群

感受測試的魅力

Java幫幫生態承諾

Java幫幫生態承諾

一直堅守,不負重望

初心
勤儉
誠信
正義
分享
友鏈交換:加幫主QQ2524138991 留言即可 24小時內答復  
業司
教育資訊
會員登錄
獲取驗證碼
登錄
登錄
我的資料
留言
回到頂部