暴力破解


暴力破解


原理:攻击者使用自己的用户名和密码字典,一个一个去枚举,尝试是否能够登录。因为理论上来说,只要字典足够庞大,枚举总是能够成功的!

一、准备工作


设置浏览器代理

二、基于表单的暴力破解


在表单中输入数据提交表单,使用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