一. 簡單理解
文件包含就是一個文件里面包含另外一個文件。一開始接觸的時候是因為php里面,但是查找了一些資料這個存在在很多語言里面。
程序開發人員一般會把重復使用的函數寫到單個文件中,需要使用某個函數時直接調用此文件,而無需再次編寫,這中文件調用的過程一般被稱為文件包含。
程序開發人員一般希望代碼更靈活,所以將被包含的文件設置為變量,用來進行動態調用,
但正是由於這種靈活性,從而導致客戶端可以調用一個惡意文件,造成文件包含漏洞。
幾乎所有腳本語言都會提供文件包含的功能,但文件包含漏洞在PHP Web Application中居多,
而在JSP、ASP、程序中卻非常少,甚至沒有,這是有些語言設計的弊端。
在PHP中經常出現包含漏洞,但這並不意味這其他語言不存在。
二.產生的原因
通過引入文件時,用戶可控,沒有嚴格的檢驗,或是被繞過,操作一些敏感文件,導致文件泄露和惡意代碼注入
當包含文件在服務器本地上,就形成本地文件包含,當包含的文件在第三方服務器是,就形成可遠程文件包含。
包含文件的函數
1.include()
2.include_once()
3.require()
4.require_once()
代碼審計的時候,是否是變量,不過濾,過濾不嚴格,函數include/require
遠程文件包含和本地文件包含的配置區別
- 本地文件包含php.ini配置文件中開啟allow_url_include
- 遠程文件包含與本地文件包含的區別(開啟allow_url_include和allow_url—ftp on)
-
遠程文件(包括本地文件包含)包含比本地文件包含的危害大
本地文件包含利用
- 上傳圖片GETshell
- 讀取文件,讀取php文件
- 包含日志文件獲取webshell
- 包含/proc/self/environ 文件webshell
- phpinfo.php 可以包含臨時文件(顯示臨時文件路徑)寫工具發包上傳文件。查看返回信息路徑。在使用include包含文件(速度要求快)
-
包含data//或是php://input協議(偽協議,需要allow_url_include=On) 作者:青山i 鏈接:https://www.jianshu.com/p/110278faeddb
使用PHP封裝協議讀取文件和寫入PHP文件
1.讀取文件
先看看讀取文件,如輸入page參數值為:php://filter/read=convert.base64-encode/resource=../../../../../var/www/dvwa/hackable/uploads/1.txt
格式為上
2.寫入文件
前提條件是allow_url_include為on,則構造如下URL:192.168.220.128/dvwa/vulnerabilities/fi/?page=php://input
然后再POST需要輸入的內容即可,這里通過Firefox的HackBar來POST數據