dedecms5.7 sp2前台修改任意用户密码
dedecms5.7 sp2前台修改任意用户密码
前言
其实这个漏洞出来有一段时间了,不算是一个影响特别大的漏洞,毕竟dede是一个内容管理系统,用户这一块本来就基本没有用。该漏洞的精髓就是一个弱类型的比较:'0.0'=='0'
漏洞版本
该漏洞出现在最新版的dede上,我复现的版本是v5.7 sp2 utf8版本
mark
漏洞影响
允许用户修改任意前台用户的密码,不能对管理员账户造成影响,毕竟管理员账户与前台用户的数据表时分开存放的。而且,前台也不能直接登录管理员账户
漏洞利用条件
- 开启会员模块
- 攻击者拥有一个正常的会员账号
- 目标没有设置安全问题
由于dede默认是没有开启会员功能的,也就是我们不能注册用户,所以要复现该漏洞需要自己开启。请大家自行搜索开启
漏洞复现
首先我先注册两个用户吧 攻击者:000001 密码:123 受害者:test 密码:123 由于dedecms注册用户需要审核,我这里是本地搭的,我直接在数据库里更改一下就行了。
mark 把-10改为0
update dede_member set spacesta=0 where mid=3
执行了该语句你注册的用户就相当于通过了审核了。 现在我们的目标就是把test用户的密码更改为hacker 第一步: 在登录000001用户的前提下,请求
http://{yourwebsite}/member/resetpassword.php?dopost=safequestion&safequestion=0.0&id={userid}
通过burp抓包,并把这个请求发送的repeater中,可以看到返回的包中有一个链接
mark 我们直接访问该链接就可以看到一个更改密码的页面:
mark 我们把密码改为hacker,然后试着登录下
mark 成功利用!下面我们具体来看看漏洞产生的原因
漏洞分析
问题出现在resetpassword.php文件的75行处。
mark
这里的代码大概意思就是把我们传过去的安全$safequestion
以及$safeanswer
与数据库中一开始用户设定的safequestion与safeanswer是否匹配,如果匹配则可以往下进行,相当于验证密保问题。我们要做的就是绕过这里的判断,因为我们这个攻击成功的前提就是用户没有设置密保问题,所以在数据库中safequestion的值如下图:
mark 这里需要做的主要是绕过对safequestion的判断,对safeanswer的判断不需要我们绕过,本身就是满足的。我们可不可以直接传一个safequestion=0过去呢?答案是不行的,因为0在php中empty测试时会返回true。所以我们需要绕过的还有empty这个函数 所以我们直接令safequestion=0.0,0.0可以绕过empty检查,而且由于if判断里面的比较是弱类型比较
0.0 == 0
//true
这样我们就会执行sn函数了,继续追踪一下吧,位于dedecmsmemberincinc_pwd_functions.php:
mark
默认状态下,临时密码的表为空。所以会进入第一个判断,我们去看看newmail函数都做了什么吧。
mark 主要代码我已经用红框圈出来了,第二个红框中的链接也就是最后修改密码链接,只要拿到它我们就可以改密码了。获得这个链接需要通过抓取返回包。
总结
整个流程大概就到这了,可以很清晰的看到该漏洞就是由于那个弱类型的比较,通过构造请求我们可以控制mid(越权),mid也就是不同用户的编号,所以我们可以更改几乎所有用户的密码,只是还不能对管理员做什么。当然这个漏洞结合另外一个dede漏洞可以更改管理员的密码,后续将会进行复现
- React Native调用Android相机图库
- SpringMVC之请求参数的获取方式
- 糖大夫--测量流程性能监控自动化方案设计
- ReactNative调用Android原生模块
- jvm调优的工具介绍
- Python时间序列预测案例研究:巴尔的摩年度用水量
- [一对一课程] 之 设计并实现第一个JS模块?
- React Native 使用react-native-image-picker库实现图片上传功能
- 再谈Android动态链接库
- React Native之Permissions权限适配
- React Native项目实战之fetch请求并填充界面
- CocoaPods使用详解
- 2018年伊始,系统编程语言Rust为何令程序员感到兴奋?
- React Native项目实战之搭建美团个人中心界面
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- IDEA上给文件添加姓名,日期,版本号
- matlab机器人工具箱安装与卸载
- 浅谈Linux下修改/设置环境变量JAVA_HOME的方法
- Linux服务器配置多个svn仓库流程详解
- linux服务器显卡崩溃解决方案
- LINUX查看进程的4种方法(小结)
- Linux下的多线程编程实例解析
- CentOS使用expect批量远程执行脚本和命令
- Centos8最小化部署安装OpenStack Ussuri的详细教程
- 详解Xshell 常见问题及相关配置
- linux安装部署ftp图片服务器的实现方法
- Centos7配置fastdfs和nginx分布式文件存储系统实现过程解析
- 解决Linux常用命令“ll”失效或命令未找到的问题
- 手把手教你在腾讯云上搭建hive3.1.2的方法
- centos6超20TB磁盘的分区格式化的示例代码