【DVWA(九)】文件包含漏洞



文件包含漏洞

前言:

由於開發人員編寫源碼,將可重復使用的代碼插入到單個的文件中,並在需要的時候將它們包含在特殊的功能代碼文件中,然后包含文件中的代碼會被解釋執行。由於並沒有針對代碼中存在文件包含的函數入口做過濾,導致客戶端可以提交惡意構造語句提交,並交由服務器端解釋執行。文件包含攻擊中WEB服務器源碼里可能存在inlcude()此類文件包含操作函數,通過客戶端構造提交文件路徑,是該漏洞攻擊成功的最主要原因。

如果攻擊者為動態包含指令指定一個有效文件,那么該文件的內容會被傳遞給 PHP 解析器,可直接在遠程服務器上執行任意PHP文件。
如果攻擊者能夠指定一條路徑來指向被自己控制的遠程站點,那么動態 include 指令就會執行由攻擊者提供的任意惡意代碼,也就是所謂的“遠程文件包含”。

在開始實驗之前,出現了小問題在最上面出現紅色的 The PHP function allow_url_include is not enabled. 提示,我是用PHP study搭建的學習環境,在軟件界面選擇:其他選項菜單->打開配置文件->php-ini


low:

1.觀察:
分別點擊三個文件,可以通過觀察看到,url分別是:
http://127.0.0.1/dvwa/vulnerabilities/fi/?page=file1.php
http://127.0.0.1/dvwa/vulnerabilities/fi/?page=file2.php
http://127.0.0.1/dvwa/vulnerabilities/fi/?page=file3.php
只有page后面有變化
2.測試:
http://127.0.0.1/dvwa/vulnerabilities/fi/?page=http://127.0.0.1/index.php
可以發現打開了www文件夾下的index.php文件
也就是說通過page=“”的形式,可以查看你想要受害者查看的文件,配合文件上傳漏洞,就可以輕易的形成破壞。

medium:

1.測試:
繼續用http://127.0.0.1/dvwa/vulnerabilities/fi/?page=http://127.0.0.1/index.php進行測試,發現報錯
failed to open stream: No such file or directory
說明不能這樣直接在page后打開
2.嘗試其他方法:
但是第二行大的報錯給了信息了:Failed opening '127.0.0.1/index.php' for inclusion
所以先嘗試page=后大小寫混合http://127.0.0.1/dvwa/vulnerabilities/fi/?page=Http://127.0.0.1/index.php
完美,可以的!

high:

1.嘗試:
http://127.0.0.1/dvwa/vulnerabilities/fi/?page=http://127.0.0.1/index.php
http://127.0.0.1/dvwa/vulnerabilities/fi/?page=Http://127.0.0.1/index.php
http://127.0.0.1/dvwa/vulnerabilities/fi/?page=../../index.php
均失敗,而且錯誤一致!

2.查看:
懷疑是對?page=后內容進行了判斷,查看源代碼
其中有  if( !fnmatch( "file*", $file ) && $file != "include.php" )  ,果然,進行了"file"匹配,所以把page后的內容改為file開頭的
http://127.0.0.1/dvwa/vulnerabilities/fi/?page=file://C:/phpStudy/PHPTutorial/WWW/index.php
執行成功!其中C:/phpStudy/PHPTutorial/WWW/是服務器中的絕對路徑

impossible:

impossible模式目前看來無懈可擊;

配合所有等級的源代碼分析:
low:

<?php
// The page we wish to display
$file = $_GET[ 'page' ];
?> 

沒有任何防護,可以任意破壞,現實中肯定沒有這樣的。
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 );
?> 

黑名單模式,把"http://","https://","../","..\"",替換成空"",實際上黑名單不安全,有限,轉換大小寫輕易繞過。
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;
}
?> 

白名單模式,但是這里白名單算是留了后路,因為只是同意file開頭,絕對路徑可以侵入。

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

絕對白名單,只有四個文件可以,這樣一來就很安全了,除非把服務器里這個四個文件給改了。


后記:

漏洞攻擊的前提是:基本摸清了想要攻擊的網站結構,敏感文件的路徑可以得到(絕對路徑),對攻擊頁面可控


免責聲明!

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



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