ThinkPHP 是一個免費開源的,快速、簡單的面向對象的輕量級 PHP 開發框架,是為了敏捷 WEB 應用開發和簡化企業應用開發而誕生的。ThinkPHP 從誕生以來一直秉承簡潔實用的設計原則,在保持出色的性能和至簡的代碼的同時,也注重易用性。
Thinkphp 在使用緩存的時候是將數據 序列化 然后存進一個 php 文件中這就導致我們了我們在一些情況下可以直接 getshell
該漏洞形成最關鍵的一點是,需要使用框架時,有使用緩存,才能利用這個漏洞
我們這里使用緩存查看官網對這個緩存類的說明以及利用方法
本地按照官方給的文檔安裝成功后,根據官網給的緩存使用方法,新建一個方法,我們都清楚緩存一般是為了減少數據庫的開銷為設置的,所以緩存的數據一般也是從數據庫獲取到的為了模擬線上,我們這里先查數據庫數據在寫入緩存。
這里我們寫了一個add添加數據的方法
%2F%2F%0D%0A = //+回車
執行完以后查看方法緩存目錄
這里需要特別說的一點是 TP的緩存名字是不變的,所以我們在審計的時候不用怕緩存文件名猜不到的情況。
上面我們展示了漏洞利用方法,這里我們對這個漏洞進行分析
為了證明我們的邏輯是對的我們這里打印一下返回的數據
通過這個我們就可以知道了下面這個截圖的意思
實例化 \thinkp\cache\driver\ 文件里面的File類 并且調用set方法
緩存文件名稱的獲取方法
這個感覺沒什么可以說的,和上面的原理是一樣的,我們只演示攻擊的方法
通過上面的過程與分析我們可以清楚了解造成這個漏洞的主要原因就是換行與回車導致繞過了注釋。那么我們修復的方法就很簡單了只要刪除這些即可
修復方法:
public function set($name, $value, $expire = null)
方法$data = str_replace(PHP_EOL, '', $data);
如下圖