php 偽協議

來源:互聯網
上載者:User

標籤:filter   研究   mode   網址   split()   內容   target   one   用法   

最近php偽協議的各種神奇妙用好像突然又常常提到了,php中支援的偽協議有下面這麼多

123456789101112 file:// — 訪問本地檔案系統http:// — 訪問 HTTP(s) 網址ftp:// — 訪問 FTP(s) URLsphp:// — 訪問各個輸入/輸出流(I/O streams)zlib:// — 壓縮流data:// — 資料(RFC 2397)glob:// — 尋找匹配的檔案路徑模式phar:// — PHP 歸檔ssh2:// — Secure Shell 2rar:// — RARogg:// — 音頻流expect:// — 處理互動流

 

今天著重研究php://

首先先把官方文檔貼上來
http://php.net/manual/zh/wrappers.php.php

有兩個比較重要的配置在php.ini中,allow_url_fopen 和allow_url_include會影響到fopen等等和include等等函數對於偽協議的支援,而allow_url_include依賴allow_url_fopen,所以allow_url_fopen不開啟的話,allow_url_include也是無法使用的。

php://是用來訪問各個輸入、輸出資料流的,除了php://stdin, php://stdout 和 php://stderr

php://input

php://input代表可以訪問請求的未經處理資料,簡單來說POST請求的情況下,php://input可以擷取到post的資料。

比較特殊的一點,enctype=”multipart/form-data” 的時候 php://input 是無效的。

php://output

php://output 是一個唯寫的資料流, 允許你以 print 和 echo 一樣的方式 寫入到輸出緩衝區。

php://filter

這篇文章的關鍵在於討論php://filter,事實上,這也是我們常常使用的一個偽協議,在任意檔案讀取,甚至getshell的時候都有利用的機會。

php://filter 是一種元封裝器, 設計用於資料流開啟時的篩選過濾應用。 這對於一體式(all-in-one)的檔案函數非常有用,類似 readfile()、 file() 和 file_get_contents(), 在資料流內容讀取之前沒有機會應用其他過濾器。

事實上,在include函數的使用上,經常會造成任意檔案讀取漏洞,而file_get_contents()和file_put_contents()這樣函數下,常常會構成getshell等更嚴重的漏洞。

php://filter 目標使用以下的參數作為它路徑的一部分。 複合過濾鏈能夠在一個路徑上指定。詳細使用這些參數可以參考具體範例。

文檔裡是這麼寫的

12345 名稱描述resource=<要過濾的資料流> 這個參數是必須的。它指定了你要篩選過濾的資料流。read=<讀鏈的篩選列表> 該參數可選。可以設定一個或多個過濾器名稱,以管道符(|)分隔。write=<寫鏈的篩選列表> 該參數可選。可以設定一個或多個過濾器名稱,以管道符(|)分隔。<;兩個鏈的篩選列表> 任何沒有以 read= 或 write= 作首碼 的篩選器列表會視情況應用於讀或寫鏈。

我們舉一個例子,這是平時我們用來任意檔案讀取的payload

1 php://filter/read=convert.base64-encode/resource=upload.php

 

這裡讀的過濾器為convert.base64-encode,就和字面上的意思一樣,把輸入資料流base64-encode。
resource=upload.php,代表讀取upload.php的內容

下面仔細研究下關於過濾器的問題

過濾器

先貼文檔,不因為自己的翻譯小問題接鍋 (?ω?)ノ
http://php.net/manual/zh/filters.php

轉換過濾器

http://php.net/manual/zh/filters.convert.php

convert.* 過濾器是php5.0.0以後添加的。

base64

convert.base64-encode和 convert.base64-decode使用這兩個過濾器等同於分別用 base64_encode()和 base64_decode()函數處理所有的流資料。 convert.base64-encode支援以一個關聯陣列給出的參數。如果給出了 line-length,base64 輸出將被用 line-length個字元為 長度而截成塊。如果給出了 line-break-chars,每塊將被用給出的字元隔開。這些參數的效果和用 base64_encode()再加上 chunk_split()相同。

當然,這裡的過濾器不止運用於php://filter,所以文檔中給出的例子是這樣的

12345678910111213141516171819202122 <?php$fp = fopen(‘php://output‘, ‘w‘);stream_filter_append($fp, ‘convert.base64-encode‘);fwrite($fp, "This is a test.\n");fclose($fp);/* Outputs: VGhpcyBpcyBhIHRlc3QuCg== */ $param = array(‘line-length‘ => 8, ‘line-break-chars‘ => "\r\n");$fp = fopen(‘php://output‘, ‘w‘);stream_filter_append($fp, ‘convert.base64-encode‘, STREAM_FILTER_WRITE, $param);fwrite($fp, "This is a test.\n");fclose($fp);/* Outputs: VGhpcyBp : cyBhIHRl : c3QuCg== */ $fp = fopen(‘php://output‘, ‘w‘);stream_filter_append($fp, ‘convert.base64-decode‘);fwrite($fp, "VGhpcyBpcyBhIHRlc3QuCg==");fclose($fp);/* Outputs: This is a test. */?>

 

quoted-printable

convert.quoted-printable-encode和 convert.quoted-printable-decode使用此過濾器的 decode 版本等同於用 quoted_printable_decode()函數處理所有的流資料。沒有和 convert.quoted-printable-encode相對應的函數。 convert.quoted-printable-encode支援以一個關聯陣列給出的參數。除了支援和 convert.base64-encode一樣的附加參數外, convert.quoted-printable-encode還支援布爾參數 binary和 force-encode-first。 convert.base64-decode只支援 line-break-chars參數作為從編碼載荷中剝離的類型提示。

關於quoted_printable_decode()在php.net上的解釋是將 quoted-printable 字串轉換為 8-bit 字串,原諒我沒怎麼看懂

字串過濾器

string.*是用來處理各個字串的,比較像python的string模組

string.rot13

rot13,很好理解

123456 <?php$fp = fopen(‘php://output‘, ‘w‘);stream_filter_append($fp, ‘string.rot13‘);fwrite($fp, "This is a test.\n");/* Outputs: Guvf vf n grfg. */?>

 

toupper

變大寫,也同樣很好理解

123456 <?php$fp = fopen(‘php://output‘, ‘w‘);stream_filter_append($fp, ‘string.toupper‘);fwrite($fp, "This is a test.\n");/* Outputs: THIS IS A TEST. */?>

 

tolower

這回是小寫

123456 <?php$fp = fopen(‘php://output‘, ‘w‘);stream_filter_append($fp, ‘string.tolower‘);fwrite($fp, "This is a test.\n");/* Outputs: this is a test. */?>

 

string.strip_tags

string.strip_tags(自 PHP 5.0.0 起)使用此過濾器等同於用 strip_tags()函數處理所有的流資料。可以用兩種格式接收參數:一種是和 strip_tags()函數第二個參數相似的一個包含有標記列表的字串,一種是一個包含有標記名的數組。

strip_tags()返回給定的字串 str 去除Null 字元、HTML 和 PHP 標記後的結果。

12345678910111213 <?php$fp = fopen(‘php://output‘, ‘w‘);stream_filter_append($fp, ‘string.strip_tags‘, STREAM_FILTER_WRITE, "<b><i><u>");fwrite($fp, "<b>bolded text</b> enlarged to a <h1>level 1 heading</h1>\n");fclose($fp);/* Outputs: <b>bolded text</b> enlarged to a level 1 heading */ $fp = fopen(‘php://output‘, ‘w‘);stream_filter_append($fp, ‘string.strip_tags‘, STREAM_FILTER_WRITE, array(‘b‘,‘i‘,‘u‘));fwrite($fp, "<b>bolded text</b> enlarged to a <h1>level 1 heading</h1>\n");fclose($fp);/* Outputs: <b>bolded text</b> enlarged to a level 1 heading */?>
壓縮過濾器

zlib.* 壓縮過濾器自 PHP 版本 5.1.0起可用,在啟用 zlib的前提下。也可以通過安裝來自 ? PECL的 ? zlib_filter包作為一個後門在 5.0.x版中使用。此過濾器在 PHP 4 中 不可用。

zlib.deflate和 zlib.inflate是主要的兩個用法

123456789101112131415161718192021222324252627 <?php$params = array(‘level‘ => 6, ‘window‘ => 15, ‘memory‘ => 9); $original_text = "This is a test.\nThis is only a test.\nThis is not an important string.\n";echo "The original text is " . strlen($original_text) . " characters long.\n"; $fp = fopen(‘test.deflated‘, ‘w‘);stream_filter_append($fp, ‘zlib.deflate‘, STREAM_FILTER_WRITE, $params);fwrite($fp, $original_text);fclose($fp); echo "The compressed file is " . filesize(‘test.deflated‘) . " bytes long.\n";echo "The original text was:\n";/* Use readfile and zlib.inflate to decompress on the fly */readfile(‘php://filter/zlib.inflate/resource=test.deflated‘); /* Generates output: The original text is 70 characters long.The compressed file is 56 bytes long.The original text was:This is a test.This is only a test.This is not an important string.  */?>
加密過濾器

mcrypt.和 mdecrypt.使用 libmcrypt 提供了對稱的加密和解密。

格式為 mcrypt.ciphername,其中 ciphername是密碼的名字,將被傳遞給 mcrypt_module_open()。有以下五個過濾器參數可用:

參數 是否必須 預設值 取值舉例
mode 可選 cbc cbc, cfb, ecb, nofb, ofb, stream
algorithms_dir 可選 ini_get(‘mcrypt.algorithms_dir’) a lgorithms 模組的目錄
modes_dir 可選 ini_get(‘mcrypt.modes_dir’) modes 模組的目錄
iv 必須 N/A 典型為 8,16 或 32 位元組的位元據。根據密碼而定
key 必須 N/A 典型為 8,16 或 32 位元組的位元據。根據密碼而定

細節自己研究文檔吧
http://php.net/manual/zh/filters.encryption.php

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.