1月7日,研究人员在WP Database Reset插件中发现多个安全漏洞,CVE编号分别是CVE-2020-7048和CVE-2020-7047。该插件安装量超过80000次。其中一个漏洞允许非认证的用户来重置数据库中的表到初始化WordPress安装状态,另一个漏洞允许非认证的用户在drop其他用户的适合授予账户管理权限。

CVE-2020-7048

CVE-2020-7048漏洞是WP Database Reset插件中的漏洞,属于非认证的数据库重置漏洞,v 3.1及更低版本都受到该漏洞的影响,该漏洞CVSS 3.0评分为9.1。

WP Database Reset插件提供给用户重置数据库表密码的一个便捷的数据库重置插件,管理员可以在无需重装WordPress的情况下对网站进行测试。由于该插件功能强大,如果不进行合理的保护,可能会带来巨大的危害。这也就是研究人员发现漏洞的所在。

插件中的数据库重置函数中没有一个进行了检查或使用了安全随机数。由于没有适当的安全控制,WP Database Reset插件中的安全漏洞使得任意非认证的用户可以重置数据库中的任意表。重置还会引发数据可用性的破坏。攻击者发送一个简单的请求就可以将站点重置到WordPress标准默认状态。

有漏洞的插件代码如下:

public function reset( array $tables ) {    
         if ( in_array('users', $tables ) ) {
           $this->reset_users = true;
         }
       
         $this->validate_selected( $tables );
         $this->set_backup();
         $this->reinstall();
         $this->restore_backup();
       }
        
       private function validate_selected( array $tables ) {
         if ( ! empty( $tables ) && is_array( $tables ) ) {
           $this->selected = array_flip( $tables );

使用安全随机数检查后的插件代码如下所示:

public function reset(array $tables)
{
  if (wp_verify_nonce(@$_REQUEST['submit_reset_form'], 'reset_nounce') && current_user_can('administrator')) {
     // Check if current user is Admin and check the nonce
 
    if (in_array('users', $tables)) {
      $this->reset_users = true;
    }
 
    $this->validate_selected($tables);
    $this->set_backup();
    $this->reinstall();
    $this->restore_backup();
  } else {
    throw new Exception(__('Please reload the page and try again. Double check your security code.', 'wordpress-database-reset'));
  }
}

由于WordPress数据库中保存了所有页面、用户、站点选项、评论等数据。由于该漏洞,使得非认证的用户可以通过一个请求就擦除整个WordPress安装数据。

CVE-2020-7047

CVE-2020-7047是WP Database Reset插件中的一个权限提升漏洞,影响版本为v3.1及更低版本,CVSS评分为8.8分。

为进一步利用前述漏洞,认证为订阅者的用户也可以重置wp_users表。乍一看,这个漏洞可能并不严重。但是在数据库重置过程中删除所有用户看起来问题就很大了,但是还可以重新重置用户。当wp_users表被重置了之后,就会从user表中删除所有的用户,包括管理员和登入的用户。发送请求的用户会自动进行权限提升到管理员,即使只是一个订阅者用户。攻击者就会成为唯一的管理员,利用该漏洞可以完全控制WordPress站点。

有漏洞的代码如下所示:

private function update_user_settings() {
 global $wpdb;
 
 $user_id = $this->reset_users? 1: $this->user->ID;
 
 $wpdb->query(
   $wpdb->prepare(
    "UPDATE $wpdb->users
     SET user_pass = '%s', user_activation_key = ''
     WHERE ID = '%d'",
     $this->user->user_pass, $user_id
   )
 );
 
 if ( $this->reset_users ) {
   wp_clear_auth_cookie();
   wp_set_auth_cookie( true );
 }
}

下面是漏洞利用的PoC视频:

 https://www.wordfence.com/wp-content/uploads/2020/01/POCWPDatabaseReset.mp4

总结

该漏洞给我们的启示是对站点进行备份对网站安全和可用性是非常重要的。文中介绍了WP Database Reset插件中的的2个安全漏洞。这2个漏洞在3.15版本中都修复了,研究人员建议用户尽快更新插件到最新版本。



Source link

You must be logged in to post a comment.