天天看點

Web篇(6.3) 12. 檔案包含 ❀ FortiWeb 攻防演練

  【簡介】File Inclusion,即檔案包含漏洞,開發人員将相同的函數寫入單獨的檔案中,需要使用某個函數時直接調用此檔案,無需再次編寫,這種檔案調用的過程稱檔案包含。開發人員為了使代碼更靈活,會将被包含的檔案設定為變量,用來進行動态調用,進而導緻用戶端可以惡意調用一個惡意檔案,造成檔案包含漏洞。

Web篇(6.3) 12. 檔案包含 ❀ FortiWeb 攻防演練

  檔案包含

  檔案包含漏洞,是指當伺服器開啟allow_url_include選項時,就可以通過php的某些特性函數(include(),require()和include_once(),require_once())利用url去動态包含檔案,此時如果沒有對檔案來源進行嚴格審查,就會導緻任意檔案讀取或者任意指令執行。

  檔案包含漏洞分為本地檔案包含漏洞與遠端檔案包含漏洞,遠端檔案包含漏洞是因為開啟了php配置中的allow_url_fopen選項(選項開啟之後,伺服器允許包含一個遠端的檔案)。伺服器通過php的特性(函數)去包含任意檔案時,由于要包含的這個檔案來源過濾不嚴,進而可以去包含一個惡意檔案,而我們可以構造這個惡意檔案來達到自己的目的。

  檔案包含漏洞涉及到php常見包含檔案函數包括:

  include() :當使用該函數包含檔案時,隻有代碼執行到 include() 函數時才将檔案包含進來,發生錯誤時隻給出一個警告,繼續向下執行。

  include_once() :功能和 include() 相同,差別在于當重複調用同一檔案時,程式隻調用一次。

  require() :require() 與 include() 的差別在于 require() 執行如果發生錯誤,函數會輸出錯誤資訊,并終止腳本的運作 。使用 require() 函數包含檔案時,隻要程式一執行,立即調用檔案,而 include() 隻有程式執行到函數時才調用 。require() 在php程式執行前執行,會先讀入 require 所指定引入的檔案,使它變成 PHP 程式網頁的一部份。

  require_once() :它的功能與 require() 相同,差別在于當重複調用同一檔案時,程式隻調用一次。

Web篇(6.3) 12. 檔案包含 ❀ FortiWeb 攻防演練

  安全等級 - Low

  将DVWA的安全等級切換到Low。

Web篇(6.3) 12. 檔案包含 ❀ FortiWeb 攻防演練

    ① 選擇【File Inclusion】,顯示檔案包含頁面,點選【View Source】,檢視源代碼。

Web篇(6.3) 12. 檔案包含 ❀ FortiWeb 攻防演練

    ② 從源代碼可以看出,沒有任何過濾手段,直接顯示page。

Web篇(6.3) 12. 檔案包含 ❀ FortiWeb 攻防演練

    ③ 點選【file1.php】,背景執行了file1.php,傳回了我們的IP位址。

Web篇(6.3) 12. 檔案包含 ❀ FortiWeb 攻防演練

    ④ 點選【file2.php】,背景執行了file2.php,傳回了一段提示資訊。

Web篇(6.3) 12. 檔案包含 ❀ FortiWeb 攻防演練

    ⑤ 點選【file3.php】,背景執行了file3.php,傳回了帳号名、IP位址、浏覽器資訊以及從哪個網址跳轉過來的等等。

Web篇(6.3) 12. 檔案包含 ❀ FortiWeb 攻防演練

    ⑥ 由于low級别的代碼對包含的檔案沒有進行任何的過濾,這導緻我們可以進行包含任意的檔案。當我們包含一個不存在的檔案 error.php 時,可以看到發生了報錯,第一行報錯表示找不到指定的檔案,第二行報錯是因為沒有指定的檔案,檔案包含時發生錯誤 ,并且暴露了網站的完整路徑。

Web篇(6.3) 12. 檔案包含 ❀ FortiWeb 攻防演練

    ⑦  将檔案名替換成 /etc/shadow ,顯示沒有這個檔案,說明伺服器系統不是Linux。

Web篇(6.3) 12. 檔案包含 ❀ FortiWeb 攻防演練

     ⑧ 将檔案名替換成絕對路徑 C:\xampp\htdocs\DVWA\php.ini,成功讀取了伺服器的php.ini檔案。

Web篇(6.3) 12. 檔案包含 ❀ FortiWeb 攻防演練

      ⑨ 将檔案名替換成相對路徑 ..\..\..\..\..\xampp\htdocs\DVWA\php.ini,成功讀取了伺服器的php.ini檔案。

Web篇(6.3) 12. 檔案包含 ❀ FortiWeb 攻防演練

  安全等級 - Medium

  将安全等級更新為中級。

Web篇(6.3) 12. 檔案包含 ❀ FortiWeb 攻防演練

    ① 從源代碼可以看出,代碼使用 str_replace() 函數對 http:// 和 https:// 進行了過濾,防止了遠端包含漏洞的産生,也過濾了 ../ 和 ..\ 防止了進行目錄切換的包含。

Web篇(6.3) 12. 檔案包含 ❀ FortiWeb 攻防演練

    ② 但是使用 str_replace() 函數進行過濾是很不安全的,因為可以使用雙寫繞過。将檔案名替換成相對路徑 ..././..././..././..././..././xampp\htdocs\DVWA\php.ini ,成功讀取了伺服器的php.ini檔案。

Web篇(6.3) 12. 檔案包含 ❀ FortiWeb 攻防演練

     ③ 将檔案名替換成絕對路徑 C:\xampp\htdocs\DVWA\php.ini,仍然可以成功讀取伺服器的php.ini檔案。

Web篇(6.3) 12. 檔案包含 ❀ FortiWeb 攻防演練

  安全等級 - High

  将安全等級更新為進階。

Web篇(6.3) 12. 檔案包含 ❀ FortiWeb 攻防演練

     ① 從源代碼可以看出,使用了 fnmatch() 函數檢查page參數,要求page參數的開頭必須是file,伺服器才會去包含相應的檔案。

Web篇(6.3) 12. 檔案包含 ❀ FortiWeb 攻防演練

     ② 隻能包含file開頭的檔案,看似安全,但依然可以利用file協定繞過防護政策。将檔案名替換成相對路徑 file:///C:\xampp\htdocs\DVWA\php.ini ,成功讀取了伺服器的php.ini檔案。

Web篇(6.3) 12. 檔案包含 ❀ FortiWeb 攻防演練

  安全等級 - Impossible

  将安全等級更新為不可能。

Web篇(6.3) 12. 檔案包含 ❀ FortiWeb 攻防演練

     ① 從源代碼可以看出,代碼使用了白名單機制進行防護,簡單粗暴,page參數必須為“include.php”、“file1.php”、“file2.php”、“file3.php”之一,徹底杜絕了檔案包含漏洞。

Web篇(6.3) 12. 檔案包含 ❀ FortiWeb 攻防演練

  FortiWeb 防護

  FortiWeb可以阻止這一類的攻擊。

Web篇(6.3) 12. 檔案包含 ❀ FortiWeb 攻防演練

     ① 通路192.168.1.128,也就是經過FortiWeb保護的DVWA,安全選擇Low,選擇File Inclusion。

Web篇(6.3) 12. 檔案包含 ❀ FortiWeb 攻防演練

     ② 一般.htaccess檔案可以用來留後門和針對黑名單繞過,将上傳檔案名替換成 /../../admin/.htaccess,FortiWeb VM彈出阻止頁面。

Web篇(6.3) 12. 檔案包含 ❀ FortiWeb 攻防演練

     ③ 在FortiWeb VM的【日志和報表】-【日志通路】-【攻擊】,可以根據消息ID查找到消息日志,詳細的介紹了檔案包含被阻止的資訊。

Web篇(6.3) 12. 檔案包含 ❀ FortiWeb 攻防演練