• 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。(刚才我就忘了设置导致不能攻击)

  • 相关阅读:
    Java实现热替换
    SQL判断字符串里不包含字母
    Useful bat command
    Entity FrameworkCore教程(一):包概念理解
    Docker:Docker常见命令
    ASP.NET Core:ASP.NET Core程序使用Docker部署
    ASP.NET Core:中间件
    ASP.NET Core:依赖注入
    Jenkins:创建定时构建任务
    ASP.NET Core 3.1使用Swagger
  • 原文地址:https://www.cnblogs.com/c1047509362/p/12622650.html
Copyright © 2020-2023  润新知