Alert Logic研究人员在WordPress WP Live Chat插件8.0.32及之前版本中存在一个重要的认证绕过漏洞。攻击者利用该认证绕过可以在没有有效凭证的情况下访问REST API函数,窃取聊天日志和操作聊天会话。
研究人员已经将漏洞报告给场所,并且一些协作发布了补丁。
技术细节
受影响的WP Live Chat版本的受限REST API终端由于wplc_api_permission_check()函数存在漏洞,可能会被未经认证的远程攻击者滥用来发现攻击。PHP大马
代码: /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流量。