PHPCMS v9.5.8-设计缺陷可重置前台任意用户密码
验证。参考漏洞:http://wooyun.jozxing.cc/static/bugs/wooyun-2015-0152291.html
漏洞出现在/phpcms/modules/member/index.php 第1687-1756行
public_forget_password_username()函数
public function public_forget_password_username() {
$step = intval($_POST['step']);
$step = max($step,1);
$this->_session_start(); if(isset($_POST['dosubmit']) && $step==2) {
//处理提交申请,以手机号为准
if ($_SESSION['code'] != strtolower($_POST['code'])) {
showmessage(L('code_error'), HTTP_REFERER);
}
$username = safe_replace($_POST['username']); $r = $this->db->get_one(array('username'=>$username),'userid,email');
if($r['email']=='') {
$_SESSION['userid'] = '';
$_SESSION['code'] = '';
showmessage("该账号没有绑定手机号码,请选择其他方式找回!");
} else {
$_SESSION['userid'] = $r['userid'];
$_SESSION['email'] = $r['email'];
}
$email_arr = explode('@',$r['email']);
include template('member', 'forget_password_username');
} elseif(isset($_POST['dosubmit']) && $step==3) {
$sms_report_db = pc_base::load_model('sms_report_model');
$mobile_verify = $_POST['mobile_verify'];
$email = $_SESSION['email'];
if($email){
if(!preg_match('/^([a-z0-9_]+)@([a-z0-9_]+).([a-z]{2,6})$/',$email)) exit('check email error');
if($_SESSION['emc_times']=='' || $_SESSION['emc_times']<=0){
showmessage("验证次数超过5次,验证码失效,请重新获取邮箱验证码!",HTTP_REFERER,3000);
}
$_SESSION['emc_times'] = $_SESSION['emc_times']-1;
if($_SESSION['emc']!='' && $_POST['email_verify']==$_SESSION['emc']) { $userid = $_SESSION['userid'];
$updateinfo = array();
$password = random(8,"23456789abcdefghkmnrstwxy");
$encrypt = random(6,"23456789abcdefghkmnrstwxyABCDEFGHKMNRSTWXY");
$updateinfo['encrypt'] = $encrypt;
$updateinfo['password'] = password($password, $encrypt); $this->db->update($updateinfo, array('userid'=>$userid));
$rs = $this->db->get_one(array('userid'=>$userid),'phpssouid');
if(pc_base::load_config('system', 'phpsso')) {
//初始化phpsso
$this->_init_phpsso();
$this->client->ps_member_edit('', '', '', $password, $rs['phpssouid'], $encrypt);
}
$_SESSION['email'] = '';
$_SESSION['userid'] = '';
$_SESSION['emc'] = '';
$_SESSION['code'] = '';
pc_base::load_sys_func('mail');
sendmail($email, '密码重置通知', "您在".date('Y-m-d H:i:s')."通过密码找回功能,重置了本站密码。");
include template('member', 'forget_password_username');
exit;
} else {
showmessage("验证码错误!请重新获取!",HTTP_REFERER,3000);
}
} else {
showmessage("非法请求!");
}
} else {
include template('member', 'forget_password_username');
}
}
经历了第一步:
$step = intval($_POST['step']);
$step = max($step,1);
$this->_session_start(); 这时候开启_session_start(),然后从phpcms_session取session的值,
然后在第二步时,验证下账户有没有绑定邮箱。然后就返回这个页面。点击获取邮箱校验码。
这时候的url是这样的。
/index.php?m=member&c=index&a=public_get_email_verify&session_code=ftrz&random=0.08188270693514244
执行public_get_email_verify()函数。
public function public_get_email_verify() {
pc_base::load_sys_func('mail');
$this->_session_start();
$code = $_SESSION['emc'] = random(8,"23456789abcdefghkmnrstwxy");
$_SESSION['emc_times']=5;
$message = '您的验证码为:'.$code; sendmail($_SESSION['email'], '邮箱找回密码验证', $message);
echo '1';
}
}
然后随机生成$_SESSION['emc']的值,利用sendmail发送邮件,发完以后走第三步,验证校验码。
这时候的session中存在$_SESSION['emc']的值,也就是发送到邮件中的值。对于session,只要浏览器不关,session值就会一直存在本地,除非过期了。
然后我们退回到第一步,输入要重置的另一个账号,这时候的$_SESSION['emc']值是第一个账户的。
然后不走点击获取验证码,直接来到
elseif(isset($_POST['dosubmit']) && $step==3) {
输入第一个账户的$_SESSION['emc']值,然后进行第三步校验,
if($_SESSION['emc']!='' && $_POST['email_verify']==$_SESSION['emc'])
这时候的浏览器中的$_SESSION['emc']值我们是知道的,所以也能进入这个if,然后重置第二个账户的密码。
这个漏洞在phpcmsv9.6.0 中修复了,修复方案就是在第一步查询$username是否有绑定邮箱的时候加入两句话,清空$_SESSION['emc']的值,确保在重置当前账户的时候,session中的userid,email是用户所指定的。
PHPCMS v9.5.8-设计缺陷可重置前台任意用户密码的更多相关文章
- 代码审计-DedeCMS-V5.7前台任意用户密码重置
0x01 漏洞影响 该漏洞允许攻击者修改任意前台用户密码. 0x02 漏洞利用条件 1,开启会员模块 2,攻击者拥有一个正常的会员账号 3,目标没有设置安全问题 0x03 漏洞分析 漏洞文件:/mem ...
- zzcms8.2#任意用户密码重置#del.php时间盲注#复现
00x0 引言 早上起来,发现seebug更新了一批新的洞, 发现zzcms8.2这个洞好多人在挖,于是我就默默的踏上了复现之路(要不是点进去要买详情,我何必这么折腾~) 环境:zzcms8.2(产品 ...
- gitlab修改(重置)root用户密码
gitlab修改(重置)root用户密码 1.使用root权限登录到服务器. 2.使用以下命令启动控制台: gitlab-rails console production 该命令有时候启动比较慢,需 ...
- PHPCMS v9.6.0 任意用户密码重置
参考来源:http://wooyun.jozxing.cc/static/bugs/wooyun-2016-0173130.html 他分析的好像不对.我用我的在分析一次. 先来看poc: /inde ...
- 任意用户密码重置的十种姿势=====>学习笔记!
原学习视频链接:https://www.butian.net/School/content?id=214%E2%80%98 1.验证码不失效 原因:获取的验证码缺少时间限制,仅判断验证码是否不正确而未 ...
- 如何重置Gitlab root用户密码
一.切换到root用户 sudo su 二.进入gitlab控制台 gitlab-rails console production 三.查找用户对象 user = User.).first 四.重置密 ...
- Dbshop v1.3任意用户密码重置漏洞
0x00 前言 年也过的差不多了,各自也都回到岗位忙碌起来了,新的一年祝大家诸事顺利,洞洞高危!好了进入正题 0x01 漏洞简介 本次主要写个简单的逻辑漏洞!然后抛个Message 内置高危. 1.找 ...
- [典型漏洞分享]YS忘记密码机制设计存在缺陷,导致任意用户口令均可被修改【高】
记录了安全测试过程中发现的一些典型的安全问题 YS忘记密码机制存在缺陷,可导致任意用户口令被修改[高] 问题描述: YS网站提供用户密码修改功能,当用户忘记密码时可通过该功能找回密码,但该修改密码的流 ...
- ZZCMS8.2 用户密码重置漏洞
前言 一个找回密码处的逻辑漏洞, 还是有点意思的. 正文 首先是定位找回密码功能对应的代码位置,使用找回密码的功能,然后抓包即可 下面去 getpassword.php 里面看看, 首先包含了一些文件 ...
随机推荐
- 2017年秋软工-领跑衫获奖感言&我最感谢的人
啥都不说,先上幅图.获得领跑衫,开心. 一.回忆 这是我第二次来上恩师杨的软件工程,第一次是2016年春,那时候我还是本科三年级的学生.忘了第一次为啥去蹭课,印象中是我的榜样亮哥把我给忽悠过去的?我也 ...
- 听翁恺老师mooc笔记(9)--枚举
枚举类型的定义 用符号而不是具体的数字来表示程序中的数字,这么表示的好处是可读性,当别人看你的程序,看到的是单词,很容易理解这些数字背后的含义,那么用什么符号来表示名字哪?需要const int常量的 ...
- Beta冲刺NO.7
Beta冲刺 第七天 昨天的困难 昨天的困难在一些多表查询上,不熟悉hibernate的套路,走了很多弯路. 第一次使用图表插件,在图表的显示问题上花了一定的时间. 对于页面绑定和后台数据自动填充的理 ...
- c++第0次作业
1.你认为大学的学习生活.同学关系.师生应该是怎样? 随着大学生活的慢慢到来,我开始领悟到大学并不是自由的天堂,相反,我们更加的走进社会这个牢笼.在这个牢笼中有着从前的我们并不需要在意和考虑的规则与问 ...
- C语言——第七周作业
题目 题目一:求交错序列前N项和 1.实验代码 #include <stdio.h> int main() { int n , i , b ; , a , c ; scanf(" ...
- router问题
var http = require("http"); var router = require("./router.js"); //创建服务器 var ser ...
- Twisted UDP编程技术
实战演练1:普通UDP UDP是一种无连接对等通信协议,没有服务器和客户端概念,通信的任何一方均可通过通信原语直接和其他方通信 1.相对于TCP,UDP编程只需定义DatagramProtocol子类 ...
- prototype 原型链
// 方法1 var aa=function(){ function bb(){ this.name="1111"; console.log(this.name) }; bb.pr ...
- Vim 中文社区:期待你的加入
我们的愿景 Vim 中文社区一直比较零散,缺少凝聚力,现有的一些群经常也是水的可以的,讨论各种无关紧要的内容,于是导致很大一部分人,将这些群丢入了群助手,渐渐地他们也淡出了 vim 中文社区. 而我理 ...
- Something about SeekingJob---Resume简历
这几天脑子里满满的装的都是offer.offer.offer快到碗里来,但是offer始终不是巧克力,并没那么甜美可口易消化. 找工作刚开始,就遇到了不小的阻力,看到Boss直聘上各种与IT相关的工作 ...