檔案包含漏洞原理
程式開發人員通常會把可重復使用的執行函式寫在單個檔案內,在使用某個函式的時候,直接可以通過檔案包含函式,直接呼叫執行函式檔案,無需多次或再次撰寫,這種呼叫檔案的程序通常被稱為包含
產生的原因:
為了代碼更加的靈活,開發者會把被包含的檔案設定為變數,進行動態呼叫,從而導致客戶端可以呼叫任意檔案,假設攻擊者構造惡意代碼,并包含了該惡意代碼執行檔案,
檔案包含漏洞可以決議含PHP代碼的檔案內容 如果檔案內 包含php可執行代碼 則php程式會被決議并正常執行
產生原因
???PHP檔案包含會將一切的檔案當成PHP腳本執行
檔案包含是php的正常功能,如果包含的檔案用戶可以控制,且后端代碼沒有進行嚴格驗證,就會造成檔案包含漏洞,
Java、ASP是完全面向物件的語言 不存在檔案包含漏洞
產生代碼思路
<?php
$filename=$_GET['filename'];
include($filename);
?>
???PHP檔案包含常用函式:
-
include include "db_connect.php" 包含db_connect.php腳本檔案
- 如果腳本檔案不存在,則網站提示報錯,不影響執行 -
include_once incluede_once "db_connect.php" 只包含一次php腳本檔案
- 如果腳本檔案不存在,則網站提示報錯,不影響執行程式繼續執行 -
require incluede_once "db_connect.php" 包含db_connect.php腳本檔案
- 如果腳本檔案不存在,則網站出現致命錯誤并終止執行 -
require_once incluede_once "db_connect.php" ** 只包含一次php腳本檔案
- 如果腳本檔案不存在,則網站出現致命錯誤**并終止執行
代碼審計思路:搜索可能產生漏洞的函式
include
include_once
require
require_once
防御方法
對檔案包含內容做判斷;檔案包含處寫死
檔案包含漏洞利用


檔案包含漏洞分類
本地檔案包含
allow_url_fopen=On/Off(php默認就是On)
allow_url_include=On/Off(php默認是Off)
遠程檔案包含
allow_url_fopen=On/Off(php默認就是On)
allow_url_include=On/Off(php默認是Off,遠程檔案包含需要手動開啟很少遇見)
利用方法
- 讀取任意檔案 絕對路徑?file=/etc/passwd
- 相對路徑?file=../../../../etc/passwd
- 和檔案上傳漏洞共同利用,包含圖片馬
利用核心
php檔案包含會把一切的檔案都當做php腳本執行
??windows 本地host 檔案C:/windows/system32/drivers/etc/hosts

繞過方法:
%00截斷
條件:
1.magic_quotes_gpc = Off
2.php 版本低于5.3.4
3.遠程檔案包含
遠程檔案包含可以包含任意的url鏈接進行呼叫


繞過方法:
- ?繞過
-
繞過 在url中#需要編碼
- %20空格繞過
- 攻擊機主動更改后綴名
PHP偽協議
file://訪問本地系統檔案 必須跟上絕對路徑 讀取本地檔案
(allow_url_fopen和allow_url_include無論開關都可以)

php://filter 常用于讀取檔案/原始碼

(allow_url_fopen和allow_url_include無論開關都可以)
讀取php檔案時可以防止其執行 所以使用該偽類協議 對檔案內容進行編碼輸出的處理
base64編碼方法
?path=php://filter/read=convert.base64-encode/resource=檔案.php txt
rot13加密方法
?path=php://filter/string.rot13/resource=檔案.php
php://filter協議和file://協議的區別
file://偽協議只能使用絕對路徑
php:filter//偽協議可以相對路徑和絕對路徑都可以使用
php://input 接收POST請求體當作PHP代碼執行
接收POST體當作php代碼執行


allow_url_fopen off/on
offallow_url_incluede On 必須開啟
burpsuite 執行演示

其它偽協議的使用方法

zip:// 讀取Zip檔案內容
allow_url_fopen;allow_url_include 無論開關
【必須是絕對路徑】包含讀取zip檔案中內容
?id=zip://D/phpStudy/www/file.zip%23test.txt
data://text/plain 把GET請求引數中的一部分字串當作PHP腳本執行
allow_url_fopen;allow_url_include 都需打開
偽協議編碼
data://text/plain,<?php phpinfo()?>
對base64編碼后的字符進行php代碼執行
data://text/plain;base64,[執行腳本]
base64編碼是 出現+號 在URL中 出現 需要二次編碼
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/494555.html
標籤:其他
