暴力破解


暴力破解


原理:攻擊者使用自己的用戶名和密碼字典,一個一個去枚舉,嘗試是否能夠登錄。因為理論上來說,只要字典足夠龐大,枚舉總是能夠成功的!

一、准備工作


設置瀏覽器代理

二、基於表單的暴力破解


在表單中輸入數據提交表單,使用Burp Suite抓包

抓包,提交方式為POST請求,賬號為admin,密碼為asdf,沒有驗證機制,可以暴力破解,將包發送Intruder模塊

在Intruder模塊中Positions選項卡中,選擇攻擊類型:Cluster bomb,選中Clear,清除默認變量,再選中輸入的賬號和密碼,點解Add,添加成變量

選中第一個有效載荷集,點擊Load,導入用戶名的字典

選中第二個有效載荷集,點擊Load,導入密碼的字典,點擊Start attack,進行爆破

查看Length,判斷字典條目是否爆破成功

進行驗證,成功爆破,成功登錄

三、驗證碼繞過(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>';
                    }
                }
            }
        }
    }
}

驗證驗證碼是否正確之后,驗證完成后,並沒有銷毀,導致該驗證碼一致可以使用

輸入用戶名和密碼,並輸入正確的驗證碼,進行抓包

之后與基於表單的暴力破解相似

四、驗證碼繞過(on client)


<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>

在前端對驗證碼進行驗證,可以通過抓包,進行爆破,繞過前端驗證

之后與基於表單的暴力破解相似

五、token防爆破?


輸入用戶名和密碼,進行抓包,發送至Intruder模塊

進入options,Grep-Extract 打勾點擊add,點擊refetch response 找到響應包中的token的值選擇點擊確定。然后在Redirections中選擇always。

選擇on-site only,

將剛才篩選到的token加入下圖輸入處,不然第一遍爆破時就會沒有token

設置線程為1,開始攻擊

繞過token,爆破成功

防御措施


  • 設計安全的驗證碼(安全的流程+復雜而又可用的圖形)

  • 對認證錯誤的提交進行計數並給出限制,比如連續5次密碼錯誤,鎖定兩小時,驗證碼用完后銷毀,能有效防止暴力破解

  • 必要的情況下,使用雙因素認證


免責聲明!

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



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