PHP文件包含漏洞原理分析|美創(chuàng)安全實(shí)驗(yàn)室
PHP是目前非常流行的Web開發(fā)語言,但是在利用PHP開發(fā)Web應(yīng)用時(shí),如果稍有不注意,就會產(chǎn)生PHP文件包含漏洞。PHP文件包含漏洞是一種常見的漏洞,而通過PHP文件包含漏洞入侵網(wǎng)站,甚至拿到網(wǎng)站的WebShell的案例也是不勝枚舉。本期美創(chuàng)安全實(shí)驗(yàn)室將帶大家了解PHP文件包含漏洞的產(chǎn)生原因和漏洞原理。
漏洞簡介
文件包含漏洞(File Inclusion)是一種常見的依賴于腳本運(yùn)行從而影響Web應(yīng)用的漏洞。嚴(yán)格來說,文件包含漏洞是“代碼注入”的一種,許多腳本語言,例如PHP、JSP、ASP、.NET等,都提供了一種包含文件的功能,這種功能允許開發(fā)者將可使用的腳本代碼插入到單個(gè)文件中保存,在需要調(diào)用的時(shí)候可以直接通過載入文件的方式執(zhí)行里面的代碼,但是如果攻擊者控制了可執(zhí)行代碼的路徑,也就是文件位置時(shí),攻擊者可以修改指定路徑,將其指向一個(gè)包含了惡意代碼的惡意文件。
文件包含漏洞通常都會使Web服務(wù)器的文件被外界瀏覽導(dǎo)入信息泄露,執(zhí)行的惡意腳本會導(dǎo)致網(wǎng)站被篡改,執(zhí)行非法操作,攻擊其他網(wǎng)站,獲取WebShell等嚴(yán)重危害。
漏洞產(chǎn)生原理
在上一節(jié)的描述中我們提到,攻擊者通過控制可執(zhí)行代碼的路徑就可以實(shí)現(xiàn)文件包含漏洞,這只是一個(gè)對整體攻擊流程的簡化描述,在實(shí)際情境下,服務(wù)器解析執(zhí)行php文件時(shí)通過包含函數(shù)可以加載另一個(gè)文件中的php代碼,當(dāng)被包含的文件中存在木馬時(shí),就意味著木馬程序會在服務(wù)器上加載執(zhí)行。
所以產(chǎn)生文件包含漏洞的根本原因在于開發(fā)者是否對通過包含函數(shù)加載的文件進(jìn)行了嚴(yán)格且合理的校驗(yàn),在PHP中總共有四種文件包含函數(shù):
1)Include():包含并運(yùn)行指定的文件,只有在程序執(zhí)行到include時(shí)才包含文件,且當(dāng)包含文件發(fā)生錯誤時(shí),程序警告,但會繼續(xù)執(zhí)行。
2)Require():只要程序一運(yùn)行就會執(zhí)行該包含文件函數(shù),當(dāng)包含文件發(fā)生錯誤時(shí),程序直接終止執(zhí)行。
3)Include_once():和include()類似,不同之處在于include_once會檢查這個(gè)文件是否已經(jīng)被導(dǎo)入,如果已導(dǎo)入、下文便不會再導(dǎo)入。
4)Require_once():和require()類似,不同處在于require_once也是與include_once一樣只導(dǎo)入一次。
根據(jù)被包含文件的位置不同,PHP文件包含漏洞可以分為本地文件包含漏洞(Local File Inclusion,LFI),和遠(yuǎn)程文件包含漏洞(Remote File Inclusion,RFI)。顧名思義,所謂的本地文件包含漏洞指的是攻擊者通過控制包含文件函數(shù),如include(),require()等,加載服務(wù)器本地上的PHP腳本文件,當(dāng)然如果本地的PHP腳本文件都是一些對系統(tǒng)無害的功能性文件,攻擊者也無法進(jìn)行進(jìn)一步的利用,但若是攻擊者能夠配合任意文件上傳漏洞,將惡意文件上傳進(jìn)服務(wù)器中,再通過本地文件包含執(zhí)行該惡意腳本就可以達(dá)到獲得網(wǎng)站控制權(quán)的目的。
而遠(yuǎn)程文件包含漏洞是指攻擊者可以通過文件包含函數(shù)加載其他服務(wù)器上的PHP文件,在實(shí)際項(xiàng)滲透目中,攻擊者可以在自己的服務(wù)器上存放一個(gè)可執(zhí)行的惡意文件,然后通過目標(biāo)網(wǎng)站存在遠(yuǎn)程文件包含漏洞來加載相關(guān)文件,實(shí)現(xiàn)任意命令執(zhí)行。
漏洞復(fù)現(xiàn)
1、PHP本地文件包含漏洞獲取服務(wù)器敏感信息
搭建測試環(huán)境,為了方便演示,我們簡單設(shè)計(jì)了一個(gè)服務(wù)器上的PHP腳本代碼,如下:
其中PHP配置文件中,allow_url_fopen和allow_url_include兩個(gè)參數(shù)默認(rèn)是ON的狀態(tài)。(在本地文件包含漏洞中,allow_url_fopen必須是ON的狀態(tài)allow_url_include的狀態(tài)可以不用必須指定。)
通過訪問該資源,可以判斷使用了文件包含函數(shù)。
服務(wù)器直接將file參數(shù)當(dāng)作文件包含的參數(shù)路徑,并未做任何過濾,攻擊者可以直接在file參數(shù)后面填寫服務(wù)器敏感文件路徑,從而獲得服務(wù)器敏感信息,例如在file后加上../../MYSQL/my.ini即可讀取到服務(wù)器本地的Mysql配置文件。
請輸入評論內(nèi)容...
請輸入評論/評論長度6~500個(gè)字
圖片新聞
最新活動更多
- 高級軟件工程師 廣東省/深圳市
- 自動化高級工程師 廣東省/深圳市
- 光器件研發(fā)工程師 福建省/福州市
- 銷售總監(jiān)(光器件) 北京市/海淀區(qū)
- 激光器高級銷售經(jīng)理 上海市/虹口區(qū)
- 光器件物理工程師 北京市/海淀區(qū)
- 激光研發(fā)工程師 北京市/昌平區(qū)
- 技術(shù)專家 廣東省/江門市
- 封裝工程師 北京市/海淀區(qū)
- 結(jié)構(gòu)工程師 廣東省/深圳市