18-PHP代码审计——kkcms逻辑漏洞分析(验证码重放)
Posted songly_
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了18-PHP代码审计——kkcms逻辑漏洞分析(验证码重放)相关的知识,希望对你有一定的参考价值。
影响版本:
kkcms1.36
漏洞环境:
kkcms1.36
php5.6.2
本次复现分析一个cms比较简单的逻辑漏洞,kkcms后台用户登陆存在验证码重放,导致后台用户可进行暴力破解。
定位到kkcms后台用户登陆的功能代码的目录文件admin/cms_login.php
<?php
require_once('../system/inc.php');
if(isset($_POST['submit'])){
//验证验证码
if ($_SESSION['verifycode'] != $_POST['verifycode']) {
alert_href('验证码错误','cms_login.php');
}
//过滤并校验用户名和密码
null_back($_POST['a_name'],'请输入用户名');
null_back($_POST['a_password'],'请输入密码');
null_back($_POST['verifycode'],'请输入验证码');
$a_name = $_POST['a_name'];
$a_password = $_POST['a_password'];
$sql = 'select * from xtcms_manager where m_name = "'.$a_name.'" and m_password = "'.md5($a_password).'"';
$result = mysql_query($sql);
if(!! $row = mysql_fetch_array($result)){
setcookie('admin_name',$row['m_name']);
setcookie('admin_password',$row['m_password']);
header('location:cms_welcome.php');
}else{
//校验失败跳转到登陆页面
alert_href('用户名或密码错误','cms_login.php');
}
}
?>
可以看到后台用户登陆的验证码是存在session中,用户每次登陆的时候都会取出session中的验证码是否正确,不对直接跳转到登录页面,如果验证码正确接着校验用户名和密码,如果校验失败也是直接跳转到登陆页面。这里存在的问题是无论是验证码错误,还是密码错误都没有限制校验的次数和验证码的有效期。
按F12键查看网页源码可以看到登陆页面的验证码存在这么一行html代码,验证码虽然是由后台system/verifycode.php文件生成的
<img src="../system/verifycode.php" onclick="javascript:this.src='../system/verifycode.php?'+Math.random()" style="cursor:pointer;" alt="点击更换" title="点击更换">
verifycode.php文件代码如下
<?php
开启session
session_start();
$image = imagecreate(50, 34);
$bcolor = imagecolorallocate($image, 0, 0, 0);
$fcolor = imagecolorallocate($image, 255, 255, 255);
$str = '0123456789';
$rand_str = '';
for ($i = 0; $i < 4; $i++){
$k = mt_rand(1, strlen($str));
$rand_str .= $str[$k - 1];
}
//生成验证码并保存到session中
$_SESSION['verifycode'] = $rand_str;
imagefill($image, 0, 0, $bcolor);
imagestring($image, 7, 7, 10, $rand_str, $fcolor);
header('content-type:image/png');
imagepng($image);
?>
验证码的生成方式是由前台页面加载JS发送请求,后台接受到请求后就会生成验证码保存到session中,并且没有设置验证码的有效期。这意味着,当用输入验证码或用户名密码错误跳转到cms_login.php登陆页面时,页面中的img标签的src属性会发出二次请求,即加载JS重新生成验证码。
如果不让前端页面加载JS,那么就可以一直利用这个验证码来爆破后台的用户名和密码,达到验证码重放的目的。
我们可以接着Burpsuite工具来实现,并且Burpsuite默认是不会解析JS的。
右键Send to Intruder,将用户名和密码载入到Intruder模块中。
在Intruder模块中的Positions选项中,选中password选择Add添加变量,如下所示
设置好变量后,在Payloads选项中设置Payloads set和 Payloads type,这里我选择Runtime file,然后再pay load Options中点击select file选择对应的字典文件
然后再Options选项中设置Grep - Match响应消息的标识位,当用户名或密码错误时,就会返回“用户名或密码错误”错误信息,因此我们可以把这个当做响应消息的标识位,如下所示:
最后就是等待字典跑完,然后点击Status排序,查看没有标识的状态不一样的,例如302状态的就是正确结果,到这基本可以确定密码为123456
kkcms验证码重放漏洞分析思路总结:
- 用户登陆出现密码错误或者验证码是否有限制次数
- 判断验证码是否设置有效期
- 分析验证码功能的逻辑流程是否存在绕过
以上是关于18-PHP代码审计——kkcms逻辑漏洞分析(验证码重放)的主要内容,如果未能解决你的问题,请参考以下文章
19-PHP代码审计——jizhicms逻辑漏洞分析(由越权引发的sql注入)
19-PHP代码审计——jizhicms逻辑漏洞分析(由越权引发的sql注入)
20-PHP代码审计——damicms5.3-5.4漏洞分析