協議
各種協議的使用有時是關鍵
file協議
file后面需是///,例如file:///d:/1.txt
也可以是file://e:/1.txt,如果是在當前盤則可以file:///1.txt
如果是php文件,則文件內容通過查看源碼的方式讀取
文件名可以通過>替代
zip://協議
例:zip://e:1.zip#1.txt(#需轉為%23)路徑必須為絕對路徑
phar://協議
例:phar://1.phar/1.php
可以讀取文件的函數
函數的使用不當可能引發問題
include函數
通過get方法或post方法include的文件首先是從當前文件夾下開始讀取,此時目錄穿越漏洞可以用
不能夠讀取自己,否則會出現邏輯錯誤
如果直接包含一個php文件,則只會顯示其中在
標簽外的內容,以及php代碼輸出的內容
若要讀取php文件的內容,則需要將其編碼,例:php://filter/read=convert.base64-encode/resource=123.php
使用>時如果有多個文件符合,只會輸出第一個
highlight_file函數
將文件以內置的顏色輸出,可以輸出php文件,也可以輸出其他文件
如果第二個參數return設置為true,那么文件內容將不會輸出,而是返回一個字符串
show_source函數
上面函數的別名,功能是一樣的
file_get_contents函數
將一個文件讀入一個字符串
包含的文件需要在源碼中才能看到,或者使用偽協議將其base64加密
fopen函數
因為返回的是一個指針,所以不能夠直接讀取,需要用fgets或者fread讀取指針指向的內容,或者使用fpassthru讀取指針指向剩下的內容
readfile函數
功能是讀取一個文件到緩沖區,返回一個整數(為文件的內字符的長度)
file函數
功能是將一個文件讀入數組,數組的鍵是行數(從0開始),數組的值為該行的內容
截斷
include($_GET['file']."txt");
一般的文件包含都是類似這樣的情況,對於這種情況,就要進行截斷
?,#
包含一個遠程文件或者是url時使用
%00
在php版本小於5.2時可用
:
僅在windows環境可用
使用協議
例如上面的zip://,phar://
