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