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']);
发表评论