漏洞描述:
ThinkPHP在加載模版解析變量時存在變量覆蓋的問題,且沒有對 $cacheFile 進行相應的消毒處理,導致模板文件的路徑可以被覆蓋,從而導致任意文件包含漏洞的發生。
主要還是變量覆蓋的問題。
漏洞范圍:
漏洞影響版本: 5.0.0<=ThinkPHP5<=5.0.18 、5.1.0<=ThinkPHP<=5.1.10
本地復現環境:
tp5.0.15 php version :7.0.12
<?php namespace app\index\controller; use \think\Controller; class Index extends Controller { public function index() { $this->assign($this->request->get()); return $this->fetch("index"); //當前的模塊/view目錄/當前控制器/當前操作 這里我定義了一個index模塊 } }
assign方法 進行了模板變量賦值 ,把可控數據存在\think\View
主要問題出現在fetch 這里
細跟一下fetch
fetch 前面的方法 主要是加載模板輸出
這里的 $method 的值為fetch 可以在view\driver\Think.php 視圖引擎
這里要跟到think\templae.php
在讀取的時候采用了一個read的方法。
然后我們去跟read ,
關鍵的部分:
這里extract 該函數使用數組鍵名作為變量名, EXTR_OVERWRITE 變量存在則覆蓋
原本cacheFIle的值:
E:\phpstudy\PHPTutorial\WWW\tp5.0.15\runtime\temp\cb64592f1fa49f590673c9beddff4365.php
被覆蓋成 echod.txt
* @param array $vars 模板輸出變量
我們輸入的cacheFile=echod.txt
通過extract 該函數使 數組鍵名作為變量名
變成$cacheFile=echod.txt
最后的inclde $cacheFile; 觸發 任意文件包含漏洞。
這個洞在thinkCMF 后台的一個upload處可以復現。
如果,allow_url_include 開啟,可利用此處 執行任意代碼