【筆記】網易微專業-Web安全工程師-04.WEB安全實戰-5.文件包含
文件包含(File Inclusion):是指頁面利用url去動態包含文件(include或require等),當文件名參數可控但又過濾不嚴的時候,就容易被利用。文件包含漏洞分為本地文件包含漏洞與遠程文件包含漏洞,遠程文件包含漏洞是因為開啟了php配置中的allow_url_fopen選項(選項開啟之後,服務器允許包含一個遠程的文件)。
DVWA實戰:
1. 打開phpStudy或xampp,運行Apach和MySQL,這裏要特別打開php的allow_url_include選項:點擊面板“其他選項菜單”->PHP拓展及設置->參數開關設置->勾選“allow_url_include”;
2. 瀏覽器進入DVWA主界面,在左側欄選擇DVWA Security安全等級為Low,然後進入File Inclusion;
我們看到頁面上有三個文件選項,當我們點擊其中一個時,頁面會顯示該文件的內容,同時我們看到url變成了:
http://localhost/DVWA-1.9/vulnerabilities/fi/?page=file1.php
3. 那麽如果我們改變page的參數,是不是就能獲得其它文件?我們試著將參數改為page=../../phpinfo.php,結果我們順利的得到了該頁面的信息:
這樣,我們就利用了文件包含的漏洞,獲取了本不應該呈現給我們的頁面。如果我們查看後臺源碼的話,我們會發現其中就一句話:
$file = $_GET[ ‘page‘ ];
沒有任何的過濾,參數名又可控,就形成了文件包含漏洞。
4. 我們把安全等級調為medium,采用同樣的方法,發現失效了。如果我們看後臺源碼,發現多了兩行過濾控制:
// Input validation $file = str_replace( array( "http://", "https://" ), "", $file ); $file = str_replace( array( "../", "..\"" ), "", $file );
即將”http:// ”、”https://”、 ” ../”、”..\”過濾掉,替換成為空字符。這讓我們想起了在命令註入那節中,也采用了對關鍵命令過濾的方式,因此這啟發了我們可以構造....//的方式,過濾掉其中一個,剩下的剛好能用,例如修改page=....//....//phpinfo.php,同樣獲得了之前的結果。
5. 接下去我們試試high等級的文件包含,發現采用上述的方法,報錯:ERROR: File not found!,查看後臺源碼,發現使用了fnmatch函數檢查page參數,要求page參數的開頭必須是file。
if( !fnmatch( "file*", $file ) && $file != "include.php" ) { // This isn‘t the page we want! echo "ERROR: File not found!";
既然如此,那我們只要讓參數開頭是file就行啦,構造如下url參數:
page=file:///E:/Development/KPlayer/Web/PHP/phpStudy/WWW/DVWA-1.9/phpinfo.php
就能同樣得到之前的頁面。
6. 最後我們來看看impossible安全等級,發現之前的方法都不管用,查看後臺源碼,發現原來使用了白名單機制,page參數必須為“include.php”、“file1.php”、“file2.php”、“file3.php”之一,杜絕了文件包含漏洞。
// 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!";
實戰心得:
當服務器開啟allow_url_include選項時,會通過php的某些特性函數(include(),require()和include_once(),require_once())利用url去動態包含文件,此時如果沒有對文件來源進行嚴格審查,就會導致任意文件讀取或者任意命令執行。因此有效的方法就是采用白名單的方式,防止這種漏洞。
【筆記】網易微專業-Web安全工程師-04.WEB安全實戰-5.文件包含