漏洞概述

Emlog博客系统默认后台登陆地址为http://域名/admin/login.php。后台登陆时,错误情况下,验证码未刷新,导致可暴力破解登陆管理员账号。虽然属于低危漏洞,但是在emlog5.3.1和6.0测试版本均存在,不容忽视。

漏洞成因

在admin文件夹下的global.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);
   }
}

当登陆失败的时候,并没有销毁session,验证码没有刷新,可重复使用,导致能够暴力破解。

漏洞复现

phpstudy搭建网站

源码

这是网站源码的压缩包:emlog5.3.1.zip,提取码是rox1

我们下载之后就可以开始搭建了

搭建

首先将下载的压缩包解压到小皮的网站根目录下,以我的为例,即D:\phpstudy_pro\WWW。可以把解压之后的文件夹重命名,这样好记且有便于后续的操作,我把它改成了emlog。之后进入小皮的网站模块,点击创建网站,域名改为重命名之后的名字(没改的话就将域名设为你根目录下的名字)。这边一定要注意的是PHP版本,由于PHP7已经不支持mysql扩展了,但是支持mysqli和pdo_mysql,而我用的是mysql且网站要求配置的也是mysql,所以php版本就不能选的太高,不然后续网站搭不起来。所以这边创建网站就直接选低版本的php即可,当然如果没注意到这点,后续也可以在网站管理模块将php版本调低(我就是这样的,一开始不知道有这个坑)。

image-20220512202019059

这样网站就搭好了,之后点击管理—>打开网站,现在配置MySQL。数据库名设为emlog,这边我是自己创建了一个,因为他说了不会自动创建数据库。之后的mysql用户名和密码就是自己的用户名和密码(如果忘了可以看小皮的数据库模块,里面有记录)。

image-20220512202603086

image-20220512202800456

再来注册一个管理员账户,这边随便设置就行了,此处我把用户名和密码都设成了admin123。之后开始安装就可以了。

image-20220512202726378

image-20220512202818346

Burpsuite抓包

开始爆破

网站搭建完成之后,进入网站首页。点击登录即可进入后台登录界面,我们虽然知道管理员的账号密码(刚创建的),但我们此时为了测试默认是不知道管理员的账号名称以及密码的。在登陆界面随便输个,这边很奇怪啊,我的这个后台登陆界面没有验证码不知道为啥,不过也不影响,因为这里的验证码本来就是形同虚设的。

image-20220512203639119

之后burp抓包

image-20220512203602005

可以看到我们输入的用户名和密码。快捷键 ctrl+I 将包发送到 intruder 模块。进入 positions 模块更改攻击类型为 Cluster bomb,并选择要破解的变量 user 和 pw (注意选择变量的先后顺序,这关乎到后面对应内容的破解)

image-20220512203740628

四种攻击方式

在上述,我们为什么要把攻击类型改为 Cluster bomb 呢?首先我们要了解 burpsuite 的四种攻击类型

1、狙击手模式(Sniper)

Attack No. Position A Position B
0 1 null
1 2 null
2 null 1
3 null 2

添加一个参数,且假设 payload 有两个,那么就会执行两次;
添加两个参数,就会挨个来,第一个参数开始爆破时,第二个不变,如此这样,就会执行四次

我个人理解来看,这是唯一一个多个参数不能同时爆破的攻击类型

2、攻城锤模式(Battering ram)

Attack No. Position A Position B
0 1 1
1 2 2

与sniper模式不同的地方在于,同样情况下,攻击次数减半,且每次两个位置用相同的密码

3、草叉模式(Pitchfork)

Attack No. Position A Position B
0 1 3
1 2 4

可以多组密码本payload,又与攻城锤模式相同的地方在于一一对应

4、集束炸弹模式(Cluster bomb)

Attack No. Position A Position B
0 1 3
1 2 4
2 1 4
3 2 4

跟草叉模式相似的是多个密码本对应多个位置,不同的是不再是一一对应,而是交叉组合(笛卡尔积),每一个密码本里的密码都对应与另一密码本所有密码

所以为什么选择 Cluster bomb 就显而易见了。我们此时并不知道 user 和 pw 的情况,所以我们要让两个变量采用最多的组合方式来进行测试。

继续上述爆破操作,再进入 payload 模块,此时前面所说的顺序性就体现出来了,由于我们先选择的变量是user,所以我们先添加猜测的 user 。如图,这边需要借助字典,但是我没有…其实也不太需要,只是为了测试,所以除了添加正确的之外随便添加一些别的就可以了。

image-20220512204118046

之后添加猜测的 pw,步骤跟上面一样。可见此时Request count已经变了,因为选择的攻击模式使得每个用户名和密码都匹配测试一次

image-20220512204154328

之后可以进入 options 模块选择攻击的线程等(多线程有助于加快破解速度),此处由于我添加的猜测数据很少,可以直接攻击,点击 start attack,得到最终的结果。我们可以根据 status 和 length 两个模块来判断是否成功。此处看到当两个payload都为admin123时,状态和长度都和其他笛卡尔积不同,猜测这就是管理员账户的信息。

image-20220512204312603

尝试登陆成功

image-20220512204500078

漏洞修复建议

1、如果用户登录次数超过设置的阈值,则锁定帐号(有恶意登录锁定帐号的风险)

2、如果某个 IP登录次数超过设置的阈值,则锁定IP

3、增加人机验证机制

4、验证码必须在服务器端进行校验,客户端的一切校验都是不安全的。