Alert Logic研究人員在WordPress WP Live Chat插件8.0.32及之前版本中存在一個重要的認證繞過漏洞。攻擊者利用該認證繞過可以在沒有有效憑證的情況下訪問REST API函數,竊取聊天日誌和操作聊天會話。
研究人員已經將漏洞報告給場所,並且一些協作發布了補丁。
技術細節
受影響的WP Live Chat版本的受限REST API終端由於wplc_api_permission_check()函數存在漏洞,可能會被未經認證的遠程攻擊者濫用來發現攻擊。
代碼: /wp-live-chat-support/modules/api/wplc-api-routes.php [Lines: 11-63, v8.0.32]
register_rest_route()調用定義了由於函數功能本質的原因而REST API終端應當有訪問限制。每個受限的終端都會共享相同的permission_callback函數。
潛在攻擊者會使用這些終端進行惡意目的,包括:
· 提取所有聊天會話的完整聊天歷史記錄;
· 注入任意消息到正在進行的聊天會話中並作為代理;
· 編輯注入的消息來隱藏注入消息所包含的內容;
· 任意編輯活動的聊天會話進行DOS攻擊。
上面的三元組是關鍵的權限檢查邏輯,使用了2個核心的wordpress函數。函數is_user_logged_in()是提取當前WP_User實例的布爾函數,會調用exist()方法。如果資料庫中存在該user id,該方法就返回true,並確認用戶是否登入,是否有有效的WP_User實例。
如果is_user_logged_in()返回true,第一個statement通過函數check_ajax_referer()繼續驗證請求的有效性。額外的有效性檢查會比較提交的隨機數的值來確認請求是不是有效的。
如果is_user_logged_in()返回false,三元組就會返回第二個statement,布爾值true。這裡就存在一個認證繞過,成功執行check_ajax_referer()的結果會返回true,並允許訪問終端。
總結
總的來說,上面的三元組statement會產生以下結果:
1.請求來自登入用戶,並提交了所有準確的隨機數值。check_ajax_referer()調用的返回值是true,允許訪問REST終端。
2.請求來自登入用戶,提交的無效的隨機數值。check_ajax_referer()調用的返回值是false,訪問REST終端的請求被拒絕。
3.請求來自非登入用戶,提交的隨機數值可能是有效的也可能是無效的。三元組第二個statement的返回值是true,允許訪問REST終端。
這就允許非認證的用戶訪問受限制的REST API終端,並只對認證的用戶進行強制性的額外認證檢查。非認證的用戶會在沒有額外檢查的情況下馬上授予訪問權限。
研究人員建議用戶更新更新插件到最新版本,如果更新存在困難,可以使用WAF這樣的安全產品來過濾WP Live Chat流量。