php代碼審計(jì)之ThinkPHP5的文件包含漏洞詳解
漏洞影響范圍
加載模版解析變量時(shí)存在變量覆蓋問(wèn)題,導(dǎo)致文件包含漏洞的產(chǎn)生 漏洞影響版本:5.0.0<=ThinkPHP5<=5.0.18 、5.1.0<=ThinkPHP<=5.1.10
我復(fù)現(xiàn)用的是5.1.15
(PS:這里附上thinkphp5.1 手冊(cè)本站下載地址:http://www.fzitv.net/books/729512.html)
環(huán)境配置要將將 application/index/controller/Index.php 文件代碼設(shè)置如下:
<?php
namespace app\index\controller;
use think\Controller;
class Index extends Controller
{
?
? public function index()
? {
?
? ? ? $this->assign(request()->get());
? ? ? return $this->fetch(); // 當(dāng)前模塊/默認(rèn)視圖目錄/當(dāng)前控制器(小寫(xiě))/當(dāng)前操作(小寫(xiě)).html
? }
}創(chuàng)建 application/index/view/index/index.html 文件,內(nèi)容隨意(沒(méi)有這個(gè)模板文件的話(huà),在渲染時(shí)程序會(huì)報(bào)錯(cuò))
漏洞分析
先跟進(jìn)assign方法

再跟進(jìn)

array_merge() 函數(shù)用于把一個(gè)或多個(gè)數(shù)組合并為一個(gè)數(shù)組。
只是賦值操作,跟進(jìn)下面的fetch

繼續(xù)跟進(jìn)

用于$this引用當(dāng)前對(duì)象。用于self引用當(dāng)前類(lèi)。換句話(huà)說(shuō), $this->member用于非靜態(tài)成員,self::$member用于靜態(tài)成員。
范圍解析運(yùn)算符(也稱(chēng)為 Paamayim Nekudotayim)或更簡(jiǎn)單的術(shù)語(yǔ)是雙冒號(hào),是一個(gè)允許訪(fǎng)問(wèn)類(lèi)的 靜態(tài)、 常量和重寫(xiě)屬性或方法的標(biāo)記。
fetch 前面的方法 主要是加載模板輸出。這里的method值可以追溯到view\driver\Think.php 視圖引擎

跟入84行fetch進(jìn)入think\templae.php

第200行在讀取的時(shí)候采用了一個(gè)read的方法。繼續(xù)跟進(jìn)read,進(jìn)入template\driver\File.php

危險(xiǎn)危險(xiǎn)危險(xiǎn)!!這里調(diào)用了一個(gè)extract函數(shù),可控變量 $vars 賦值給 $this->data 并最終傳入 File 類(lèi)的 read 方法。而 read 方法中在使用了 extract 函數(shù)后,直接包含了 $cacheFile 變量。這里就是漏洞發(fā)生的關(guān)鍵原因(可以通過(guò) extract 函數(shù),直接覆蓋 $cacheFile 變量,因?yàn)?extract 函數(shù)中的參數(shù) $vars 可以由用戶(hù)控制)。

這里extract 該函數(shù)使用數(shù)組鍵名作為變量名, EXTR_OVERWRITE 變量存在則覆蓋
EXTRACT() 函數(shù)用于返回日期/時(shí)間的單獨(dú)部分,比如年、月、日、小時(shí)、分鐘等等。

POC
http://localhost:8000/index/index/index?cacheFile=shell.jpg
圖片馬 shell.jpg 放至 public 目錄下(模擬上傳圖片操作)。
相關(guān)文章
php實(shí)現(xiàn)文件與16進(jìn)制相互轉(zhuǎn)換的方法示例
這篇文章主要介紹了php實(shí)現(xiàn)文件與16進(jìn)制相互轉(zhuǎn)換的方法,文中給出了詳細(xì)的示例代碼,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-02-02
thinkphp備份數(shù)據(jù)庫(kù)的方法分享
這篇文章主要介紹了thinkphp備份數(shù)據(jù)庫(kù)的方法分享,非常的簡(jiǎn)單實(shí)用,推薦給有需要的小伙伴們2015-01-01
7個(gè)鮮為人知卻非常實(shí)用的PHP函數(shù)
這篇文章主要介紹了7個(gè)鮮為人知卻非常實(shí)用的PHP函數(shù),本文總結(jié)了如highlight_string()、str_word_count()、levenshtein()、get_defined_vars()、escapeshellcmd()等非常有用但不常見(jiàn)的函數(shù),需要的朋友可以參考下2015-07-07
隊(duì)列在編程中的實(shí)際應(yīng)用(php)
隊(duì)列(Queue)是運(yùn)算受到限制的一種線(xiàn)性表。只允許在表的一端進(jìn)行插入,而在另一端進(jìn)行刪除元素的線(xiàn)性表。隊(duì)尾(rear)是允許插入的一端。隊(duì)頭(front)是允許刪除的一端。空隊(duì)列是不含元素的空表。2010-09-09
PHP使用Pthread實(shí)現(xiàn)的多線(xiàn)程操作實(shí)例
這篇文章主要介紹了PHP使用Pthread實(shí)現(xiàn)的多線(xiàn)程操作的方法,以完整實(shí)例形式分析了php多線(xiàn)程的創(chuàng)建及使用相關(guān)技巧,需要的朋友可以參考下2015-11-11
php+mysqli批量查詢(xún)多張表數(shù)據(jù)的方法
這篇文章主要介紹了php+mysqli批量查詢(xún)多張表數(shù)據(jù)的方法,涉及multi_query、store_result及more_results等函數(shù)的使用技巧,需要的朋友可以參考下2015-01-01
php文件上傳簡(jiǎn)單實(shí)現(xiàn)方法
這篇文章主要介紹了php文件上傳簡(jiǎn)單實(shí)現(xiàn)方法,以一個(gè)完整實(shí)例形式分析了文件上傳的過(guò)程,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-01-01
CodeIgniter生成網(wǎng)站sitemap地圖的方法
用CodeIgniter只需要三步就可以生成網(wǎng)站sitemap地圖,方法很簡(jiǎn)單,大家可以參考一下2013-11-11

