0x01 漏洞概述
本次zzcms8.2的漏洞是任意用戶密碼重置,需要事先注冊一個賬號用來做測試,同時在找回密碼的地方也存在遍歷用戶的問題,那么就開始復(fù)現(xiàn)漏洞了。
0x02 漏洞復(fù)現(xiàn)
首先,我注冊了一個test/test用戶,然后點擊登錄的忘記密碼,即http://127.0.0.1/one/getpassword.php


通過這種方式,如果有一個強大的字典,即可遍歷很多用戶名了。
填寫好了正確的用戶名和驗證碼之后,進入第二步,按照正常流程,點擊發(fā)送驗證碼,然后隨便填寫一個驗證碼,抓包后send repeat后進行g(shù)o,然后看到相應(yīng)包的結(jié)果,如圖

我們可以看到在響應(yīng)包中有一段js代碼
window.document.userreg.yzm_mobile2.value='no'
將其中的no改為yes,即
window.document.userreg.yzm_mobile2.value='yes'
然后重新來一次,在第二步的時候,點擊下一步之前在瀏覽器的console控制器中將修改后的js復(fù)制過去并執(zhí)行

再次抓包

會發(fā)現(xiàn)這個之前沒有的包,然后發(fā)現(xiàn)瀏覽器界面已經(jīng)跳轉(zhuǎn)到了第三步重置密碼的界面了。

0x03 漏洞分析
本次zzcms的任意密碼重置漏洞網(wǎng)上有很多復(fù)現(xiàn),但是都沒有產(chǎn)生原因的分析,因此我通過抓包分析了出現(xiàn)的PHP文件后發(fā)現(xiàn)漏洞出現(xiàn)在ajax/ajax/yzm_check_ajax.php中

截圖部分是所有的php代碼,這里id的值就是輸入的驗證碼,founderr用來判斷驗證碼是否正確,如果等于1的話就是說驗證碼是錯誤的,如果是正確的話就會echo三個標(biāo)簽,仔細看的話這這個是我們之前在響應(yīng)包中看到的那個帶有no的js代碼,而如果是正確的驗證碼的話就是yes,因此,這里應(yīng)該是通過前端的代碼來最終判斷驗證碼是否正確,但是開發(fā)者卻忽視了前端代碼是我們可以控制的,因此可以繞過這里的驗證碼。