PHP封裝協議php
PHP有不少內置URL風格的封裝協議,這類協議fopen(),copy(),file_exists(),filesize()等文件系統函數所提供的功能相似。常見協議以下:安全
file:// 訪問本地文件系統服務器
http:// 訪問HTTP(s)網址less
ftp:// 訪問FTP(s)URLsssh
php:// 訪問輸入/輸出流(I/O streams)函數
zlib:// 壓縮流量post
data:// 數據(RFC 2397)測試
ssh2:// Secure Shell 2網站
expect:// 處理交互式的流url
glob:// 查找匹配的文件路徑
//摘錄自《Web安全深度剖析》
這個封裝協議多用於文件包含漏洞
php僞協議的分類
僞協議是文件包含的基礎,理解僞協議的原理才能更好的利用文件包含漏洞。
php://input
php://input表明能夠訪問請求的原始數據,簡單來講POST請求的狀況下,php://input能夠獲取到post的數據。
使用條件:include( )、include_once( )、file_get_contents( )
比較特殊的一點,enctype=」multipart/form-data」的時候 php://input 是無效的。
用法舉例:
php://output
php://output 是一個只寫的數據流,容許你以print和echo同樣的方式寫入到輸出緩衝區。
php://filter(重點)
php://filter是一種元封裝器,設計用於數據流打開時的篩選過濾應用,也就是做爲一種過濾器,可使用在數據流產生的地方。
php文檔中,標準的定義是這樣的:
相似的過濾器還有string.rot1三、string.strip_tags、zlib.deflate和zlib.inflate等等,目前只要知道convert.base64-encode就行了。
URL 中包含點的常見形式
?file = xxx 或者 ?file = xxx.php
allow_url_fopen和allow_url_include
在測試了包含點存在包含漏洞之後,並非均可以使用filter僞協議包含出源碼的,由於allow_url_fopen和allow_url_include會影響到fopen和include等函數對於僞協議的支持。
allow_url_include影響php://input的使用,若不打開則沒法使用。
當allow_url_fopen打開時,能夠包含任意url。
例如只打開allow_url_include時,只能包含遠程文件和使用php://input
舉個例子
題目連接:http://level3.tasteless.eu/
題目直接給出了源碼:
根據提示,用php://input 僞協議讀取php.ini
找到SERVER["DOCUMENT_ROOT"],也就是網站的根目錄,能夠找到當前腳本的目錄,以下:
還能夠看到一些文件包含的配置:
payload:
//摘錄自i春秋博客園
附上一題文件包含
題目提示flag在index.php裏,直接訪問這個頁面並無,可是看到url
咱們直接經過封裝協議去讀取index.php的源代碼
file=php://filter/read=convert.base64-encode/resource=index.php
這樣咱們會獲得base64後的源碼,咱們去解碼一下
由此咱們獲得flag