注册用户名时$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被拼接到数据库进行了判断处理。
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数网络安全工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上网络安全知识点!真正的体系化!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
链图片转存中…(img-iFHi48VK-1715532523036)]
[外链图片转存中…(img-aFRneK39-1715532523036)]
[外链图片转存中…(img-TyfDwiBa-1715532523036)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上网络安全知识点!真正的体系化!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!