魯先志 柏海龍 周均
摘 要:文件包含漏洞是PHP語(yǔ)言開發(fā)的web系統(tǒng)中普遍存在的一類漏洞,本文分析了文件包含漏洞的原理,設(shè)計(jì)一個(gè)實(shí)驗(yàn)案例展示文件包含漏洞的利用過(guò)程。
關(guān)鍵詞:漏洞;PHP語(yǔ)言;web系統(tǒng)
PHP語(yǔ)言開發(fā)的WEB系統(tǒng)程序有著快速開發(fā)快速部署,系統(tǒng)開發(fā)實(shí)施周期短的優(yōu)勢(shì),但PHP語(yǔ)言開發(fā)的WEB系統(tǒng)也普遍存在一些典型的漏洞,如:跨站腳本漏洞、SQL注入漏洞、代碼執(zhí)行漏洞、文件包含漏洞及PHP代碼注入漏洞等[1]。
1 文件包含基本概念
文件包含漏洞主要是基于PHP語(yǔ)言的web應(yīng)用程序中發(fā)生的。程序員寫程序時(shí)將公用代碼寫在單獨(dú)的文件中,然后其他函數(shù)需要使用該代碼時(shí)直接包含調(diào)用[2]。嚴(yán)格來(lái)說(shuō),文件包含漏洞是“代碼注入”的一種?!按a注入”這種攻擊,其原理就是注入一段用戶能控制的腳本或代碼,并讓服務(wù)器端執(zhí)行?!按a注入”的典型代碼就是文件包含,可以理解為“外部數(shù)據(jù)流包含”,至于這個(gè)外部數(shù)據(jù)流是什么,可以是文件,也可以是POST數(shù)據(jù)流的形式。
2 PHP的封裝協(xié)議(偽協(xié)議)
php漏洞利用中常用偽協(xié)議為以下兩種:
①php://filter--對(duì)本地磁盤文件進(jìn)行讀寫,改協(xié)議經(jīng)常用來(lái)讀取源代碼并進(jìn)行base64編碼輸出,不然會(huì)直接源代碼會(huì)當(dāng)做php代碼執(zhí)行就看不到源代碼內(nèi)容。
條件:allow_url_fopen :off/on? allow_url_include:off/on
用法:php://filter/convert.base64-encode/resource=a.php
//將a.php源代碼以base64編碼輸出
②php://input 可以訪問請(qǐng)求的原始數(shù)據(jù)的只讀流,將post請(qǐng)求中的數(shù)據(jù)作為PHP代碼執(zhí)行。
條件:allow_url_fopen :off/on? ? allow_url_include:on
用法:http://127.0.0.1/cmd.php?file=php://input
[POST DATA] <?php phpinfo()?>//執(zhí)行phpinfo函數(shù)
除了以上的協(xié)議以外,php支持的還有以下封裝協(xié)議(其中常用為data與ftp協(xié)議):file:// http:// ftp:// php:// zlib:// glob:// phar:// ssh2:// rar:// ogg:// expect://
3 php文件包含漏洞的實(shí)現(xiàn)
本實(shí)驗(yàn)搭建了一個(gè)具有PHP文件包含漏洞的web系統(tǒng),通過(guò)使用的工具是Linux系統(tǒng)下的curl命令,實(shí)現(xiàn)對(duì)目標(biāo)服務(wù)器127.0.0.1:7521的滲透,并成功獲取到系統(tǒng)的敏感信息。
1.通過(guò)curl命令訪問目標(biāo)網(wǎng)址:curl 127.0.0.1:7521
2.上圖顯示了目標(biāo)系統(tǒng)的網(wǎng)頁(yè)源碼和兩項(xiàng)php配置
1.源代碼中有include函數(shù),并且存在未過(guò)濾的可控參數(shù)path,此處存在有文件包含漏洞的風(fēng)險(xiǎn)。
2.系統(tǒng)中有兩項(xiàng)文件包含的相關(guān)配置,allow_url_fopen為off,allow_url_include為on,遠(yuǎn)程文件包含需要allow_url_fopen為on,所以無(wú)法進(jìn)行直接包含遠(yuǎn)程文件,達(dá)到getshell
3.PHP配置項(xiàng)allow_url_include為on,所以可以通過(guò)相關(guān)偽協(xié)議達(dá)到文件讀取與命令執(zhí)行的目的,data協(xié)議需要兩項(xiàng)都為on,此處使用php://filter和php://input達(dá)到目的。
4.通過(guò)命令執(zhí)行讀取本地文件
通過(guò)可控的path參數(shù),利用php://input,注入php的命令執(zhí)行語(yǔ)句,來(lái)達(dá)到命令執(zhí)行。(此處使用system函數(shù)),通過(guò)curl發(fā)送如下包
curl -d “<?php system(ls); ?>”/
http://127.0.0.1/index.php?path=php://input
5.查看返回的數(shù)據(jù)中,標(biāo)簽后有我們執(zhí)行后的結(jié)果。此處有三個(gè)文件,可以猜測(cè)出flag應(yīng)該在f10g.php文件中。
6.訪問f10g.php? curl http://127.0.0.1:7521/f10g.php
7.通過(guò)php://filter讀取f10g.php源代碼
curl \
http://127.0.0.1:7521/index.php?path=php://filter/convert.base64-encode/resource=f10g.php
返回的數(shù)據(jù)中標(biāo)簽后有base64編碼后的顯示有源代碼數(shù)據(jù),可以通過(guò)base64解碼來(lái)查看源代碼
4 小結(jié)
本次的滲透測(cè)試案例展示了一個(gè)簡(jiǎn)單的PHP文件上傳漏洞并利用該漏洞獲取到系統(tǒng)的敏感數(shù)據(jù)。我們?cè)趯?shí)際的滲透過(guò)程中可以通過(guò)多種方式來(lái)利用該漏洞,根據(jù)系統(tǒng)環(huán)境中PHP配置文件和服務(wù)器配置的不同來(lái)靈活利用該漏洞,比如可以利用php://input來(lái)寫入一句話木馬,也可以直接讀取關(guān)鍵配置文件,還可以通過(guò)php://input執(zhí)行系統(tǒng)命令。
參考文獻(xiàn)
[1]劉鵬,張玉清常見安全漏洞攻防研究[J].信息網(wǎng)絡(luò)安全,2011(07)33-36.
[2]周開東等.遠(yuǎn)程文件包含漏洞分級(jí)檢測(cè)工具研究[J].計(jì)算機(jī)應(yīng)用與軟件,2014(02)21-23.
[3]趙潤(rùn)梓.基于WEB滲透的自動(dòng)化文件上傳漏洞檢測(cè)工具實(shí)現(xiàn)[J].網(wǎng)絡(luò)全,2020(03)27-28.