文件包含漏洞不能包含php,ThinkPHP5漏洞分析之文件包含
本系列文章將針對 ThinkPHP 的歷史漏洞進行分析,今后爆出的所有 ThinkPHP 漏洞分析,也將更新于 ThinkPHP-Vuln 項目上。本篇文章,將分析 ThinkPHP 中存在的 文件包含 漏洞。
漏洞概要
本次漏洞存在于 ThinkPHP 模板引擎中,在加載模版解析變量時存在變量覆蓋問題,而且程序沒有對數據進行很好的過濾,最終導致 文件包含漏洞 的產生。漏洞影響版本: 5.0.0<=ThinkPHP5<=5.0.18 、5.1.0<=ThinkPHP<=5.1.10。
漏洞環境
通過以下命令獲取測試環境代碼:composer create-project --prefer-dist topthink/think=5.0.18 tpdemo
將 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 文件,內容隨意(沒有這個模板文件的話,在渲染時程序會報錯),并將圖片馬 1.jpg 放至 public 目錄下(模擬上傳圖片操作)。接著訪問 http://localhost:8000/index/index/index?cacheFile=demo.php 鏈接,即可觸發 文件包含漏洞 。
漏洞分析
首先在官方發布的?5.0.19?版本更新說明中,發現其中提到該版本包含了一個安全更新。
我們可以查閱其?commit?記錄,發現其改進了模板引擎,其中存在危險函數 extract ,有可能引發變量覆蓋漏洞。接下來,我們直接跟進代碼一探究竟。
首先,用戶可控數據未經過濾,直接通過 Controller 類的 assign 方法進行模板變量賦值,并將可控數據存在 think\View 類的 data 屬性中。
接著,程序開始調用 fetch 方法加載模板輸出。這里如果我們沒有指定模板名稱,其會使用默認的文件作為模板,模板路徑類似 當前模塊/默認視圖目錄/當前控制器(小寫)/當前操作(小寫).html ,如果默認路徑模板不存在,程序就會報錯。
我們跟進到 Template 類的 fetch 方法,可以發現可控變量 $vars 賦值給 $this->data 并最終傳入 File 類的 read 方法。而 read 方法中在使用了 extract 函數后,直接包含了 $cacheFile 變量。這里就是漏洞發生的關鍵原因(可以通過 extract 函數,直接覆蓋 $cacheFile 變量,因為 extract 函數中的參數 $vars 可以由用戶控制)。
漏洞修復
官方的修復方法是:先將 $cacheFile 變量存儲在 $this->cacheFile 中,在使用 extract 函數后,最終 include 的變量是 $this->cacheFile ,這樣也就避免了 include 被覆蓋后的變量值。
攻擊總結
最后,再通過一張攻擊流程圖來回顧整個攻擊過程。
總結
以上是生活随笔為你收集整理的文件包含漏洞不能包含php,ThinkPHP5漏洞分析之文件包含的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网页实现人脸识别PHP,奇思妙想-用HT
- 下一篇: php对应哪个oracle版本,Orac