dedecms5.7 sp2前台修改任意用户密码
前言
其实这个漏洞出来有一段时间了,不算是一个影响特别大的漏洞,毕竟dede是一个内容管理系统,用户这一块本来就基本没有用。该漏洞的精髓就是一个弱类型的比较:‘0.0’==‘0’
漏洞版本
该漏洞出现在最新版的dede上,我复现的版本是v5.7 sp2 utf8版本
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bcqxcNSc-1594221057557)(http://pbr6eymqa.bkt.clouddn.com/blog/180713/e31IG2famk.png?imageslim)]
漏洞影响
允许用户修改任意前台用户的密码,不能对管理员账户造成影响,毕竟管理员账户与前台用户的数据表时分开存放的。而且,前台也不能直接登录管理员账户
漏洞利用条件
-
开启会员模块
-
攻击者拥有一个正常的会员账号
-
目标没有设置安全问题
由于dede默认是没有开启会员功能的,也就是我们不能注册用户,所以要复现该漏洞需要自己开启。请大家自行搜索开启
####漏洞复现
首先我先注册两个用户吧
攻击者:000001 密码:123
受害者:test 密码:123
由于dedecms注册用户需要审核,我这里是本地搭的,我直接在数据库里更改一下就行了。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-he0Z91Vu-1594221057561)(http://pbr6eymqa.bkt.clouddn.com/blog/180713/k410EihHi4.png?imageslim)]
把-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中,可以看到返回的包中有一个链接
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sPPjpKgt-1594221057569)(http://pbr6eymqa.bkt.clouddn.com/blog/180713/fCK8DiCaK6.png?imageslim)]
我们直接访问该链接就可以看到一个更改密码的页面:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pUXe29xG-1594221057574)(http://pbr6eymqa.bkt.clouddn.com/blog/180713/k5kLHfD2cc.png?imageslim)]
我们把密码改为hacker,然后试着登录下
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sLRMzDkW-1594221057577)(http://pbr6eymqa.bkt.clouddn.com/blog/180713/maDF7LFG93.png?imageslim)]
成功利用!下面我们具体来看看漏洞产生的原因
####漏洞分析
问题出现在resetpassword.php文件的75行处。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nbOGx8Mv-1594221057580)(http://pbr6eymqa.bkt.clouddn.com/blog/180713/87LIF43dCc.png?imageslim)]
这里的代码大概意思就是把我们传过去的安全$safequestion
以及$safeanswer
与数据库中一开始用户设定的safequestion与safeanswer是否匹配,如果匹配则可以往下进行,相当于验证密保问题。我们要做的就是绕过这里的判断,因为我们这个攻击成功的前提就是用户没有设置密保问题,所以在数据库中safequestion的值如下图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-55ntUTf2-1594221057583)(http://pbr6eymqa.bkt.clouddn.com/blog/180713/hlHia7gBha.png?imageslim)]
这里需要做的主要是绕过对safequestion的判断,对safeanswer的判断不需要我们绕过,本身就是满足的。我们可不可以直接传一个safequestion=0过去呢?答案是不行的,因为0在php中empty测试时会返回true。所以我们需要绕过的还有empty这个函数
所以我们直接令safequestion=0.0,0.0可以绕过empty检查,而且由于if判断里面的比较是弱类型比较
0.0 == 0
//true
这样我们就会执行sn函数了,继续追踪一下吧,位于dedecms\member\inc\inc_pwd_functions.php:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wGr4mfPO-1594221057587)(http://pbr6eymqa.bkt.clouddn.com/blog/180713/bJ9K3kG9Aa.png?imageslim)]
默认状态下,临时密码的表为空。所以会进入第一个判断,我们去看看newmail函数都做了什么吧。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9TFQmEKn-1594221057591)(http://pbr6eymqa.bkt.clouddn.com/blog/180713/LbKc5jgHF3.png?imageslim)]
主要代码我已经用红框圈出来了,第二个红框中的链接也就是最后修改密码链接,只要拿到它我们就可以改密码了。获得这个链接需要通过抓取返回包。
总结
整个流程大概就到这了,可以很清晰的看到该漏洞就是由于那个弱类型的比较,通过构造请求我们可以控制mid(越权),mid也就是不同用户的编号,所以我们可以更改几乎所有用户的密码,只是还不能对管理员做什么。当然这个漏洞结合另外一个dede漏洞可以更改管理员的密码,后续将会进行复现