ThinkPHP5 檔案包含
- 漏洞概要
- 初始配置
- 漏洞利用
- 漏洞分析
- 漏洞修復
- 攻擊總結
漏洞概要
- 本次漏洞存在于 ThinkPHP 模板引擎中,在加載模版決議變數時存在變數覆寫問題,而且程式沒有對資料進行很好的過濾,最終導致檔案包含漏洞的產生
- 漏洞影響版本: 5.0.0<=ThinkPHP<=5.0.21 、 5.1.3<=ThinkPHP5<=5.1.25
初始配置
- 獲取測驗環境代碼
composer create-project --prefer-dist topthink/think=5.0.18 tpH3rmesk1t

- 將
composer.json檔案的require欄位設定成如下
"require": {
"php": ">=5.6.0",
"topthink/framework": "5.0.18"
},
然后執行
composer update,并將application/index/controller/Index.php檔案代碼設定如下

<?php
namespace app\index\controller;
use think\Controller;
class Index extends Controller
{
public function index()
{
$this->assign(request()->get());
return $this->fetch(); // 當前模塊/默認視圖目錄/當前控制器(小寫)/當前操作(小寫).html
}
}
創建 application/index/view/index/index.html 檔案,內容隨意(沒有這個模板檔案的話,在渲染時程式會報錯)

漏洞利用
將圖片馬 demo.jpg 放至 public 目錄下(模擬上傳圖片操作),訪問
http://127.0.0.1/cms/public/index.php/index/index?cacheFile=demo.jpg

漏洞分析
首先,用戶可控資料未經過濾,直接通過
Controller類的assign方法進行模板變數賦值,并將可控資料存在think\View類的data屬性中

接著程式開始呼叫
fetch方法加載模板輸出,這里如果我們沒有指定模板名稱,其會使用默認的檔案作為模板,模板路徑位:當前模塊/默認視圖目錄/當前控制器(小寫)/當前操作(小寫).html,如果默認路徑模板不存在,程式就會報錯,跟進到thinkphp/library/think/View.php



我們跟進到
Template類的fetch方法,可以發現可控變數$vars賦值給$this->data并最終傳入File類的read方法,而read方法中在使用了extract函式后,直接包含了$cacheFile變數,這里就是漏洞發生的關鍵原因,因為extract函式中的引數$vars可以由用戶控制,可以通過extract函式,直接覆寫$cacheFile變數


完整的方法呼叫,從下往上

漏洞修復
官方的修復方法是:先將
$cacheFile變數存盤在$this->cacheFile中,在使用extract函式后,最終 include 的變數是$this->cacheFile,這樣也就避免了 include 被覆寫后的變數值

攻擊總結
參考Mochazz師傅的審計流程

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/294403.html
標籤:其他
上一篇:計算機網路-網路應用(上)
