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