php代碼審計之ThinkPHP5的文件包含漏洞詳解
加載模版解析變量時存在變量覆蓋問題,導致文件包含漏洞的產(chǎn)生 漏洞影響版本:5.0.0<=ThinkPHP5<=5.0.18 、5.1.0<=ThinkPHP<=5.1.10
我復現(xiàn)用的是5.1.15
(PS:這里附上thinkphp5.1 手冊本站下載地址:https://www.jb51.net/books/729512.html)
環(huán)境配置要將將 application/index/controller/Index.php 文件代碼設置如下:
<?phpnamespace app\index\controller;use think\Controller;class Index extends Controller{? ? public function index() ? {? ? ? ? $this->assign(request()->get()); ? ? ? return $this->fetch(); // 當前模塊/默認視圖目錄/當前控制器(小寫)/當前操作(小寫).html ? }}創(chuàng)建 application/index/view/index/index.html 文件,內容隨意(沒有這個模板文件的話,在渲染時程序會報錯)
漏洞分析先跟進assign方法
再跟進
array_merge() 函數(shù)用于把一個或多個數(shù)組合并為一個數(shù)組。
只是賦值操作,跟進下面的fetch
繼續(xù)跟進
用于$this引用當前對象。用于self引用當前類。換句話說, $this->member用于非靜態(tài)成員,self::$member用于靜態(tài)成員。
范圍解析運算符(也稱為 Paamayim Nekudotayim)或更簡單的術語是雙冒號,是一個允許訪問類的 靜態(tài)、 常量和重寫屬性或方法的標記。
fetch 前面的方法 主要是加載模板輸出。這里的method值可以追溯到view\driver\Think.php 視圖引擎
跟入84行fetch進入think\templae.php
第200行在讀取的時候采用了一個read的方法。繼續(xù)跟進read,進入template\driver\File.php
危險危險危險!!這里調用了一個extract函數(shù),可控變量 $vars 賦值給 $this->data 并最終傳入 File 類的 read 方法。而 read 方法中在使用了 extract 函數(shù)后,直接包含了 $cacheFile 變量。這里就是漏洞發(fā)生的關鍵原因(可以通過 extract 函數(shù),直接覆蓋 $cacheFile 變量,因為 extract 函數(shù)中的參數(shù) $vars 可以由用戶控制)。
這里extract 該函數(shù)使用數(shù)組鍵名作為變量名, EXTR_OVERWRITE 變量存在則覆蓋
EXTRACT() 函數(shù)用于返回日期/時間的單獨部分,比如年、月、日、小時、分鐘等等。
圖片馬 shell.jpg 放至 public 目錄下(模擬上傳圖片操作)。
相關文章:
