一、漏洞介紹
1.什么是檔案包含?
程式開發人員一般會把重復使用的函式寫到單個檔案中,需要使用某個函式時直接呼叫此檔案,而無需再次撰寫,這種檔案呼叫的程序一般被稱為檔案包含,
2.檔案包含漏洞產生原因
這個漏洞主要是由于服務端沒有一個合理的輸入驗證機制,即用戶的輸入在沒有適當驗證的情況下被傳遞檔案包含命令,從而執行惡意檔案操作,
示例
<?php
$filename = $_GET['file'];
include($filename);
?>
對上面這段 PHP 代碼進行分析,把一個 GET 請求的引數 file 傳給了一個變數filename,然后包含了這個變數,但是開發者沒有對 $_GET['file'] 引數經過嚴格的過濾,直接帶入了 include 的函式,這就造成了檔案包含漏洞,如此一來,攻擊者便可以修改$_GET[‘file']的值,包含網站的敏感檔案進行查看,
3.檔案包含函式
在 PHP 中共有四種檔案包含函式:
-
Include():包含并運行指定的檔案,只有在程式執行到 include 時才包含檔案,且當包含檔案發生錯誤時,程式警告,但會繼續執行,
-
Require():只要程式一運行就會執行該包含檔案函式,當包含檔案發生錯誤時,程式直接終止執行,
-
Include_once():和 include()類似,不同之處在于 include_once 會檢查這個檔案是否已經被匯入,如果已匯入、下文便不會再匯入,
-
Require_once():和 require()類似,不同處在于 require_once 也是與include_once 一樣只匯入一次,
4.檔案包含漏洞的危害
-
讀取web組態檔以及敏感資料
-
web 服務器的檔案被外界瀏覽導致資訊泄露;
-
與檔案上傳漏洞組合 getshell,將惡意代碼執行決議
5.檔案包含漏洞的檢測
- 通過代碼審計,來查出漏洞所在位置和原理,
- 通過漏洞掃描工具識別,
- 查看網站的程式平臺,中間件,框架等,尋找公開漏洞,
- 通過查看網站的 url 地址,觀察鏈接上引數值
二、漏洞分類
檔案包含漏洞共分為兩大類,本地檔案包含和遠程檔案包含,想要實作遠程檔案包含,需要 php.ini 開啟了 allow_url_fopen 和 allow_url_include 的配置,本地檔案包含的含義就是包含本地服務器的檔案,遠程檔案包含的含義就是包含第三方服務器的檔案,
1.本地檔案包含
(1)介紹
僅能夠對服務器本地的檔案進行包含,由于服務器上的檔案并不是攻擊者所能夠控制的,因此該情況下,攻擊者更多的會包含一些固定的系統組態檔,從而讀取系統敏感資訊,很多時候本地檔案包含漏洞會結合一些特殊的檔案上傳漏洞,從而形成更大的威力,
(2)演示
如圖為 pikachu 的本地檔案包含漏洞靶場

觀察其 url,將 file.php 檔案名替換為網站根目錄下的 phpinfo.php 成功顯示

2.遠程檔案包含
(1)介紹
能夠通過url地址對遠程的檔案進行包含,這意味著攻擊者可以傳入任意的代碼,因此,在 web 應用系統的功能設計上盡量不要讓前端用戶直接傳變數給包含函式,如果非要這么做,一定要做嚴格的白名單策略進行過濾,
(2)演示
要保證 php.ini 中 allow_url_fopen 和 allow_url_include 為On
如圖為 pikachu 的遠程檔案包含漏洞靶場

先在自己的個人服務器上創建好一個 phpinfo.php 檔案

將 url 中 filename 的引數填上 遠程服務器的 phpinfo.php 檔案路徑,成功顯示

三、漏洞利用
1.PHP 偽協議
(1)PHP 支持的偽協議
file:// — 訪問本地檔案系統
http:// — 訪問 HTTP(s) 網址
ftp:// — 訪問 FTP(s) URLs
php:// — 訪問各個輸入/輸出流(I/O streams)
php://stdin, php://stdout 和 php://stderr
php://input
php://output
php://memory 和 php://temp
php://filter
zlib:// — 壓縮流
data:// — 資料(RFC 2397)
glob:// — 查找匹配的檔案路徑模式
phar:// — PHP 歸檔
ssh2:// — Secure Shell 2
rar:// — RAR
ogg:// — 音頻流
expect:// — 處理互動式的流
(2)常見 PHP 偽協議
a.php://input
1)介紹
php://input 是個可以訪問請求的原始資料的只讀流,當請求方式是 post,并且 Content-Type 不等于 “multipart/form-data” 時,可以使用 php://input 來獲取原始請求的資料,
2)利用演示
創建具有檔案包含漏洞的 file inclusion.php 檔案進行演示
代碼如下
<?php
$filename = $_GET['file'];
include($filename);
?>
可以看到確實存在檔案包含漏洞

命令執行
打開 burpsuite 修改資料包,利用 php://input 進行命令執行

可以看到成功執行命令

寫入木馬
再次使用 burpsuite 修改資料包,利用 php://input 上傳木馬
<?PHP fputs(fopen('shell.php','w'),'<?php @eval($_POST[x])?>');?>

打開網站根目錄,木馬上傳成功

b.file://
1)介紹
file:// 檔案系統是 PHP 使用的默認封裝協議,展現了本地檔案系統,當指定了一個相對路徑(不以/、、\或 Windows 盤符開頭的路徑)提供的路徑將基于當前的作業目錄,通常利用它讀取本地檔案,
2)利用演示
利用 file:// 讀取網站根目錄下的 phpinfo.php 檔案

c.php://filter
1)介紹
php://filter 是 php 中獨有的一個協議,可以作為一個中間流來處理其他流,可以進行任意檔案的讀取,
2)利用演示
file=php://filter/read=convert.base64-encode/resource=file inclusion.php
利用 php://filter 將網頁原始碼用 base_64 編碼后讀取

再用 base_64 解碼,成功得到網頁原始碼

2.檔案包含漏洞繞過
(1)繞過指定前綴
示例代碼:
<?php
$file = $_GET['file'];
include'/var/www/html/'.$file;
?>
方法:通過…/回溯符跳轉到其他目錄
(2)繞過指定后綴
示例代碼:
<?php
$filename = $_GET['file'];
include($filename.".html");
?>
方法:
-
%00截斷:%00會被認為是結束符,后面的資料會被直接忽略,導致擴展名截斷,攻擊者可以利用這個漏洞繞過擴展名過濾,
-
路徑長度截斷:作業系統存在最大路徑長度的限制,可以輸入超過最大路徑長度的目錄,這樣系統就會將后面的路徑丟棄,導致擴展名截斷,( Windows 下目錄的最大路徑256B,Linux 下目錄的最大路徑長度為4096B)
四、漏洞防御
(1)檢查組態檔
檢查 php 中的 php.ini ,其中 allow_url_foprn、allow_url_include 這兩個選項與 php 偽協議緊密關聯,allow_url_fopen默認是開啟的,allow_url_include 默認是關閉,最好根據網站需求,對這兩個選項進行合理配置,
(2)過濾特殊符號
服務器可以過濾掉執行檔案包含操作的符號,例如:\,// 等,以及 php 偽協議常用字符,例如input,output,filter 等,將這些字符進行有效過濾,可以減少惡意檔案操作的可能,
(3)指定包含的檔案
建立一個白名單,當用戶創建檔案時,將該檔案名插入到記錄中,以便其請求檔案時,站點可以在執行任何包含之前驗證檔案名,
總結
消除檔案包含漏洞的最有效的解決方案是避免向任何檔案系統/框架 API 傳遞用戶提交的輸入,如果不可避免,應用程式可以設定白名單,然后使用一個識別符號(例如索引號)來訪問所選的檔案,任何包含無效識別符號的請求都會被拒絕,這樣就可以避免產生檔案包含漏洞,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/501524.html
標籤:其他
