emlog后台漏洞,可无视验证码爆破密码

大家可能为了防止黑客对emlog博客后台暴力破解,在后台添加了验证码功能。
但即使在Emlog后台添加了验证码,也不安全,就跟没添加一样的。攻击者依然可以使用爆破工具批量猜测密码

代码分析

登录页面,在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是关键函数 我们看他实现的过程
是在includelibloginauth.php文件

public static function checkUser($username, $password, $imgcode, $logincode = false) {
        session_start();
        if (trim($username) == '' || trim($password) == '') {
            return false;
        } else {
            $sessionCode = isset($_SESSION['code']) ? $_SESSION['code'] : '';
            $logincode = false === $logincode ? Option::get('login_code') : $logincode;
            if ($logincode == 'y' && (empty($imgcode) || $imgcode != $sessionCode)) {
                return self::LOGIN_ERROR_AUTHCODE;
            }
            $userData = self::getUserDataByLogin($username);
            if (false === $userData) {
                return self::LOGIN_ERROR_USER;
            }
            $hash = $userData['password'];
            if (true === self::checkPassword($password, $hash)){
                return true;
            } else{
                return self::LOGIN_ERROR_PASSWD;
            }
        }
        
}

SESSION验证方面都不错,当登录失败会调用loginPage方法

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进行销毁。便导致了漏洞的产生
利用:整个流程中,只需要获取一次验证码,接下来就不用获取便可爆破了。
为了证实猜想,用易语言写了个简单的工具
emlog后台漏洞,可无视验证码爆破密码
先获取一次验证码
将密码随机写入脚本,进行登录验证,可以看到,调试出来的就是我们爆破信息,第六个空就是我们正确密码爆破成功的标志

解决办法

登录验证的代码上销毁验证码的session即可 admin/globals.php
unset($_SESSION['code']);
emlog后台漏洞,可无视验证码爆破密码
此时我们在用程序爆破测试
可以看到,除了第一个密码错误以外,其他都需要验证码
emlog后台漏洞,可无视验证码爆破密码
转小草博客

阿里云广告 淘宝优惠券
Last modification:February 10th, 2019 at 01:38 am
If you think my article is useful to you, please feel free to appreciate

Leave a Comment

12 comments

  1. 杨娟

    你的改了吗?我觉得应该爆破试试

  2. Ricky.D.

    感谢大佬的分享

  3. 梓熙博客

    虽然说可以无视验证码进行无数次爆破,但是我的后台密码是随机密码生成的,莫非他能导入10乘10次方的密码数量吗?[滑稽]

    1. 森七
      @梓熙博客

      @梓熙博客:这也和密码强弱有关啦,太复杂的记不住,像我的密码就是123456[滑稽]

  4. 雨染蓝枫叶

    没看懂 是删除 unset($_SESSION['code']); ????

    1. 森七
      @雨染蓝枫叶

      @雨染蓝枫叶:销毁即删除嘛

      1. 雨染蓝枫叶
        @森七

        @森七:刚看下 我的里面本来就没有[微笑]

  5. 特惠吧

    感谢分享,谢谢了

  6. 李明

    昨晚博客被攻击挂了[愤怒]

    1. 森七
      @李明

      @李明:[流泪]可怕

  7. Arlene 凉夏

    来看看

  8. emlog

    感谢分享