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验证码重放漏洞分析思路总结:

  1. 用户登陆出现密码错误或者验证码是否有限制次数
  2. 判断验证码是否设置有效期
  3. 分析验证码功能的逻辑流程是否存在绕过

以上是关于18-PHP代码审计——kkcms逻辑漏洞分析(验证码重放)的主要内容,如果未能解决你的问题,请参考以下文章

PHP代码审计18—PHP代码审计小结

19-PHP代码审计——jizhicms逻辑漏洞分析(由越权引发的sql注入)

19-PHP代码审计——jizhicms逻辑漏洞分析(由越权引发的sql注入)

20-PHP代码审计——damicms5.3-5.4漏洞分析

20-PHP代码审计——damicms5.3-5.4漏洞分析

代码审计系列:审计思路学习笔记