?

Jun 01 2018

ThinkPHP3.x/5.x框架任意文件包含

首頁 » 代碼審計 » ThinkPHP3.x/5.x框架任意文件包含   

ThinkPHP3.x/5.x框架任意文件包含


ThinkPHP是一個快速、兼容而且簡單的輕量級國產PHP開發框架,誕生于2006年初,原名FCS,2007年元旦正式更名為ThinkPHP,遵循Apache2開源協議發布,從Struts結構移植過來并做了改進和完善,同時也借鑒了國外很多優秀的框架和模式,使用面向對象的開發結構和MVC模式,融合了Struts的思想和TagLib(標簽庫)、RoR的ORM映射和ActiveRecord模式。

漏洞簡述

ThinkPHP在加載模版解析變量時存在變量覆蓋的問題,且沒有對 $cacheFile 進行相應的消毒處理,導致模板文件的路徑可以被覆蓋,從而導致任意文件包含漏洞的發生。

環境準備

下載thinkphp框架在 “thinkphp\library\think\Controller.php” 文件中寫入如下代碼:


1.jpg


在 “application\index\view\index” 目錄下建立一個 index.html 文件,不建立會出現 模板文件不存在 錯誤。

至于其他配置數據庫連接文件以及thinkphp框架結構,可參考文章:代碼審計 | ThinkPHP5.0.x框架SQL注?

漏洞分析

攻擊者可以通過POST方式訪問鏈接:

http://192.168.1.8/thinkphp/public/index.php/index/index/index ,

POST的數據為:cacheFile=../phpinfo.php ,這個 cacheFile 變量就是可以被攻擊者覆蓋的變量。

2.jpg



程序在一開始會調用 “thinkphp\library\think\Controller.php” 文件中的 assign 方法,并傳入 POST 數組數據, assign 方法代碼如下:

3.jpg


assign 方法又調用了視圖類中的 assign 方法, assign 方法在 “thinkphp\library\think\View.php” 文件中。可以看到該方法用 array_merge 方法將 POST 數組數據合并到 $this->data 中,代碼如下:


4.jpg


我們再來看 fetch 方法,該方法用于輸出模板內容,代碼定義在 “thinkphp\library\think\Controller.php”文件中,該方法同樣調用的是視圖類中的 fetch 方法,代碼如下:

5.jpg

查看 “thinkphp\library\think\View.php” 文件中的 fetch 方法,這里注代碼$this->engine->$method($template, $vars, $config);

6.jpg



在默認情況下 $method 的值為 fetch ,也就是說調用了視圖引擎中的 fetch 方法,該方法在thinkphp\library\think\view\driver\Think.php” 文件中,代碼如下:

7.jpg



視圖引擎的 fetch 方法又調用了模板類的fetch 方法,繼續跟進 。我們注意到 “thinkphp\library\think\Template.php” 文件中語句:$this->storage->read($cacheFile, $this->data); 這是用于讀取編譯存儲,此時 $cacheFile 的值類似于 runtime\temp\md5(×××).php

8.jpg



我們跟進該 read 方法,在“thinkphp\library\think\template\driver\File.php” 文件中,我們看到程序使用 extract 方法,并用了 EXTR_OVERWRITE 參數,該參數的作用是:如果有沖突,則覆蓋已有的變量。 extract 方法將 $vars 數組中的數據元素注冊成變量,而 $vars 數組又包含了 POST 數組數據,這也就是導致變量覆蓋的原因。然后程序在最后包含了 $cacheFile 文件,最終導致了任意文件包含。具體代碼如下:

9.jpg

如果目標站點開啟了 allow_url_include ,攻擊者甚至可以執行任意代碼,攻擊方法如下:

10.jpg








如果您喜歡本博客,歡迎點擊圖片定訂閱到郵箱填寫您的郵件地址,訂閱我們的精彩內容:

正文部分到此結束

文章標簽: thinkphp漏洞 thinkphp滲透

版權聲明:若無特殊注明,本文皆為( mOon )原創,轉載請保留文章出處。

也許喜歡: «ThinkPHP3.2.x框架SQL注入 | ThinkPHP 框架SQL注入技術分析»

你腫么看?

你還可以輸入 250/250 個字

? 微笑 大笑 拽 大哭 親親 流汗 噴血 奸笑 囧 不爽 暈 示愛 害羞 吃驚 驚嘆 愛你 嚇死了 呵呵

評論信息框

這篇文章還沒有收到評論,趕緊來搶沙發吧~

?
?
河北11选5开奖