您好,登錄后才能下訂單哦!
MyBatis遠程代碼執行漏洞CVE-2020-26945的實例分析,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。
漏洞名稱 | MyBatis 遠程代碼執行漏洞CVE-2020-26945 |
威脅等級 | 高危 |
影響范圍 | MyBatis < 3.5.6 |
漏洞類型 | 遠程代碼執行 |
利用難度 | 困難 |
MyBatis 本是Apache的一個開源項目iBatis, 2010年這個項目由Apache Software Foundation 遷移到了Google Code,并且改名為MyBatis 。MyBatis 是一款優秀的持久層框架,它支持定制化 SQL、存儲過程以及高級映射。MyBatis 避免了幾乎所有的 JDBC 代碼和手動設置參數以及獲取結果集。MyBatis 可以使用簡單的 XML 或注解來配置和映射原生信息,將接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java對象)映射成數據庫中的記錄。
2020年10月6日,MyBatis官方發布了MyBatis 3.5.6版本,修復了一個遠程代碼執行漏洞,該漏洞編號為CVE-2020-26945。 在滿足以下三個條件的時候,攻擊者可以觸發遠程代碼執行:
用戶啟用了內置的二級緩存
用戶未設置JEP-290過濾器
攻擊者找到了一種修改私有Map字段條目的方法,即修改org.apache.ibatis.cache.impl.PerpetualCache.cache有效的緩存密鑰
官方發布修復此漏洞的方法是添加了反序列化檢查,通過補丁比較發現漏洞點:
漏洞點出現在SerializedCache類的私有方法deserialize()中,全局搜索此類,發現該類公有的getObject()方法調用了該私有方法:
在該方法設置斷點,跟進發現進入了ScheduledCache類的getObject()方法:
這里可以看到getObject()方法調用了clearWhenStale()方法,是對cache是否過期進行判斷,并不是任意序列化數據均可以進行反序列化:
getObject()這里的限制主要有兩處,一是需要在cache的過期時間內,二是覆蓋的value要和key相對應,也就是前面漏洞描述提到的漏洞利用須滿足的第三個條件。繼續跟進發現序列化數據就是Cache.value,取出value值是通過<key-value>的對應關系,這是在MyBatis默認二級緩存類PerpetualCache實現的(用戶可以自定義二級緩存,在mapper中啟用即可,前提是實現規定的接口):
作為攻擊者,需要將已有key對應的value覆蓋為自己的惡意序列化數據,在cache過期時間內,如果再次執行相同的查詢訪問操作,惡意數據就會被作為已有key的對應value被反序列化,從而形成MyBatis所在服務器上的RCE。
攻擊者可以造成遠程代碼執行:
目前受影響的MyBatis版本:
Mybatis < 3.5.6
目前廠商已發布升級補丁以修復漏洞,請受影響用戶盡快進行升級加固。補丁獲取鏈接:
https://github.com/mybatis/mybatis-3
看完上述內容,你們掌握MyBatis遠程代碼執行漏洞CVE-2020-26945的實例分析的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。