简介及安装

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;

}

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=

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 "找回密码失败";

      }

    }

  }

}

?>

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

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');

    }

代码审计

代码审计

跳转后就会刷新验证码,然而我用的是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'");

前面说到全局对$_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);

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'");

任意用户密码找回(密码可被穷举)
这个问题主要是/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');

?>

全局搜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