0x01 漏洞概述
本次zzcms8.2的漏洞是任意用户密码重置,需要事先注册一个账号用来做测试,同时在找回密码的地方也存在遍历用户的问题,那么就开始复现漏洞了。
0x02 漏洞复现
首先,我注册了一个test/test用户,然后点击登录的忘记密码,即http://127.0.0.1/one/getpassword.php
通过这种方式,如果有一个强大的字典,即可遍历很多用户名了。
填写好了正确的用户名和验证码之后,进入第二步,按照正常流程,点击发送验证码,然后随便填写一个验证码,抓包后send repeat后进行go,然后看到相应包的结果,如图
我们可以看到在响应包中有一段js代码
1 | window.document.userreg.yzm_mobile2.value='no' |
将其中的no改为yes,即
1 | window.document.userreg.yzm_mobile2.value='yes' |
然后重新来一次,在第二步的时候,点击下一步之前在浏览器的console控制器中将修改后的js复制过去并执行
再次抓包
会发现这个之前没有的包,然后发现浏览器界面已经跳转到了第三步重置密码的界面了。
0x03 漏洞分析
本次zzcms的任意密码重置漏洞网上有很多复现,但是都没有产生原因的分析,因此我通过抓包分析了出现的PHP文件后发现漏洞出现在ajax/ajax/yzm_check_ajax.php中
截图部分是所有的php代码,这里id的值就是输入的验证码,founderr用来判断验证码是否正确,如果等于1的话就是说验证码是错误的,如果是正确的话就会echo三个标签,仔细看的话这这个是我们之前在响应包中看到的那个带有no的js代码,而如果是正确的验证码的话就是yes,因此,这里应该是通过前端的代码来最终判断验证码是否正确,但是开发者却忽视了前端代码是我们可以控制的,因此可以绕过这里的验证码。