先在本地搭建好環(huán)境。
訪問后臺登錄頁面如下:

先來看看正常的找回密碼的過程。
首先,查看 tfmp_Admin/index.html 的源碼:

從代碼可以看到,當(dāng)點(diǎn)擊登錄按鈕旁邊的鏈接“如果忘記賬號與密碼,試試找回?”,時(shí),會執(zhí)行 js的views() 函數(shù),該函數(shù)是彈出一個(gè)對話框并向SEMCMS_Remail.php?type=find 發(fā)送請求,讓用戶填寫要接收重置后密碼的郵箱地址,如下:

SEMCMS_Remail.php 文件中,當(dāng)type=find時(shí),代碼如下:

可以看到,就是構(gòu)造上面那個(gè)要求輸入E-mail的表單,點(diǎn)擊“確認(rèn)找回”按鈕,該表單會提交到 ../Include/web_email.php?type=findpassword,看一下 web_email.php 中 type=findpassword 時(shí)的代碼:

代碼會根據(jù)用戶輸入的E-mail地址,查找 sc_user 表,看是否存在使用該E-mail地址的用戶,如果存在,則隨機(jī)生成4位數(shù)的認(rèn)證碼,并將其拼接到一個(gè)密碼重置鏈接中,最后以郵件的形式發(fā)送給用戶。用戶點(diǎn)擊郵件中的密碼重置鏈接即可;但如果不存在,則彈出對話框,提示“此郵箱不存在!”,如圖:

這里假設(shè)知道了管理員的郵箱,由于認(rèn)證碼是隨機(jī)的4位數(shù),這里很容易想到暴力破解。但通過 ../Include/web_email.php?type=findpassword 無法進(jìn)行暴力破解,因?yàn)槿缟厦娲a所示,每次進(jìn)入 if ($Type == 'findpassword') 語句塊,認(rèn)證碼會重新生成。所以只能看看有沒有別的地方可以利用。
回頭再查看 index.html 的代碼:

當(dāng)請求參數(shù) type=ok 時(shí),SEMCMS_Remail.php后面跟的參數(shù)type也是ok,而前面提到,這種情況下,SEMCMS_Remail.php會構(gòu)造另外一個(gè)表單,如下:

點(diǎn)擊“確認(rèn)找回”按鈕,會提交到 ../Include/web_email.php?type=findok,web_email.php 相應(yīng)部分的代碼如下:

可以看到,密碼會經(jīng)過md5加密后再存入數(shù)據(jù)庫中。
因此,這里可以通過 http://localhost/semcms_php_v2.7/tfmp_Admin/index.html?type=ok&umail=41864438@qq.com 彈出的表單,提交表單,使用BurpSuite進(jìn)行暴力破解從而將密碼重置。
為了本地測試方便,所以將初始密碼設(shè)置為 111111,其md5的值為:96e79218965eb72c92a549dd5a330112。重置后密碼將變?yōu)?23456,MD5加密后即 e10adc3949ba59abbe56e057f20f883e

先用Python生成一個(gè)四位數(shù)字的字典:

利用BurpSuite 進(jìn)行暴力破解:



結(jié)束后,查看數(shù)據(jù)庫,發(fā)現(xiàn)密碼確實(shí)被重置了:

使用 Admin/123456 可以成功登陸后臺管理頁面:

另外,這里涉及到表單提交,所以過程中我也想到過能否使用sql注入,然而每一次表單的提交,php代碼中都在sql語句構(gòu)造前,對用戶的表單輸入通過 test_input() 函數(shù)進(jìn)行了安全檢查和過濾,所以不存在SQL注入的問題。