Kate Li (Taiwan)的部落格

首頁

thinkphp3.x/5.x訂單

作者 budney 時間 2020-02-26
all

ThinkPHP是一個免費開源的,快速、簡單的面向對像的羽量級PHP開發框架,創立於2006年初,遵循Apache2開源協定發佈,是為了敏捷WEB應用開發和簡化企業應用開發而誕生的。ThinkPHP從誕生以來一直秉承簡潔實用的設計原則,在保持出色的效能和至簡的程式碼的同時,也注重易用性。並且擁有眾多的原創功能和特性,在社區團隊的積極參與下,在易用性、擴展性和效能方面不斷優化和改進,已經成長為國內最領先和最具影響力的WEB應用開發框架,眾多的典型案例確保可以穩定用於商業以及門戶級的開發。

ThinkPHP在處理order by排序時,當排序參數可控且為關聯數組(key-value)時,由於框架未對數組中key值作安全過濾處理,攻擊者可利用key構造SQL語句進行注入,該漏洞影響ThinkPHP 3.2.3、5.1.22及以下版本。

ThinkPHP3.2.3漏洞程式碼(/Library/Think/Db/Driver.class.php):

ThinkPHP 5.1.22漏洞程式碼(framework/library/think/db/Query.php):

從上面漏洞程式碼可以看出,當$field參數為關聯數組(key-value)時,key值拼接到返回值中,SQL語句最終繞過了框架安全過濾得以執行。

ThinkPHP 3.2.3

漏洞demo

訪問如下URL即可進行漏洞利用:

http://127.0.0.1/ThinkPHP/?order[updatexml(1,concat(0x3a,user()),1)]=1

ThinkPHP 5.1.22

漏洞demo

http://127.0.0.1/tp5/public/index/index/test/index?order[id`|updatexml(1,concat(0x3a,user()),1)%23]=1

訪問如下URL即可進行漏洞利用。

動態調試可以發現,經框架處理後返回的SQL語句內容如下,繼而帶入SQL査詢語句導致注入漏洞的產生。

漏洞修復

5.X版本陞級到最新5.1.23版本

3.X版本陞級到最新版本

2018.8.10    提交github issues

2018.8.16    官方確認漏洞,在下個版本改進

2018.8.23    發佈的新版本5.1.23中修復了該漏洞

2018.8.28   3.2.3版本發佈補丁修復該漏洞