米酷cms是一套用户视频搭建的cms,源码中存在大量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查询无数据返回,判断用户不存在进行下一步邮箱判断如下所示:
漏洞位置: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的老哥可以自己去看看。