千里之堤溃于蚁穴:CVE-2020-13693

admin 2021年5月6日18:32:56评论113 views字数 2534阅读8分26秒阅读模式

译文声明
本文是翻译文章,文章原作者raphael karger,文章来源:https://b.ou.is
原文地址:https://b.ou.is/articles/2020-05/CVE-2020-13693

前言

在对流行的Wordpress插件进行研究之后,我在BBPress中发现了一个逻辑错误。它允许未经授权的权限提升,最终漏洞被分配为CVE-2020-13693,并获得由Hackerone上的Wordpress提供的现金奖励。由于此漏洞的严重性和易用性,它的CVSS评分为9.8。
我们将在Nathan Hrncirik的帮助下对wordpress虚拟环境进行白盒测试。

漏洞影响

只需在注册请求中添加bbp-forums-role= bbp_keymaster(代码红色显示,谢谢)参数,您就可以使一个刚刚创建的用户成为Keymaster角色,Keymaster角色可以删除和创建论坛,可以创建,编辑,删除所有帖子,主题,论坛。 但是要想利用这一点,需要满足两个前提条件。第一,站点需要开放注册,运行创建新用户。其次是需要嵌入BBPress注册表表单(shortcode[bbp register]),以便检索nonce。下图是我使用BP手动构造payload的截图。

千里之堤溃于蚁穴:CVE-2020-13693

发送请求后,如果页面跳转到dashboard页面,则我们可以看到我们刚刚创建的用户具有Keymaster角色。

千里之堤溃于蚁穴:CVE-2020-13693

漏洞细节

在分析了用户注册部分的代码后,我们发现add_filter在signup_user_meta标签上被触发,并将其传递给bbp_user_add_role_to_signup_meta函数,这个函数在/includes/core/filters.php中被调用。在Wordpress中,add_filter用作“hook”,以便在运行时更改或更改内部数据。根据Wordpress开发者文档中的描述,signup_user_meta是一个过滤器,用于在用户注册期间操作角色和添加用户元数据属性。这意味着BBPress在用户注册期间变更用户的元数据角色。这种现象并不奇怪,因为BBPress是论坛软件,用户、版主和管理员的角色本身是分离的。
// User Creation
add_filter( 'signup_user_meta', 'bbp_user_add_role_to_signup_meta', 10 );

在在分析了add_filter hook之后,我还查看了位于/includes/user/signups.php中的bbp_user_add_role_to_signup_meta函数。该函数接收post参数bbp-forums-role,并检查bbp_get_dynamic_roles()是否返回一个动态角色数组。根据这一点,我们想到了一个绕过代码逻辑的方法,使用真实有效的角色发送bbp-forums-role请求的参数。
```
function bbp_user_add_role_to_signup_meta( $meta = array() ) {

// Posted role
$forum_role = isset( $_POST['bbp-forums-role'] )
    ? sanitize_key( $_POST['bbp-forums-role'] )
    : bbp_get_default_role();

// Role keys
$roles = array_keys( bbp_get_dynamic_roles() );

// Bail if posted role is not in dynamic roles
if ( empty( $forum_role ) || ! in_array( $forum_role, $roles, true ) ) {
    return $meta;
}

// Add role to meta
$meta['bbp_new_role'] = $forum_role;

// Return meta
return $meta;

}
```

位于/includes/core/capabilities.php 中的bbp_get_dynamic_roles函数,通过遍历BBPress角色,将WP_Roles对象转换为数组并将其用作标签。为了成功添加角色,我们必须找出Keymaster角色的名称。
```
function bbp_get_dynamic_roles() {

// Defaults
$to_array = array();
$roles    = bbpress()->roles;

// Convert WP_Roles objects to arrays
foreach ( $roles as $role_id => $wp_role ) {
    $to_array[ $role_id ] = (array) $wp_role;
}

// Filter & return
return (array) apply_filters( 'bbp_get_dynamic_roles', $to_array, $roles );

}
最终,我们在/includes/core/capabilities.php中的bbp_get_keymaster_role()函数找到了答案。它将bbp_get_keymaster_role角色设置为bbp_keymaster。这意味着我们只需要在post请求结束时添加bbp_keymaster,就可以成功注册keymaster用户。
function bbp_get_keymaster_role() {

// Filter & return
return apply_filters( 'bbp_get_keymaster_role', 'bbp_keymaster' );

}
```

结论

BBPress团队很快在2.6.5版本中发布了补丁,对添加的角色进行验证。BBPress 2.6.5的补丁说明。

相关推荐: Primary Access Token Manipulation Attack(令牌操作攻击下)

在上文中我们了解了对应的过程,本文我们将讲解该种攻击的具体实现细节.。 进行这种攻击我们需要几个windows api他们的名称以及作用如下: 过程是: language openprocess() --> openprocesstoken() --&g…

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2021年5月6日18:32:56
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   千里之堤溃于蚁穴:CVE-2020-13693http://cn-sec.com/archives/246601.html