漏洞概述
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版本调低(我就是这样的,一开始不知道有这个坑)。
这样网站就搭好了,之后点击管理—>打开网站,现在配置MySQL。数据库名设为emlog
,这边我是自己创建了一个,因为他说了不会自动创建数据库。之后的mysql用户名和密码就是自己的用户名和密码(如果忘了可以看小皮的数据库模块,里面有记录)。
再来注册一个管理员账户,这边随便设置就行了,此处我把用户名和密码都设成了admin
123。之后开始安装就可以了。
Burpsuite抓包
开始爆破
网站搭建完成之后,进入网站首页。点击登录即可进入后台登录界面,我们虽然知道管理员的账号密码(刚创建的),但我们此时为了测试默认是不知道管理员的账号名称以及密码的。在登陆界面随便输个,这边很奇怪啊,我的这个后台登陆界面没有验证码不知道为啥,不过也不影响,因为这里的验证码本来就是形同虚设的。
之后burp抓包
可以看到我们输入的用户名和密码。快捷键 ctrl+I 将包发送到 intruder 模块。进入 positions 模块更改攻击类型为 Cluster bomb,并选择要破解的变量 user 和 pw (注意选择变量的先后顺序,这关乎到后面对应内容的破解)
四种攻击方式
在上述,我们为什么要把攻击类型改为 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 。如图,这边需要借助字典,但是我没有…其实也不太需要,只是为了测试,所以除了添加正确的之外随便添加一些别的就可以了。
之后添加猜测的 pw,步骤跟上面一样。可见此时Request count已经变了,因为选择的攻击模式使得每个用户名和密码都匹配测试一次
之后可以进入 options 模块选择攻击的线程等(多线程有助于加快破解速度),此处由于我添加的猜测数据很少,可以直接攻击,点击 start attack,得到最终的结果。我们可以根据 status 和 length 两个模块来判断是否成功。此处看到当两个payload都为admin123时,状态和长度都和其他笛卡尔积不同,猜测这就是管理员账户的信息。
尝试登陆成功
漏洞修复建议
1、如果用户登录次数超过设置的阈值,则锁定帐号(有恶意登录锁定帐号的风险)
2、如果某个 IP登录次数超过设置的阈值,则锁定IP
3、增加人机验证机制
4、验证码必须在服务器端进行校验,客户端的一切校验都是不安全的。