前台任意修改密码-织梦复现漏洞
-
实验目的
实现dedecms前台修改密码进入后台漏洞复现
-
实验内容、原理
通过分析代码部分,dedecms中使用了对弱类型的判断,所以可以直接绕过弱类型比较任意修改密码。
-
实验过程
首先安装好PHPstudy环境(https://www.xp.cn/download.html)
织梦版本:DedeCMS-V5.7
-
将Apache和mysql打开
-
把解压后的dedecms源码里的upload放入到phpstudy的目录www文件夹中。
-
网址:127.0.0.1/DedeCMS/uploads/install/index.php进行安装织梦
(数据库的前缀不用修改,一般填写数据库用户,密码,名称,其他地方不用修改)
安装完成,开始准备复现。
登入网站后台,注册账号。
开始复现
-
把注册账号改为会员级别,否则无法访问member.php,
2、设置好后,进入网址,修改密码
http://127.0.0.1/dedecms/member/resetpassword.php
post:
dopost=safequestion&safequestion=0.0&safeanswer=&id=1(注:id=1,因为这里只申请了一个账号)
抓包截取,
3、获取本地地址,得到关键的key。
4、在访问得到链接,跳过检测,直接填入新密码就可以成功登入,完成复现。
代码漏洞分析
分析D:\phpstudy_pro\WWW\dedecms\member\中的resetpassword.php中的代码
如下,可以看到有两种取回密码,登入账号的情况。
第一种是,邮件方式
第二种是,安全问题取回密码
其中,看到安全问题取回密码代码部分,
If语句中
if($row['safequestion']==$safequestion&&$row['safeanswer']==$safeanswer)
{
sn($mid, $row['userid'], $row['email'], 'N');
exit();
}
判断安全问题时使用了PHP的弱等于符号,很容易绕过判断;而在这里我们的admin账号又不设置有安全问题,可以看到safequestion和safeanswer
的值为空或者0,
说明可以手动控制它的变量,所以直接构造:
dopost=safequestion&safequestion=0.0&safeanswer=&id=1,进入修改密码界面
进而登入后台。
代码修复
把弱比较化成强比较,使得安全问题不易可控,攻击者无法到达修改页面
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();
}
-
实验小结
php中 === 和 == 不同的,
1、用===进行比较,会先判断两个字符串类型是否相同,再进行比较。
2、用==进行比较时,会将字符串类型转化成相同的,然后再进行比较。
如果比较一个数字和字符串或者比较涉及到数字内容的字符串,则字符串会被转换成数值并且比较按照数值来进行
posted on 2021-12-02 23:09 xiaoyuyuan~ 阅读(153) 评论(0) 编辑 收藏 举报