1. 程式人生 > >檔案包含總結--2018自我整理

檔案包含總結--2018自我整理

0x00前言

使用者的一些行為會將伺服器某些檔案比如日誌,session等寫入資訊,如果有php頁面能夠把寫入的惡意程式碼其包含進來,就可能getshell

 

0x01檔案包含的函式

include, include_once,require,require_one引入檔案時,利用引數拼接成路徑,而引數如果可控則造成的問題。

這四個函式雖然存在細微的不同,但是功能都大差不差

 

0x02檔案包含可用的協議

1.php://input => 讀取到訪問請求的原始資料的只讀流,即讀取POST上沒有經過解析的資料。不支援multipart/form-data的型別的傳碼方式上傳。

   在配置檔案php.ini中allow_url_include => On 開啟,使用方式

 

2.php://filter  => 對磁碟中的檔案進行讀寫,因此可以通過該協議來達到對檔案的讀取

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