phpList是用于管理郵件列表的開源軟件。它設(shè)計用于向訂戶列表傳播信息,例如新聞通訊,新聞,廣告。它用PHP編寫,并使用MySQL數(shù)據(jù)庫存儲信息。phpList是免費的開源軟件。
https://www.exploit-db.com/exploits/47989
管理員后臺登錄的密碼散列使用了
==而不是===驗證
環(huán)境搭建
源碼下載(sourceforge):
https://sourceforge.net/projects/phplist/files/phplist-development/3.5.0-RC1/

image
解壓后直接找到這個目錄:

image
將這個lists拷貝到網(wǎng)站目錄下并且重命名。
修改config/config.php配置文件,設(shè)置要連接的數(shù)據(jù)庫和賬戶密碼

image
同時建立phplistdb數(shù)據(jù)庫。
訪問http://127.0.0.1/phplist/admin/
漏洞利用
初始化安裝,設(shè)置管理員的賬號密碼:

image
這里的密碼要設(shè)置成 sha256 后以0e開頭的字符串,如 TyNOQHUS
我們再次訪問后臺,以密碼 34250003024812進行登錄,其sha256后也是以0e開頭

image
登錄成功:

image
漏洞分析
找到驗證管理員登錄的php文件phpListAdminAuthentication.php
關(guān)鍵代碼:

image
可以看到$encryptedPass(密碼sha256后的值)是使用==來判斷和數(shù)據(jù)庫中的值是否一樣。PHP弱類型比較,就會造成0exxxxx == 0eyyyyy(會把每一個以”0e”開頭的哈希值都解釋為0)
漏洞修復(fù)
使用===強類型比較:
if (//Password validation.
!empty($passwordDB) && $encryptedPass === $passwordDB
)
總結(jié)
這種偶然現(xiàn)象可能不是很常見,但是還是借助fofa等工具搜集下使用phplist的網(wǎng)站,批量打一下。