File Inclusion衣洁,意思是文件包含(漏洞)墓捻,是指當(dāng)服務(wù)器開啟allow_url_include選項(xiàng)時(shí),就可以通過php的某些特性函數(shù)(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)程的文件)羽杰。
low服務(wù)器代碼
<php
//Thepagewewishtodisplay
$file=$_GET['page'];
>
思路:
沒做任何的過濾渡紫。
直接http://.../dvwa/vulnerabilities/fi/?page=/etc/passwd
medium服務(wù)器代碼
<php
//Thepagewewishtodisplay
$file=$_GET['page'];
//Inputvalidation
$file=str_replace(array("http://","https://"),"",$file);
$file=str_replace(array("../","..\""),"",$file);
>
medium增加了過濾的:str_replace函數(shù),對(duì)page參數(shù)進(jìn)行了一定的處理考赛,將”http:// ”惕澎、”https://”、 ” ../”颜骤、”..\”替換為空字符唧喉,即刪除。
str_replace函數(shù) 可以用雙寫繞過忍抽。
例如
http://可以用 hthttp://tp://繞過
../八孝、..\可以用絕對(duì)路徑也可以雙寫。
high服務(wù)器代碼
<php
//Thepagewewishtodisplay
$file=$_GET['page'];
//Inputvalidation
if(!fnmatch("file*",$file)&&$file!="include.php"){
//Thisisn'tthepagewewant!
echo"ERROR:Filenotfound!";
exit;
}
>
High級(jí)別的代碼使用了fnmatch函數(shù)檢查page參數(shù)鸠项,要求page參數(shù)的開頭必須是file干跛,服務(wù)器才會(huì)去包含相應(yīng)的文件。
High級(jí)別的代碼規(guī)定只能包含file開頭的文件锈锤,看似安全驯鳖,不幸的是我們依然可以利用file協(xié)議繞過防護(hù)策略闲询。file協(xié)議其實(shí)我們并不陌生久免,當(dāng)我們用瀏覽器打開一個(gè)本地文件時(shí),用的就是file協(xié)議
直接
http://.../dvwa/vulnerabilities/fi/?page=file:///etc/passwd
至于執(zhí)行任意命令扭弧,需要配合文件上傳漏洞利用阎姥。首先需要上傳一個(gè)內(nèi)容為php的文件,然后再利用file協(xié)議去包含上傳文件(需要知道上傳文件的絕對(duì)路徑)鸽捻,從而實(shí)現(xiàn)任意命令執(zhí)行呼巴。
Impossible服務(wù)器代碼
<php
//Thepagewewishtodisplay
$file=$_GET['page'];
//Onlyallowinclude.phporfile{1..3}.php
if($file!="include.php"&&$file!="file1.php"&&$file!="file2.php"&&$file!="file3.php"){
//Thisisn'tthepagewewant!
echo"ERROR:Filenotfound!";
exit;
}
>
可以看到,Impossible級(jí)別的代碼使用了白名單機(jī)制進(jìn)行防護(hù)御蒲,簡(jiǎn)單粗暴衣赶,page參數(shù)必須為“include.php”、“file1.php”厚满、“file2.php”府瞄、“file3.php”之一,徹底杜絕了文件包含漏洞碘箍。