PHP文件包含漏洞的形成、利用技巧及防范進(jìn)行了
2021-10-18
摘要:本文對(duì)PHP文件包含漏洞的形成、利用技巧及防范進(jìn)行了詳細(xì)分析,并通過一個(gè)真實(shí)案例演示了如何利用PHP文件包含漏洞對(duì)目標(biāo)網(wǎng)站進(jìn)行滲透測(cè)試,最終成功獲取到網(wǎng)站的WebShell。
本文詳細(xì)分析了含有漏洞的PHP文件的形成、利用技術(shù)和防范,并通過一個(gè)真實(shí)案例演示了如何利用含有漏洞的PHP文件對(duì)目標(biāo)網(wǎng)站進(jìn)行滲透測(cè)試,最終成功獲取該網(wǎng)站。
PHP是一種非常流行的Web開發(fā)語言,網(wǎng)上很多Web應(yīng)用都是用PHP開發(fā)的。在使用PHP開發(fā)的Web應(yīng)用中,包含漏洞的PHP文件是一個(gè)常見的漏洞,利用PHP文件包含漏洞入侵網(wǎng)站也是一種主流的攻擊方式。
PHP文件包含漏洞介紹
首先介紹一下什么是包含漏洞的文件。嚴(yán)格來說,文件包含漏洞是一種“代碼注入”。其原理是注入用戶可以控制的腳本或代碼,讓服務(wù)器執(zhí)行?!按a注入”的典型代表是文件包含。文件包含漏洞可能出現(xiàn)在JSP、PHP、ASP等語言中,原理是一樣的。本文僅介紹PHP文件包含漏洞。
為了成功利用文件包含漏洞進(jìn)行攻擊,需要滿足以下兩個(gè)條件:
1.Web應(yīng)用采用include()等文件包含函數(shù)通過動(dòng)態(tài)變量的方式引入需要包含的文件
2.用戶能夠控制該動(dòng)態(tài)變量
在 PHP 中,有四個(gè)用于包含文件的函數(shù)。當(dāng)這些函數(shù)用于包含文件時(shí),將執(zhí)行文件中包含的 PHP 代碼。它們之間的區(qū)別解釋如下:
():當(dāng)使用該函數(shù)包含一個(gè)文件時(shí),只有在執(zhí)行到()函數(shù)的代碼時(shí)才會(huì)包含該文件。當(dāng)發(fā)生錯(cuò)誤時(shí),只會(huì)給出警告,并繼續(xù)執(zhí)行。
():功能與()相同,不同之處在于重復(fù)調(diào)用同一個(gè)文件時(shí),程序只調(diào)用一次。
():1.()和()的區(qū)別在于,如果()的執(zhí)行發(fā)生錯(cuò)誤,函數(shù)會(huì)輸出錯(cuò)誤信息并終止腳本。2. 當(dāng)使用()函數(shù)包含一個(gè)文件時(shí),程序一執(zhí)行就會(huì)立即調(diào)用該文件,只有在程序執(zhí)行到該函數(shù)時(shí)才會(huì)調(diào)用()。
():它的功能和()一樣,不同的是在重復(fù)調(diào)用同一個(gè)文件時(shí),程序只調(diào)用一次。
現(xiàn)在看一個(gè)包含代碼的簡(jiǎn)單文件,如下面的圖 1 所示。
圖1
從上面的代碼可以看出,得到變量$的值后,直接帶入()函數(shù)中,不做任何處理。存在一個(gè)包含漏洞的文件,我們可以利用這個(gè)漏洞查看系統(tǒng)中的任何文件。
讓我們實(shí)際測(cè)試一下。首先將PHP頁面上傳到Web服務(wù)器,讓它包含一個(gè)普通的txt文件。操作結(jié)果如下圖2所示。
圖2
然后我們把php代碼插入到txt文本中,看看結(jié)果?插入如下圖 3 所示的代碼。
圖 3
再次訪問,結(jié)果如下圖4所示。
圖 4
從上圖可以看出,文中的PHP代碼執(zhí)行成功。
利用該漏洞,我們可以查看系統(tǒng)中的任意文件,例如常用的“/etc/”文件,如圖5所示。
圖 5
PHP文件包含漏洞分為本地文件包含漏洞(LFI)和遠(yuǎn)程文件包含漏洞(RFI)??梢源蜷_和包含本地文件的漏洞稱為本地文件包含漏洞。使用本地文件包含漏洞,可以查看系統(tǒng)中任意文件的內(nèi)容,也可以在有條件的情況下執(zhí)行命令。這在下面的漏洞利用技術(shù)部分中有詳細(xì)描述。
如果php.ini 的配置選項(xiàng)為ON,則文件包含功能可以加載遠(yuǎn)程文件。這種漏洞稱為遠(yuǎn)程文件包含漏洞。使用遠(yuǎn)程文件包含漏洞,可以直接執(zhí)行任意命令。在實(shí)際滲透攻擊過程中,攻擊者可以在自己的Web服務(wù)器上放置一個(gè)可執(zhí)行的惡意文件,通過目標(biāo)網(wǎng)站中包含漏洞的遠(yuǎn)程文件加載該文件php代碼執(zhí)行漏洞,從而達(dá)到執(zhí)行任意命令的目的。
文件包含漏洞利用技術(shù)
遠(yuǎn)程文件包含漏洞之所以能夠執(zhí)行命令,是因?yàn)楣粽呖梢宰远x包含文件的內(nèi)容。因此,如果本地文件包含漏洞,如果要執(zhí)行命令,還需要找到攻擊者可以控制內(nèi)容的本地文件。
目前常用的技術(shù)有以下幾種:
包含用戶上傳的文件。這很容易理解,也是最簡(jiǎn)單的方法。如果用戶上傳的文件內(nèi)容包含PHP代碼,這些代碼會(huì)在被文件函數(shù)加載后執(zhí)行。但是,攻擊的成功取決于上傳功能的設(shè)計(jì)。例如,您需要知道上傳文件存儲(chǔ)的物理路徑,還需要對(duì)上傳文件具有執(zhí)行權(quán)限。
包含偽協(xié)議,例如 data:// 或 php://。這需要目標(biāo)服務(wù)器支持,并且需要設(shè)置為ON。PHP5.2.0之后的版本,支持data:偽協(xié)議,方便代碼執(zhí)行。
包含文件。這部分要求攻擊者能夠控制某些文件的內(nèi)容。PHP默認(rèn)生成的文件一般存放在/tmp目錄下。
包含日志文件。例如,Web 服務(wù)器的訪問日志文件是一種常用技術(shù)。因?yàn)閹缀跛械木W(wǎng)站都會(huì)記錄用戶的訪問訪問日志。因此,攻擊者可以通過文件包含漏洞將PHP代碼插入到Web日志中,并執(zhí)行Web日志中包含的PHP代碼。在以下案例中,該技術(shù)用于成功獲取目標(biāo)網(wǎng)站。但需要注意的是,如果網(wǎng)站訪問量很大,日志文件可能會(huì)非常大。這時(shí)候如果包含這么大的文件,PHP進(jìn)程可能會(huì)卡住。一般的網(wǎng)站通常每天都會(huì)生成一個(gè)新的日志文件,所以在凌晨攻擊成功相對(duì)容易。
包含 /proc/self/ 文件。這也是一種通用技術(shù),因?yàn)樗恍枰聹y(cè)包含文件的路徑,用戶也可以控制其內(nèi)容。常見的方法是將PHP代碼注入U(xiǎn)ser-來完成攻擊。
使用PHP文件滲透存在漏洞的網(wǎng)站案例
上面我們?cè)敿?xì)介紹了PHP文件包含漏洞的形成和測(cè)試。下面我們通過一個(gè)真實(shí)案例來說明如何利用PHP文件包含漏洞來滲透目標(biāo)網(wǎng)站。
目標(biāo)網(wǎng)站:中國(guó)電信業(yè)務(wù)系統(tǒng)
目的:獲取目標(biāo)網(wǎng)站的信息
詳細(xì)的滲透過程如下:
1. 發(fā)現(xiàn)漏洞
我們先打開一個(gè)目標(biāo)網(wǎng)站的網(wǎng)址看一下,如下圖:
URL:http://XXX.vnet.mobi/index.php?path=jcb/zt/gfsdtjqg/index.html
注意path=后面的內(nèi)容。通過這個(gè)URL,可以發(fā)現(xiàn).php調(diào)用了文件函數(shù),將網(wǎng)站目錄下的文件包含進(jìn)來,顯示給用戶。但目前我們不確定這個(gè) URL 是否存在文件包含漏洞。讓我們手動(dòng)測(cè)試是否存在文件包含漏洞。因?yàn)榫W(wǎng)站有一個(gè).php的測(cè)試頁面,通過這個(gè)頁面我們可以得到很多關(guān)于目標(biāo)網(wǎng)站的有用信息。不用fuzz就可以得到web目錄的絕對(duì)路徑,所以這里可以直接構(gòu)造已知文件的路徑,讓它包含php代碼執(zhí)行漏洞,快速確認(rèn)是否存在文件包含漏洞。
我們通過包含已知文件“/etc/”文件來確認(rèn)上述 URL 文件是否包含漏洞。
圖 6
從上面返回的結(jié)果可以確定該網(wǎng)站存在包含漏洞的文件。下面我們來演示一下如何利用這個(gè)漏洞進(jìn)行滲透測(cè)試。
2. 漏洞利用
通過以上測(cè)試,我們可以確定該網(wǎng)站存在文件包含漏洞。那么問題來了,如何利用這個(gè)漏洞來達(dá)到我們的目的呢?一種思路是將后門代碼插入到網(wǎng)站的web日志文件中,利用目標(biāo)網(wǎng)站的文件包含漏洞來包含這個(gè)日志文件。這時(shí)候web日志中的后門代碼會(huì)作為PHP代碼執(zhí)行,這樣我們就可以得到一個(gè)執(zhí)行后續(xù)攻擊。但此時(shí),我們面臨著一個(gè)問題。我們需要知道Web日志的存儲(chǔ)路徑,否則無法達(dá)到目的。通常web日志存儲(chǔ)路徑由web服務(wù)器的配置文件指定。以上獲取的信息可用于判斷目標(biāo)網(wǎng)站是否使用該服務(wù)器。所以,我們可以先通過包含web服務(wù)器配置文件(.conf)來獲取web日志存儲(chǔ)路徑。操作如下圖7所示。
圖 7
3.獲取
上面,我們通過Web服務(wù)器配置文件(.conf)獲取到了Web訪問日志(/opt//logs/.log)的存在路徑,但是由于網(wǎng)站的日志文件很大,訪問程序會(huì)卡在這個(gè)時(shí)候,所以我們選擇在清晨再次進(jìn)攻。因?yàn)橐话愕木W(wǎng)站每天都會(huì)生成一個(gè)訪問日志文件,所以早上的日志文件很小,很容易成功。下面的圖 8 顯示了如何將后門代碼插入到 Web 訪問日志中,如下所示。
圖 8
最終,我們成功獲取了目標(biāo)網(wǎng)站,如圖9所示。
圖9
PHP 文件包含漏洞預(yù)防
這部分主要從代碼層和Web服務(wù)器的安全配置兩個(gè)方面來講解PHP文件包含漏洞的防范。首先,從代碼層面來說,在開發(fā)過程中要盡量避免動(dòng)態(tài)變量,尤其是那些用戶可以控制的。一個(gè)保險(xiǎn)的方法是使用“白名單”的方式將允許被包含的文件列出,只允許白名單中的文件被包含,這樣就可以避免任何文件被包含的風(fēng)險(xiǎn)。您可以參考下面圖 10 所示的代碼實(shí)現(xiàn)。.
圖10
另一種方法是在黑名單中定義漏洞利用過程中包含一些特殊字符的文件,并對(duì)傳入的參數(shù)進(jìn)行過濾,但有時(shí)會(huì)因?yàn)檫^濾不完整而被有經(jīng)驗(yàn)的攻擊者繞過。
在web服務(wù)器安全配置方面,可以通過設(shè)置php.ini中的值來限制特定目錄下允許包含的文件,可以有效避免利用文件包含漏洞的攻擊。需要注意的是,值是目錄的前綴,所以假設(shè)設(shè)置了以下值:=/var/www /test,那么下面的目錄其實(shí)都在允許的范圍內(nèi)。
/var/www/test
/var/www/test123
/var/www/testabc
如果要限制指定目錄,需要在末尾加上“/”,需要特別注意。
open_basedir=/var/www/test/
如果有多個(gè)目錄,下面的目錄用分號(hào)隔開,下面用冒號(hào)隔開。
總結(jié)
以上,我們通過文字和代碼詳細(xì)分析了含有漏洞的PHP文件的形成、利用技巧和防范,并結(jié)合一個(gè)真實(shí)案例講解了如何利用含有漏洞的PHP文件對(duì)目標(biāo)網(wǎng)站進(jìn)行滲透測(cè)試,最終獲得許可。通過這些內(nèi)容,相信讀者對(duì)PHP文件包含漏洞有了深入的了解。其實(shí),只要了解漏洞的原理,對(duì)漏洞有深入的了解,加上安全意識(shí),徹底解決包含漏洞的PHP文件并不難。