<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Mybatis 框架下 SQL 注入攻擊的 3 種方式,真是防不勝防!

          共 2563字,需瀏覽 6分鐘

           ·

          2021-10-01 08:19

          點(diǎn)擊“藍(lán)字”,關(guān)注,置頂公眾號(hào)

          每日技術(shù)干貨,第一時(shí)間送達(dá)!


          1

          前言

           

          SQL注入漏洞作為WEB安全的最常見的漏洞之一,在java中隨著預(yù)編譯與各種ORM框架的使用,注入問題也越來越少。新手代碼審計(jì)者往往對(duì)Java Web應(yīng)用的多個(gè)框架組合而心生畏懼,不知如何下手,希望通過Mybatis框架使用不當(dāng)導(dǎo)致的SQL注入問題為例,能夠拋磚引玉給新手一些思路。



          2

          Mybatis的SQL注入


           

          Mybatis的SQL語句可以基于注解的方式寫在類方法上面,更多的是以xml的方式寫到xml文件。Mybatis中SQL語句需要我們自己手動(dòng)編寫或者用generator自動(dòng)生成。編寫xml文件時(shí),MyBatis支持兩種參數(shù)符號(hào),一種是#,另一種是$。比如:



          <select id="queryAll"  resultMap="resultMap">
            SELECT * FROM NEWS WHERE ID = #{id}
          select
          >



          #使用預(yù)編譯,$使用拼接SQL。

          Mybatis框架下易產(chǎn)生SQL注入漏洞的情況主要分為以下三種:


          1、模糊查詢


          Select * from news where title like ‘%#{title}%’


          在這種情況下使用#程序會(huì)報(bào)錯(cuò),新手程序員就把#號(hào)改成了$,這樣如果java代碼層面沒有對(duì)用戶輸入的內(nèi)容做處理勢必會(huì)產(chǎn)生SQL注入漏洞。


          正確寫法:


          select * from news where tile like concat(‘%’,#{title}, ‘%’)



          2、in 之后的多個(gè)參數(shù)


          in之后多個(gè)id查詢時(shí)使用# 同樣會(huì)報(bào)錯(cuò),



          Select * from news where id in (#{ids})



          正確用法為使用foreach,而不是將#替換為$



          id in
          <foreach collection="ids" item="item" open="("separatosr="," close=")">
          #{ids}
          foreach
          >



          3、order by 之后


          這種場景應(yīng)當(dāng)在Java層面做映射,設(shè)置一個(gè)字段/表名數(shù)組,僅允許用戶傳入索引值。這樣保證傳入的字段或者表名都在白名單里面。需要注意的是在mybatis-generator自動(dòng)生成的SQL語句中,order by使用的也是$,而like和in沒有問題。歡迎關(guān)注我們,公號(hào)IT碼徒。


           


          3

          實(shí)戰(zhàn)思路


           

          我們使用一個(gè)開源的cms來分析,java sql注入問題適合使用反推,先搜索xml查找可能存在注入的漏洞點(diǎn)-->反推到DAO-->再到實(shí)現(xiàn)類-->再通過調(diào)用鏈找到前臺(tái)URL,找到利用點(diǎn),話不多說走起


          1、idea導(dǎo)入項(xiàng)目


          Idea首頁 點(diǎn)擊Get from Version Control,輸入https://gitee.com/mingSoft/MCMS.git

          下載完成,等待maven把項(xiàng)目下載完成



          2、搜索$關(guān)鍵字


          Ctrl+shift+F 調(diào)出Find in Path,篩選后綴xml,搜索$關(guān)鍵字



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



          繼續(xù)往下看到疑似order by 暫時(shí)擱置



          繼續(xù)往下看發(fā)現(xiàn)多個(gè)普通拼接,此點(diǎn)更容易利用,我們以此為例深入,只查找ids從前端哪里傳入



          3、搜索映射對(duì)象


          Mybatis 的select id對(duì)應(yīng)要映射的對(duì)象名,我們以getSearchCount為關(guān)鍵字搜索映射的對(duì)象



          搜到了IContentDao.java,IContentDaoimpl.java和McmsAction.java,分別對(duì)應(yīng)映射的對(duì)象,對(duì)象的實(shí)現(xiàn)類和前端controler,直接跳轉(zhuǎn)到controler類,歡迎關(guān)注我們,公號(hào)IT碼徒。



          發(fā)現(xiàn)只有categoryIds與目標(biāo)參數(shù)ids相似,需進(jìn)一步確認(rèn),返回到IContentDao.java按照標(biāo)準(zhǔn)流繼續(xù)反推



          找到ids為getSearchCount的最后一個(gè)參數(shù),alt+f7查看調(diào)用鏈



          調(diào)轉(zhuǎn)到ContentBizImpl,確認(rèn)前臺(tái)參數(shù)為categoryIds



          返回到McmsAction,參數(shù)由BasicUtil.getString接收



          跟進(jìn)BasicUtil.getString



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



          4、漏洞確認(rèn)


          項(xiàng)目運(yùn)行起來,構(gòu)造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,驗(yàn)證注入存在。





          4

          總結(jié)


           

          以上就是mybatis的sql注入審計(jì)的基本方法,我們沒有分析的幾個(gè)點(diǎn)也有問題,新手可以嘗試分析一下不同的注入點(diǎn)來實(shí)操一遍,相信會(huì)有更多的收獲。當(dāng)我們?cè)儆龅筋愃茊栴}時(shí)可以考慮:



          往期推薦








          List 中 remove() 方法移除元素的【坑】


          厲害了,用 IDEA 神器看源碼,效率賊高!

          MyBatis vs Hibernate,到底哪個(gè)性能更好?

          如何設(shè)計(jì)一個(gè)小而美的搶紅包系統(tǒng)?

          來看看Redis 分布式鎖的正確實(shí)現(xiàn)方式

          IntelliJ idea 高效使用教程,一勞永逸!

          Java 程序員必須掌握的 10 款開源工具!


          瀏覽 61
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产少又黄又爽的A片 | 色屁屁影院 | 哪里有免费的国产在线黄色电影 | 国产毛片精品一区二区色欲黄A片 | 肏屄社会福利在线看 |