dedecms5.7 sp2前台修改任意用户密码
前言
其实这个漏洞出来有一段时间了,不算是一个影响特别大的漏洞,毕竟dede是一个内容管理系统,用户这一块本来就基本没有用。该漏洞的精髓就是一个弱类型的比较:'0.0'=='0'
漏洞版本
该漏洞出现在最新版的dede上,我复现的版本是v5.7 sp2 utf8版本
mark
漏洞影响
允许用户修改任意前台用户的密码,不能对管理员账户造成影响,毕竟管理员账户与前台用户的数据表时分开存放的。而且,前台也不能直接登录管理员账户
漏洞利用条件
开启会员模块
攻击者拥有一个正常的会员账号
目标没有设置安全问题
由于dede默认是没有开启会员功能的,也就是我们不能注册用户,所以要复现该漏洞需要自己开启。请大家自行搜索开启
漏洞复现
首先我先注册两个用户吧
攻击者:000001 密码:123
受害者:test 密码:123
由于dedecms注册用户需要审核,我这里是本地搭的,我直接在数据库里更改一下就行了。
mark
把-10改为0
执行了该语句你注册的用户就相当于通过了审核了。
现在我们的目标就是把test用户的密码更改为hacker
第一步:
在登录000001用户的前提下,请求
通过burp抓包,并把这个请求发送的repeater中,可以看到返回的包中有一个链接
mark
我们直接访问该链接就可以看到一个更改密码的页面:
mark
我们把密码改为hacker,然后试着登录下
mark
成功利用!下面我们具体来看看漏洞产生的原因
漏洞分析
问题出现在resetpassword.php文件的75行处。
mark
这里的代码大概意思就是把我们传过去的安全以及与数据库中一开始用户设定的safequestion与safeanswer是否匹配,如果匹配则可以往下进行,相当于验证密保问题。我们要做的就是绕过这里的判断,因为我们这个攻击成功的前提就是用户没有设置密保问题,所以在数据库中safequestion的值如下图:
mark
这里需要做的主要是绕过对safequestion的判断,对safeanswer的判断不需要我们绕过,本身就是满足的。我们可不可以直接传一个safequestion=0过去呢?答案是不行的,因为0在php中empty测试时会返回true。所以我们需要绕过的还有empty这个函数
所以我们直接令safequestion=0.0,0.0可以绕过empty检查,而且由于if判断里面的比较是弱类型比较
这样我们就会执行sn函数了,继续追踪一下吧,位于dedecms\member\inc\inc_pwd_functions.php:
mark
默认状态下,临时密码的表为空。所以会进入第一个判断,我们去看看newmail函数都做了什么吧。
mark
主要代码我已经用红框圈出来了,第二个红框中的链接也就是最后修改密码链接,只要拿到它我们就可以改密码了。获得这个链接需要通过抓取返回包。
总结
整个流程大概就到这了,可以很清晰的看到该漏洞就是由于那个弱类型的比较,通过构造请求我们可以控制mid(越权),mid也就是不同用户的编号,所以我们可以更改几乎所有用户的密码,只是还不能对管理员做什么。当然这个漏洞结合另外一个dede漏洞可以更改管理员的密码,后续将会进行复现
关注web安全
领取专属 10元无门槛券
私享最新 技术干货