0×01分析代码

登录页面,在admin/ globals.php下

//登录验证
    if ($action == 'login') {
            $username = isset($POST['user']) ? addslashes(trim($_POST['user'])) : '';
            $password = isset($_POST['pw']) ? addslashes(trim($_POST['pw'])) : '';
            $ispersis = isset($_POST['ispersis']) ? intval($_POST['ispersis']) : false;
            $img_code = Option::get('login_code') == 'y' && isset($_POST['imgcode']) ? addslashes(trim(strtoupper($_POST['imgcode']))) : '';

        $loginAuthRet = LoginAuth::checkUser($username, $password, $img_code);

            if ($loginAuthRet === true) {
                    LoginAuth::setAuthCookie($username, $ispersis);
                    emDirect("./");
            } else{
                    LoginAuth::loginPage($loginAuthRet);
            }
    }

LoginAuth :: checkUser是关键函数我们看他实现的过程

是在include \ lib \ loginauth.php文件

    public static function loginPage($errorCode = NULL) {
            Option::get('login_code') == 'y' ?
            $ckcode = "<span>验证码</span>
            <div class=\"val\"><input name=\"imgcode\" id=\"imgcode\" type=\"text\" />
            <img src=\"../include/lib/checkcode.php\" align=\"absmiddle\"></div>" :
            $ckcode = '';
            $error_msg = '';
            if ($errorCode) {
                            //unset($_SESSION['code']);
                switch ($errorCode) {
                    case self::LOGIN_ERROR_AUTHCODE:
                        $error_msg = '验证错误,请重新输入';
                        break;
                    case self::LOGIN_ERROR_USER:
                        $error_msg = '用户名错误,请重新输入';
                        break;
                    case self::LOGIN_ERROR_PASSWD:
                        $error_msg = '密码错误,请重新输入';
                        break;
                }
            }
            require_once View::getView('login');
            View::output();
        }

但是整个登录流程并没有立即对验证码的SESSION进行销毁。便导致了漏洞的产生
利用:整个流程中,只需要获取一次验证码,接下来就不用获取便可爆破了。

0x02利用流程

但是整个登录流程并没有立即对验证码的会议进行销毁。便导致了漏洞的产生
先访问后台,输入正确的验证码

Ps.因为我把博客后台换个样式,当作参考即可。
然后用拦截发送到intruder


只需要修改密码

0x03解决办法


登录验证的代码上销毁验证码的会话即可admin / globals.php

unset($ SESSION ['code']);

最后修改:2021 年 03 月 09 日
如果觉得我的文章对你有用,请随意赞赏