1. 程式人生 > >ThinkPHP5.0.10-3.2.3快取函式設計缺陷可導致Getshell

ThinkPHP5.0.10-3.2.3快取函式設計缺陷可導致Getshell

0x00 框架執行環境

ThinkPHP是一個免費開源的,快速、簡單的面向物件的輕量級PHP開發框架,是為了敏捷WEB應用開發和簡化企業應用開發而誕生的。ThinkPHP從誕生以來一直秉承簡潔實用的設計原則,在保持出色的效能和至簡的程式碼的同時,也注重易用性。
Thinkphp在使用快取的時候是將資料 序列化 然後存進一個php檔案中這就導致我們了我們在一些情況下可以直接getshell

0x01漏洞利用

該漏洞形成最關鍵的一點是
需要使用框架時,有使用快取,才能利用這個漏洞

我們這裡使用快取檢視官網對這個快取類的說明以及利用方法

本地按照官方給的文件安裝成功後,根據官網給的快取使用方法,新建一個方法,我們都清楚快取一般是為了減少資料庫的開銷為設定的,所以快取的資料一般也是從資料庫獲取到的
為了模擬線上,我們這裡先查資料庫資料在寫入快取。

這裡我們寫了一個
add新增資料的方法

%2F%2F%0D%0A = //+回車

執行完以後檢視方法快取目錄

這裡需要特別說的一點是
TP的快取名字是不變的,所以我們在審計的時候不用怕快取檔名猜不到的情況。

0x02漏洞分析

上面我們展示了漏洞利用方法,這裡我們對這個漏洞進行分析

為了證明我們的邏輯是對的我們這裡列印一下返回的資料

為了證明我們的邏輯是對的我們這裡列印一下返回的資料

通過這個我們就可以知道了下面這個截圖的意思

例項化
\thinkp\cache\driver\ 檔案裡面的
File類 並且呼叫
set
方法

快取檔名稱的獲取方法

 

 

Thinkphp3.2 快取函式設計缺陷

這個感覺沒什麼可以說的,和上面的原理是一樣的,我們只演示攻擊的方法

 

修復方案

通過上面的過程與分析我們可以清楚瞭解造成這個漏洞的主要原因就是換行與回車導致繞過了註釋。那麼我們修復的方法就很簡單了只要刪除這些即可
修復方法:
1,開啟檔案:thinkphp\library\think\cache\driver\File.php
2,找到:public function set($name, $value, $expire = null) 方法
3,新增:$data = str_replace(PHP_EOL, '', $data);