dedecms5.7 sp2前台修改任意用户密码漏洞(复现)

dedecms5.7 sp2前台修改任意用户密码

前言

其实这个漏洞出来有一段时间了,不算是一个影响特别大的漏洞,毕竟dede是一个内容管理系统,用户这一块原本就基本没有用。该漏洞的精髓就是一个弱类型的比较:‘0.0’==‘0’php

漏洞版本

该漏洞出如今最新版的dede上,我复现的版本是v5.7 sp2 utf8版本
markweb

漏洞影响

容许用户修改任意前台用户的密码,不能对管理员帐户形成影响,毕竟管理员帐户与前台用户的数据表时分开存放的。并且,前台也不能直接登陆管理员帐户数据库

漏洞利用条件

  1. 开启会员模块安全

  2. 攻击者拥有一个正常的会员帐号svg

  3. 目标没有设置安全问题函数

因为dede默认是没有开启会员功能的,也就是咱们不能注册用户,因此要复现该漏洞须要本身开启。请你们自行搜索开启
####漏洞复现
首先我先注册两个用户吧
攻击者:000001 密码:123
受害者:test 密码:123
因为dedecms注册用户须要审核,我这里是本地搭的,我直接在数据库里更改一下就好了。
mark
把-10改成0web安全

update dede_member set spacesta=0 where mid=3

执行了该语句你注册的用户就至关于经过了审核了。
如今咱们的目标就是把test用户的密码更改成hacker
第一步:
在登陆000001用户的前提下,请求post

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函数了,继续追踪一下吧,位于dedecms\member\inc\inc_pwd_functions.php
markspa

默认状态下,临时密码的表为空。因此会进入第一个判断,咱们去看看newmail函数都作了什么吧。
mark
主要代码我已经用红框圈出来了,第二个红框中的连接也就是最后修改密码连接,只要拿到它咱们就能够改密码了。得到这个连接须要经过抓取返回包。
####总结
整个流程大概就到这了,能够很清晰的看到该漏洞就是因为那个弱类型的比较,经过构造请求咱们能够控制mid(越权),mid也就是不一样用户的编号,因此咱们能够更改几乎全部用户的密码,只是还不能对管理员作什么。固然这个漏洞结合另一个dede漏洞能够更改管理员的密码,后续将会进行复现

mark 关注web安全