渗透测试实验--复现实验B
DeDeCMS v5.7 SP2 正式版 前台任意用户密码修改复现实验
一、漏洞概述
简介
织梦内容管理系统(DedeCms) [1] 以简单、实用、开源而闻名,是国内 最知名的 PHP 开源网站管理系统,也是使用用户最多的 PHP 类 CMS 系统, 在经历多年的发展,目前的版本无论在功能,还是在易用性方面,都有了长 足的发展和进步,DedeCms 免费版的主要目标用户锁定在个人站长,功能 更专注于个人网站或中小型门户的构建,当然也不乏有企业用户和学校等在 使用该系统。
漏洞条件
cms版本:DeDeCMS v5.7 SP2 正式版
限制:
1.只影响前台账户
2.只能修改未设置安全问题的账户
环境
php7.3.4
mysql5.7.26
二、环境搭建
本次复现环境搭建在window10物理机下,用phpstudy来搭建网站。
下载源码地址:点击下载 注:如果浏览器下载不了,可以复制连接到迅雷下载
下载完成后解压到phpstudy的www/html目录下
在浏览器访问网站uploads/install来安装网站,这个就不演示了,因为我已经安装好了,文件自动删除了
安装完成后先访问后台打开会员的功能,后台地址: http://127.0.0.1/dedeCMS5.7/uploads/dede/index.php
之后在创建一个用户,但是千万千万不要设置安全问题,这里我设置的密码是test123
创建成功后我们就开始复现
三、漏洞复现
复现过程要用到burpsuite,先用burpsuite打开拦截,然后再浏览器访问
127.0.0.1/dedeCMS5.7/uploads/member/resetpassword.php?dopost=safequestion&safequestion=0.0&safeanswer=&id=3 //这里的id是指会员注册的uid
然后之间发出,后面会在到拦截一个数据包,里面有参数key要记住,然后再发出去,就可以跳转到修改密码的网页
这里的临时验证码就是上面的key,这里我将密码改为123123
然后用修改的密码登入复现成功
代码分析
该漏洞出现的原因在于/member/resetpasswordd.php中的
分析这段代码,这里有两种找回密码的方式,其中漏洞在以安装问题取回密码的代码下
if($row['safequestion'] == $safequestion && $row['safeanswer'] == $safeanswer) { sn($mid, $row['userid'], $row['email'], 'N'); exit(); }
上面的if语句进行了两个判断,判断的是用 ==,这是php的弱比较,在php中 === 和 == 不同,用===进行比较,会先判断两个字符串类型是否相同,再进行比较。
用==进行比较时,会将字符串类型转化成相同的,然后再进行比较。如果比较一个数字和字符串或者比较涉及到数字内容的字符串,则字符串会被转换成数值并且比较按照数值来进行
给个例子:
$row['safequestion']和$row['safeanswer']的值分别是数据库中safequestion和safeanswer的值
可以看到在不设置安全问题时safequestion和safeanswer分别是0和null,其中dopost和safequestion和safeanswer都是我们可控的,于是得到我们的playload:
resetpassword.php?dopost=safequestion&safequestion=0.0&safeanswer=&id=3
临时修复方案
将弱比较改为强比较
if($row['safequestion'] == $safequestion && $row['safeanswer'] == $safeanswer) { sn($mid, $row['userid'], $row['email'], 'N'); exit(); } 改为: if($row['safequestion'] === $safequestion && $row['safeanswer'] === $safeanswer) { sn($mid, $row['userid'], $row['email'], 'N'); exit(); }