漏洞信息
审计版本:zzcms 201910
通过/one/getpassword.php
重置任意用户密码
更多详情见CNVD-2021-34731
用于xio习 比较简单
分析
直接跟进/one/getpassword.php
上面的包含就不看了,看下$action是POST获取的就行了,下面直接看上图红框内的内容,这部分主要是获取html页面,用于后面返回页面
下图第一部分的strbetween()函数用于取两个标签之间的内容,第二部分的最终效果就是在未提交action参数值的时候返回{step1}与{/step1}直接的内容
即/template/red13/getpassword.htm
下图选中部分的内容
上面能理解明白的话,那这个密码重置基本就十拿九稳了
修改密码的流程大致是:
- 提交POST的参数
action=step1
-->返回{step2}{/step2}
之间的页面(即安全验证,提交验证码的页面) - 提交POST的参数
action=step2
-->返回{step3}{/step3}
之间的页面(即设置新密码,提交修改密码请求的页面) - 提交POST的参数
action=step3
-->返回{step4}{/step4}
之间的页面(即修改密码成功的页面)
页面请求的参数action对应关系是:
{step1}{/step1}
之间的页面用于提交参数action=step1
{step2}{/step2}
之间的页面用于提交参数action=step2
{step3}{/step3}
之间的页面用于提交参数action=step3
要实现修改密码成功就需要提进入到{step3}{/step3}之间的页面内容
,然后提交参数action=step3
,实现密码修改
所以直接从$action==step3
开始跟进,此处仅判断了$action,及$_SESSION['username']
$action是可控的,所以向上查找$_SESSION['username']在哪儿赋值。
找到在进入$action=="step1"后会进行一次赋值,其余的验证码验证等都在其后面进行判断,且写入session且后续未进行重置
那么大体流程清楚了,下面就是看如何进入{step3}{/step3}
的页面了
跟进到$action=="step2"
,看到进入条件只判断@$_POST['yzm_mobile']==@$_SESSION['yzm_mobile']
上图deyzm_mobile在前一步页面通过向/ajax/send_yzm_ajax.php
发起请求获取,但是如果不进行获取直接提交的话,那他就是空"",yzm_mobile参数提交为空时为null,弱类型判断那么两者相等,可进入此步骤
这里可调试查看下两个的值,burp发包修改验证码为空:
调试可看到$_SESSION['yzm_mobile']为null,$_POST['yzm_mobile']为"",成功进入到此条件内
那么实现任意用户密码重置流程就清晰了,只需要在
进行安全验证
步骤不获取验证码
然后提交个空验证码值就行了,或者在提交step1绑定好session的username后,再提进入确认帐号
界面,修改action=step2,直接进入修改密码界面
复现
复现方法1
输入验证码后会ajax发起请求验证验证码,会导致不能点击下一步,可以修改返回包为yes,然后就能正常点击下一步了
拦截成功后,删掉你提交的验证码值后放行
进入修改密码界面
输入密码提交,修改成功
复现方法2
输入正确用户名,错误验证码进行提交
然后会回到该页面,然后再次输入正确用户名,错误验证码,用burp拦截
修改action=step2
然后会进入到设置密码界面
输入任意密码提交即可修改成功
更新一下链接
名称:萌宇博客
链接:https://blog.cutewo.com
描述:好奇永无止境|探索从未停止
头像:https://blog.cutewo.com/img/tx.jpg
已更新