PHP支持的偽協議如下:
file:// — 訪問本地文件系統 http:// — 訪問 HTTP(s) 網址 ftp:// — 訪問 FTP(s) URLs php:// — 訪問各個輸入/輸出流(I/O streams) zlib:// — 壓縮流 data:// — 數據(RFC 2397) glob:// — 查找匹配的文件路徑模式 phar:// — PHP 歸檔 ssh2:// — Secure Shell 2 rar:// — RAR ogg:// — 音頻流 expect:// — 處理交互式的流
PHP.ini
在php.ini里有兩個重要的參數allow_url_fopen和allow_url_include
allow_url_fopen:默認值是ON,允許url里的封裝協議訪問文件
allow_url_include:默認值是OFF,不允許包含url里的封裝協議包含文件
php://filter
經常使用的偽協議,一般用於任意文件讀取,有時也可以用於getshell.在雙OFF的情況下也可以使用.
php://filter是一種元封裝器,用於數據流打開時篩選過濾應用。這對於一體式(all-in-one)的文件函數非常有用。類似readfile()、file()、file_get_contents(),在數據流讀取之前沒有機會使用其他過濾器。
php://filter參數
名稱 | 描述 |
---|---|
resource=<要過濾的數據流> | 這個參數是必須的。它指定了你要篩選過濾的數據流。 |
read=<讀鏈的篩選列表> | 該參數可選。可以設定一個或多個過濾器名稱,以管道符(|)分隔 |
write=<寫鏈的篩選列表> | 該參數可選。可以設定一個或多個過濾器名稱,以管道符(|)分隔 |
<;兩個鏈的篩選列表> | 任何沒有以 read= 或 write= 作前綴 的篩選器列表會視情況應用於讀或寫鏈。 |
php://filter/[read/write]=string.[rot13/strip_tags/…..]/resource=xxx
filter和string過濾器連用可以對字符串進行過濾。filter的read和write參數有不同的應用場景。read用於include()和file_get_contents(),write用於file_put_contents()中。
php://filter/convert.base64-[encode/decode]/resource=xxx
這是使用的過濾器是convert.base64-encode.它的作用就是讀取upload.php的內容進行base64編碼后輸出。可以用於讀取程序源代碼經過base64編碼后的數據
php://input
php://input可以訪問請求的原始數據的只讀流,將post請求的數據當作php代碼執行。當傳入的參數作為文件名打開時,可以將參數設為php://input,同時post想設置的文件內容,php執行時會將post內容當作文件內容。
需要開啟allow_url_include
注:當enctype=”multipart/form-data”時,php://input是無效的。
file://
file://偽協議在雙OFF的時候也可以用,用於本地文件包含
注:file://協議必須是絕對路徑
phar://
PHP 歸檔,常常跟文件包含,文件上傳結合着考察。說通俗點就是php解壓縮包的一個函數,解壓的壓縮包與后綴無關。
phar://test.[zip/jpg/png…]/file.txt
其實可以將任意后綴名的文件(必須要有后綴名),只要是zip格式壓縮的,都可以進行解壓,因此上面可以改為phar://test.test/file.txt也可以運行。
zip://,bzip2://, zlib://
在雙OFF的時候也可以用,
zip://test.zip%23file.txt
和phar://一樣用於讀取壓縮文件,不過對於"zip://test.zip#file.txt"中的"#"要編碼為"%23".因為url的#后的內容不會被傳送
data://text/plain;base64,base編碼字符串
很常用的數據流構造器,將讀取后面base編碼字符串后解碼的數據作為數據流的輸入