DeDeCMS v5.7 SP2 正式版 前台任意用户密码修改
DeDeCMS v5.7 SP2 正式版 前台任意用户密码修改
复现过程
环境搭建
使用PHPSTUDY,选择使用一键启动中的WNMP选项,进行网站的创建。在网站项中进行网站创建,对域名进行设置(任意设置),其他设置选项默认选项。
环境搭建使用PHPSTUDY和DEDECMS的镜像进行搭建,在环境安装时数据库密码使用对应的默认密码,才可以正常进行安装,其他选项为默认选项(不进行数据库密码的配置会导致在第三步的安装中报错”数据库或者登录密码不正确”)。
创建后进入dede的网站根目录放入DEDECMS的镜像文件,根目录在PHPSTUDY的安装路径的WWW文件夹下进行存放。
在配置好网站后,需要进入后台对会员注册的权限进行开启,不然无法直接注册用户(不对注册会员权限进行开启,无法跳转到注册界面)。会员注册功能在”系统”选项,”会员设置”选项中进行设置。
漏洞利用
对账号进行注册(笔名也需要进行设置,此处没有设置后的截图),安全问题不进行设置(漏洞的点就在于网站对安全问题没有进行判断)。注册账号后在需要在后台进行对用户的审核状态进行修改为”正常使用状态”,不然无法进行对空间的查看,也无法进行后续的操作。
构造payload 进行传参
对dopost=getpassword&id=4&key=sFX3QGo进行利用
成功进入密码重设界面。
成功修改登录。
漏洞原理分析
在PHP源码的resetpassword.php功能点,对代码进行分析,safeanswer是指安全问题答案,safequestion是指安全问题。if对安全问题和安全问题答案的预先设置的进行判断,正确的情况下会执行sn()函数,在不正确的时则会返回”对不起,您的安全问题或答案回答错误”字符串和返回值”-1”。
函数sn()的代码,逻辑是通过sql语句对$mid变量进行查找(mid是数据库中会员对应的唯一ID标识),如果在发送新邮件之后继续进行发送验证码,就会对变量dtime进行判断是否继续发送验证码,未过十分钟再次申请发送验证码就会返回”对不起,请十分钟后再重新申请”字符串和”login.php”返回到登录界面。在第一次执行sn函数会执行newmail函数,我们对newmail函数的逻辑进行查找。
newmail函数的第三个参数是对数据的调用方式,参数为INSERT时,会对数据库进行写入key(key为一串MD5加密后的随机数字符串,这个key就是最后payload中key不同的原因),send=Y时就会发送验证码并且返回”login.php”,send=N时就会返回到resetpassword.php重新进行密码设置的界面。 这里就是我们需要利用的地方,直接对用户的密码直接进行修改。newmail函数的第三个参数为UPDATE时,则会对之前向数据库中进行写入的MD5加密的随机数进行更新,后面的逻辑与INSERT格式进行了相同的操作。
漏洞利用payload构造思路
安全问题和答案的比较使用了”==”进行比较(PHP弱比较,在进行比较时会直接将输入的字符串直接转换为相同的格式后继续进行比较),为了执行sn函数,我们要输入合适的safequestion和safeanswer让empty()函数返回值为0(为1时返回了safequestion和safeanswer为空,弱比较空”” 只有””和NULL可以判断为true,不好执行sn函数),并且在PHP弱比较时也可以通过。输入safequestion和safeanswer=0.0可以绕过第一个empty(),并且第二个判断0.0可以与自身的字符串形式进行匹配为true。
构造payload时&作为实体参数,可以直接作为&参数,所以不需要在payload中输入&;。key由发包的返回请求获取(key的来源不再赘述,可以看上文)。