淺析PHP偽協議在CTF的應用


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編碼字符串后解碼的數據作為數據流的輸入


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM