一、前言

米酷cms是一套用户视频搭建的cms,源码中存在大量sql注入,选了两处进行记录其余过程原理和过程都一样就不记录了。

二、注册处SQL注入

漏洞位置:\ucenter\reg.php,第1~18行。

系统在system\library.php中对$_GET$_POST等使用addslashes()函数进行了全局过滤,如下所示:

而在ucenter\reg.php文件中接受前端传入的username参数后使用stripslashes()函数去除了反斜杠,然后拼接进入数据库查询操作造成sql注入如下所示:
漏洞复现:
首先注册一个正常用户,然后在进行注册抓取相应的注册数据添加单引号,按照代码执行逻辑,sql语句单引号未闭合导致sql语句执行出错返回为null,代码判断即为用户名不存在,进入下一步判断邮箱是否存在。故利用此来进行注入
如下所示:kobe为注册存在的用户名,使用and永真条件判断sql查询返回用户数据,故显示用户名存在:

使用and永假条件sql查询无数据返回,判断用户不存在进行下一步邮箱判断如下所示:

三、基于时间的sql盲注

漏洞位置:admin\model\admin_edit.php第1-23行,漏洞参数id漏洞代码如下所示:

<?php

if (isset($_POST['save'])) {
    null_back($_POST['a_name'], '请填写登录账号');
    null_back($_POST['a_password'], '请填写登录密码');
    null_back($_POST['a_cpassword'], '请重复输入登录密码');
    if ($_POST['a_password'] != $_POST['a_cpassword']) {
        alert_back('两次输入的密码不一致');
    }
    $result = mysqli_query($conn,'select * from mkcms_manager where m_name = "' . $_POST['a_name'] . '" and m_id <> ' . $_GET['id'] . '');
    if (mysqli_fetch_array($result)) {
        alert_back('登录账号重复,请更换登录账号。');
    }
    $_data['m_name'] = $_POST['a_name'];
    $_data['m_password'] = md5($_POST['a_password']);
    $sql = 'update mkcms_manager set ' . arrtoupdate($_data) . ' where m_id = ' . $_GET['id'] . '';
    if (mysqli_query($conn,$sql)) {
        alert_href('管理员修改成功!', 'cms_admin.php');
    } else {
        alert_back('修改失败!');
    }
}

上述代码直接将前端传入的id参数拼接入sql语句中造成sql注入,此处无任何差异回显,可以使用基于时间的盲注进行,如下所示构造POC

/admin/cms_admin_edit.php?id=3+and+if(1=2,1,sleep(2))

当发送payload中if判断条件为真时if函数值为1,响应时间为几毫秒如下所示:

当发送payload中if条件为假时,sleep(2),响应时间大于4秒(有两个sql语句执行)如下所示:

之后还有很多文件都有注入就不记录了,相冲cnvd的老哥可以自己去看看。

点击收藏 | 0 关注 | 1
  • 动动手指,沙发就是你的了!
登录 后跟帖