CVE-2020-8547 phpList 3.5.0 – Authentication Bypass 漏洞復現
- 2020 年 2 月 17 日
- 筆記
0X1 漏洞概述
phpList是用於管理郵件列表的開源軟件。它設計用於向訂戶列表傳播信息,例如新聞通訊,新聞,廣告。它用PHP編寫,並使用MySQL數據庫存儲信息。phpList是免費的開源軟件
2月4日,有安全研究人員發佈phplist3.5.0允許對管理員登錄繞過進行類型轉換,因為對於密碼散列使用了==而不是===,這會錯誤地處理以0e開頭、後跟唯一數字字符的散列。
0X2 環境搭建
環境源碼可以從sourceforge下載
https://sourceforge.net/projects/phplist/files/phplist-development/3.5.0-RC1/
下載完成之後,解壓找到phplist-3.5.0-RC1phplist-3.5.0public_html的lists文件夾,如下圖所示:

將其複製到在本地Web目錄中,重命名,如下如所示:

修改config/config.php配置文件,設置要連接的數據庫和賬戶密碼:

開啟lampp

瀏覽器訪問環境
http://127.0.0.1/phplists/admin
點擊初始化環境,設置賬戶密碼

注意,這裡的密碼要設置成哈希值(sha256)以0e開頭的字符串,然後保存。
設置完成之後,訪問正常顯示即可:

0X3 漏洞分析
漏洞原因是由於後台管理員賬戶認證的比較不當導致的,源碼如下:

if(empty($login)||($password=="")){ return array(0, s('Please enter your credentials.')); } if ($admindata['disabled']) { return array(0, s('your account has been disabled')); } if (//Password validation. !empty($passwordDB) && $encryptedPass == $passwordDB ) return array($admindata['id'], 'OK'); else { if (!empty($GLOBALS['admin_auth_module'])) { Error(s('Admin authentication has changed, please update your admin module'), 'https://resources.phplist.com/documentation/errors/adminauthchange'); return; } return array(0, s('incorrect password')); }
這裡使用了==進行比較,使得PHP會把每一個以」0E」開頭的哈希值都解釋為0,所以如果兩個不同的密碼經過哈希以後,其哈希值都是以」0E」開頭的,那麼PHP將會認為他們相同,都是0。
<?php var_dump(hash('sha256', 'TyNOQHUS') == '0e66298694359207596086558843543959518835691168370379069085300385'); var_dump(hash('sha256', '34250003024812') == '0e66298694359207596086558843543959518835691168370379069085300385'); ?> OUTPUT: bool(true) bool(true)
0X4 漏洞利用
上一步驟的簡單分析之後,所以我們使用其他密碼值只要其哈希值是以0e開頭即可,相信很多小夥伴做過CTF中Web題目關於PHP代碼審計的題目的話,一定不會陌生。
我們使用密碼值34250003024812也可以代替TyNOQHUS登錄,過程如視頻所示:
0X5 加固修復
修改關鍵核心代碼中的==為===即可
if (//Password validation. !empty($passwordDB) && $encryptedPass === $passwordDB // Fixed by using strict comparison '==='. )
0X6 參考鏈接
https://www.exploit-db.com/exploits/47989 https://www.owasp.org/images/6/6b/PHPMagicTricks-TypeJuggling.pdf
——————————–