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']);