pikachu靶场第四关-密码爆破之token防爆破?(附代码审计)

先看源代码

if(isset($_POST['submit']) && $_POST['username'] && $_POST['password'] && $_POST['token']){

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

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


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

    if($token == $_SESSION['token']){

        if($line_pre->execute()){
            $line_pre->store_result();
            if($line_pre->num_rows>0){
                $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>';
        }


    }else{
        $html.= '<p> csrf token error</p>';
    }




}


//生成token
set_token();

第一行代码:

isset($_POST['submit']) && $_POST['username'] && $_POST['password'] && $_POST['token']

前面已经说过了,这里就不多讲了,我们直接看最后一个。

token

为什么明明就没有token的输入框,却又要验证输入的token呢?

让我们看看网页的源代码。

 <input type="hidden" name="token" value="6390565f66cf158db7033575345" />

type=hidden可以在表单中设置一些默认值,这些默认值不需要被用户直接修改,例如自动填充某些数据,或者记录用户的操作等。

另外一些敏感数据,例如用户的ID、会话ID等,不需要被用户看到,但又需要在表单提交时一起提交,这时候也可以使用type=hidden。

显而易见,token是已经设定好的默认值,不需要修改,可以自动填充的。

来看后面的代码:

$token == $_SESSION['token']

这里验证输入的token是否与默认的token值相同,这是为了防止密码爆破行为的出现。

就和前两关的验证码是一样的,第二关验证码的漏洞在于,如果默认验证码的值没有变化,那么就可以一直使用该验证码进行爆破,而第三关验证码的漏洞在于,它只做了前端验证,没有后端验证,将前端js禁用后,不论你的验证码输入了什么,都不会在后端进行验证的。

最关键的代码是这一句:

//生成token
set_token();

它会在后端代码每校验一次后,便重置token的值,导致原来的token值失效,从而阻止爆破的发生。

但绕过也很简单,将每次爆破使用token进行更新就行。

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hacker苏序

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值