0x01 MyBatis XML映射器使用不當
Spring+Mybatis組件的開發方式是目前最常見的Java Web開發技術棧,在該技術棧中會在XML映射文件中編寫SQL語句,通過#$符號標注動態參數位置,而MyBatis會在運行的過程中通過預編譯綁定參數以實現查詢
在XML中編寫SQL語句存在一些場景容易出現SQL注入,根本原因是使用${}拼接符,MyBatis在解析該符號時,會直接拼接變量,導致攻擊者可以輸入惡意內容污染原有SQL語句。這部分的內容也是目前網上提到的最多的。
- 在where等語句中,誤用${},應當使用#{}。
- 在模糊查詢中,由於使用like #{}存在編譯錯誤,導致誤用${},應當使用concat('%',#{input}, '%')解決。
- 在in查詢中,由於#{ids}編譯錯誤,誤用${},應當使用foreach解決。
- 在order by中,由於${id}編譯錯誤,誤用${},應該在代碼中限制排序字段名,無法使用#{}解決。
0x02 MyBatis-Plus查詢封裝器Wapper使用不當
MyBatis-Plus 是一個 Mybatis 增強版工具,在 MyBatis 上擴充了其他功能沒有改變其基本功能,為了簡化開發提交效率而存在。
使用時只需要在編寫Mapper類時繼承MyBatis-Plus的BaseMapper類,即可獲得一些封裝好的CURD方法,而不需要在XML中編寫相關的SQL語句,比如save、remove、update等方法,這些方法的參數大多都支持傳入查詢條件過濾器wrapper。
Wrapper有四種,其結構關系見下圖。
主要類型為兩種,即查Query和改Update,改包括了增、刪、改。然后又根據列名匹配是否使用Lambda表達式而多了LambdaQuery和LambdaUpdate兩種Mapper。
在使用常規的QueryMapper和UpdateMapper時,會使用預編譯的方式綁定參數,但是部分場景注入風險。
比如在使用QueryMapper中使用orderByASC,如果參數可控會存在SQL注入,相似的函數還有having、apply等拼接語句函數,因此如果在代碼審計過程中關注到使用了MyBatis-Plus組件需要格外注意這些封裝查詢。