您好,登錄后才能下訂單哦!
這篇文章主要介紹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
被覆蓋后的變量值。
最后,再通過一張攻擊流程圖來回顧整個攻擊過程。
以上是“ThinkPHP中存在的文件包含漏洞有哪些”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。