php偽協議是ctf中的一個考點,目前比較熟悉的偽協議有php://filter, php://input, data://text/plain, file://,后續補充。
要成功應用偽協議需要php.ini文件的allow_url_fopen 默認開啟
allow_url_include 默認關閉
file://偽協議
此協議可以在雙off的情況下使用,用於訪問本地文件
使用方法:file://文件絕對路徑和文件名 如http://127.0.0.1/cmd.php?file=file://D:/soft/phpStudy/WWW/phpcode.txt
data://text/plain協議
此協議需要在雙on的情況下才能使用,很常用的數據流構造器,將讀取后面base編碼字符串后解碼的數據作為數據流的輸入
使用方法:data://text/plain;base64,base64編碼字符 如http://127.0.0.1/cmd.php?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=
data://text/plain,字符 如http://127.0.0.1/cmd.php?file=data://text/plain,<?php phpinfo()?>
php:input協議
此協議需要allow_url_include為on,可以訪問請求的原始數據的只讀流, 將post請求中的數據作為PHP代碼執行。當傳入的參數作為文件名打開時,可以將參數設為php://input,同時post想設置的文件內容,php執行時會將post內容當作文件內容。
使用方法:php://input,然后post需要執行的數據 如http://127.0.0.1/cmd.php?file=php://input 然后在post中<?php phpinfo() ?>
php://filter協議
在雙off的情況下也可使用,讀取文件並進行顯示或寫入
名稱 | 描述 |
---|---|
resource=<要過濾的數據流> | 這個參數是必須的。它指定了你要篩選過濾的數據流。 |
read=<讀鏈的篩選列表> | 該參數可選。可以設定一個或多個過濾器名稱,以管道符(|)分隔 |
write=<寫鏈的篩選列表> | 該參數可選。可以設定一個或多個過濾器名稱,以管道符(|)分隔 |
<;兩個鏈的篩選列表> | 任何沒有以 read= 或 write= 作前綴 的篩選器列表會視情況應用於讀或寫鏈。 |
使用方法:php://filter/read=convert.base64-encode/resource=文件名(對文件進行base64編碼並讀取顯示) 如
http://127.0.0.1/cmd.php?file=php://filter/read=convert.base64-encode/resource=./cmd.php
參考地址:https://www.leavesongs.com/PENETRATION/php-filter-magic.html
https://www.cnblogs.com/dubhe-/p/9997842.html
https://www.freebuf.com/column/148886.html