了解PHP伪协议
前言:最近做題web題很多都涉及了PHP偽協議,這次就來詳細的了解總結一下!
練習每個協議前,相關的配置必須開啟或者關閉才不會報錯,可以參考這張圖片
下面就來了解PHP偽協議
0x00:php://
說明:
PHP 提供了一些雜項輸入/輸出(IO)流,允許訪問 PHP 的輸入輸出流、標準輸入輸出和錯誤描述符, 內存中、磁盤備份的臨時文件流以及可以操作其他讀取寫入文件資源的過濾器。
php:// 訪問輸入輸出流,有許多子協議,下面就來學習一下
php://filter
說明:
php://filter 是一種元封裝器, 設計用于數據流打開時的篩選過濾應用。 這對于一體式(all-in-one)的文件函數非常有用,類似 readfile()、 file() 和 file_get_contents(), 在數據流內容讀取之前沒有機會應用其他過濾器。
簡單來理解就是:php://filter是可以作為一個中間流來處理其他流,可以進行任意文件的讀取。而且當使用不同的參數可以達到不同的目的和效果:
例子可以看PHP官網,特別詳細
php://filter
這里通過bugku中的一道題來練習一下
打開鏈接后發現?file=show.php,涉及文件包含漏洞,題目中又提示說:flag在index中,那就可以用php://filter中的read參數查看源文件內容
構造payload:
?file=php://filter/read=convert.base64-encode/resource=index.php這里之所以進行base64編碼是為了PHP不對其解析,這個payload也是常用的任意讀取文件語句,只要將后面的頁面修改即可。
可以參考官網的例子構造語句
<?php /* 這會以大寫字母輸出 www.example.com 的全部內容 */ readfile("php://filter/read=string.toupper/resource=http://www.example.com");/* 這會和以上所做的一樣,但還會用 ROT13 加密。 */ readfile("php://filter/read=string.toupper|string.rot13/resource=http://www.example.com"); ?>
解碼得出源代碼和flag
可以看到源代碼中對用戶輸入的file參數進行了過濾,但是源碼中的include函數將用戶輸入的引入php文件并執行,如果執行不成功,就返回文件的源碼,所以才要進行base64編碼。
php://input
說明:
php://input 是個可以訪問請求的原始數據的只讀流,可以讀取沒有處理過的POST數據。
php://input可以將要執行的語法php代碼寫在post中提交,下面通過DVWA來練習一下
若有寫入權限,也可以寫入一句話木馬
file://
說明:
file:// — 訪問本地文件系統,當指定了一個相對路徑(不以/、\、\或 Windows 盤符開頭的路徑)提供的路徑將基于當前的工作目錄。
模仿大師傅搭建一個本地靶場
<?php@$file = isset($_GET[file])?$_GET['file']:'ctf.php'; include_once($file); highlight_file($file);?>
使用file協議訪問本地文件,構造payload:
訪問成功
也可以用這個靶場來練習php://filter協議
構造payload:
http://127.0.0.1/2.php?file=php://filter/read/convert.base64-encode/resource=1.txt
進行解碼
直接讀取也可以
payload:
http://127.0.0.1/2.php?file=php://filter/resource=1.txtzip://協議
zip:// [壓縮文件絕對路徑]#[壓縮文件內的子文件名]
phar:// 協議
phar://協議與zip://類似,同樣可以訪問zip格式壓縮包內容
data:// 協議
data: text/plain,<?php 執行內容 ?>
data://text/plain,
data://text/plain;base64,
在DVWA中進行測試
http://127.0.0.1/DVWA/vulnerabilities/fi/?page=data:text/plain,<?echo phpinfo()?>
也可以用base64的格式編碼PHP代碼
注意要按照這個格式才能成功data://text/plain;base64,還有base64編碼后的加號和等號要手動的url編碼,否則無法識別。
+ %2b = %3d
可以通過一道題目練習一下:
例如這道題便過濾掉了php://,可以使用data:// 協議
既然可以使用就利用php中的system函數直接命令執行即可
http:// & https:// 協議
常規 URL 形式,允許通過 HTTP 1.0 的 GET方法,以只讀訪問文件或資源。
總結:這次學習大致了解了一些PHP偽協議,但還是需要結合一些題目來練習一下,這次就先總結到這,等理解更深后,再來詳細總結一下。
總結
- 上一篇: PHP弱类型及一些绕过姿势
- 下一篇: 动态规划算法php,php算法学习之动态