pikachu靶場-暴力破解


接下來我們開始進入pikachu的學習了。

Pikachu下載地址

下載地址1:https://github.com/zhuifengshaonianhanlu/pikachu
下載地址2:https://pan.baidu.com/s/1JpJjLDQF5DXIuxbgmclRbA 提取碼:ulm5

將其放入WWW文件下即可,在此我就不贅述了,網上的教程很多。

暴力破解

一、概述

Burte Force(暴力破解)概述
“暴力破解”是一攻擊具手段,在web攻擊中,一般會使用這種手段對應用系統的認證信息進行獲取。 其過程就是使用大量的認證信息在認證接口進行嘗試登錄,直到得到正確的結果。 為了提高效率,暴力破解一般會使用帶有字典的工具來進行自動化操作。
理論上來說,大多數系統都是可以被暴力破解的,只要攻擊者有足夠強大的計算能力和時間,所以斷定一個系統是否存在暴力破解漏洞,其條件也不是絕對的。 我們說一個web應用系統存在暴力破解漏洞,一般是指該web應用系統沒有采用或者采用了比較弱的認證安全策略,導致其被暴力破解的“可能性”變的比較高。 這里的認證安全策略, 包括:
1.是否要求用戶設置復雜的密碼;
2.是否每次認證都使用安全的驗證碼(想想你買火車票時輸的驗證碼~)或者手機otp;
3.是否對嘗試登錄的行為進行判斷和限制(如:連續5次錯誤登錄,進行賬號鎖定或IP地址鎖定等);
4.是否采用了雙因素認證;
...等等。
千萬不要小看暴力破解漏洞,往往這種簡單粗暴的攻擊方式帶來的效果是超出預期的!

你可以通過“BurteForce”對應的測試欄目,來進一步的了解該漏洞。

從來沒有哪個時代的黑客像今天一樣熱衷於猜解密碼 ---奧斯特洛夫斯基

 

二、基於表單的暴力破解

 知識補充

  1. Sinper:一個變量設置一個payload進行攻擊
  2. Battering ram:可以設置兩個變量,把payload同時給兩個變量
  3. Pitchfork:兩個變量分別設置payload,然后按順序一一對應進行破解
  4. Cluster bomb:兩個變量分別設置payload,然后交叉列所有情況進行破解(常用)

①配置瀏覽器代理,使用burpsuite抓包,發送至Intruder(入侵者)模塊

 

 

②如圖所示設置攻擊類型Attack type以及變量。

 

 

③在playloads中添加變量的字典,點擊load加載,並開始破解。

 

 

④根據爆破返回出的長度確定正確用戶名以及密碼。 (admin-123456) 當然了,正確的用戶名和密碼有很多,這個只是我的字典爆出的,受字典影響,肯定不全。

 

 

 

三、驗證碼繞過(on server)服務器

 

 

if(isset($_POST['submit'])) {
    if (empty($_POST['username'])) {
        $html .= "<p class='notice'>用戶名不能為空</p>";
    } else {
        if (empty($_POST['password'])) {
            $html .= "<p class='notice'>密碼不能為空</p>";
        } else {
            if (empty($_POST['vcode'])) {
                $html .= "<p class='notice'>驗證碼不能為空哦!</p>";
            } else {
//              驗證驗證碼是否正確
                if (strtolower($_POST['vcode']) != strtolower($_SESSION['vcode'])) {
                    $html .= "<p class='notice'>驗證碼輸入錯誤哦!</p>";
                    //應該在驗證完成后,銷毀該$_SESSION['vcode']
                }else{

                    $username = $_POST['username'];
                    $password = $_POST['password'];
                    $vcode = $_POST['vcode'];

                    $sql = "select * from users where username=? and password=md5(?)";
                    $line_pre = $link->prepare($sql);

                    $line_pre->bind_param('ss',$username,$password);

                    if($line_pre->execute()){
                        $line_pre->store_result();
                        //雖然前面做了為空判斷,但最后,卻沒有驗證驗證碼!!!
                        if($line_pre->num_rows()==1){
                            $html.='<p> login success</p>';
                        }else{
                            $html.= '<p> username or password is not exists~</p>';
                        }
                    }else{
                        $html.= '<p>執行錯誤:'.$line_pre->errno.'錯誤信息:'.$line_pre->error.'</p>';
                    }
                }
            }
        }
    }
}

  分析源碼,在比較完驗證碼后,沒有重置驗證碼,漏洞由此可見,在我們輸入了正確的驗證碼之后,驗證碼並沒有過期,一直有效,可以繼續使用。

①同樣我們通過burpsuite抓包,發送至intruder模塊,將驗證碼改為正確的驗證碼(因為正確的驗證碼一直有效),這樣的們就可以繞過驗證碼來爆破用戶名和密碼了。

 

 

過程相似,我不一一截圖了,參考表單的步驟。

②開始爆破,根據返回包長度判斷正確的密碼。

 

 ③登錄測試,登陸成功。

 

 

四、驗證碼繞過(on client)客戶端

 

 

 這關依舊有驗證碼,通過觀察源碼不難發現,此次驗證碼是在前端中的js代碼進行驗證,與上一關的服務器端驗證不同。

<script language="javascript" type="text/javascript">
    var code; //在全局 定義驗證碼
    function createCode() {
        code = "";
        var codeLength = 5;//驗證碼的長度
        var checkCode = document.getElementById("checkCode");
        var selectChar = new Array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9,'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z');//所有候選組成驗證碼的字符,當然也可以用中文的

        for (var i = 0; i < codeLength; i++) {
            var charIndex = Math.floor(Math.random() * 36);
            code += selectChar[charIndex];
        }
        //alert(code);
        if (checkCode) {
            checkCode.className = "code";
            checkCode.value = code;
        }
    }

    function validate() {
        var inputCode = document.querySelector('#bf_client .vcode').value;
        if (inputCode.length <= 0) {
            alert("請輸入驗證碼!");
            return false;
        } else if (inputCode != code) {
            alert("驗證碼輸入錯誤!");
            createCode();//刷新驗證碼
            return false;
        }
        else {
            return true;
        }
    }


    createCode();
</script>

  

①Burpsuite抓包發送至Intruder模塊。

 

 

②添加字典開始爆破。

 

 

 

五、token防爆破

 

 

①利用burpsuite抓取數據包,我們發現登錄時提交了username,password,token,submit四個參數,每次服務器返回的登錄頁面都會包含一個隨機的token值,這樣每次提交都要驗證token值,表面上可以防止爆破,但是后端產生的token每次都會以明文形式傳到前端,從而產生了漏洞。

 

 

②將抓取的數據包發送至Intruder模塊

③將Attack type 設置為pitch fork,為password和token值添加payload標志。

 

 

④在options欄中找到Grep-Extract,點擊Add,點擊Refetch response,進行請求,選取提取的token字符串,上面會自動填入數據的起始和結束標識,將此值保存下來,后面會用到。另外,將線程更改為1.

 

 

 

 ⑤在payloads欄中,將1變量設置密碼字典,將2變量(token)選擇為Recursive grep,並在下面如圖所示的地方填入保存的值。

 

 

 

 ⑥從Results中可以看到上一次訪問得到的token作為了本次請求的參數。而且從響應信息上也可以看到,沒有提示token錯誤。長度不一樣的password即為密碼。

 

 

 注:recursive grep類型只能單線程attack。(剛才我就忘了設置導致不能攻擊)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM