FreeBuf|BBPress未经身份验证的提权漏洞分析

前言
BBPress是一款强大的WordPress论坛插件 , 目前BBPress被安装在超过30万个WordPress站点上 。 最近BBPress<=2.6.4的版本中被曝出了一个未经身份验证的权限提升漏洞 , CVSS评分为9.8 。 通过利用该漏洞 , 可以将新用户注册为BBPress论坛的管理员 , 从而能够进行创建/删除论坛活动、导入/导出论坛用户以及创建版主等操作 。 本文对该漏洞进行了详细分析 。
实验环境1.测试工具:BurpSuitev2.12.目标主机:Debian9.6x643.软件版本:WordPress5.2.24.插件版本:BBPress2.6.4漏洞分析1.在分析了源码之后 , 发现在用户注册时调用了过滤器钩子函数add_filter , 其中挂载回调函数的过滤器名称为signup_user_meta , 过滤器应用时调用的回调函数为bbp_user_add_role_to_signup_meta , 详细代码如下:
add_filter('signup_user_meta','bbp_user_add_role_to_signup_meta',10);【FreeBuf|BBPress未经身份验证的提权漏洞分析】2.分析步骤1在add_filter中被调用的函数bbp_user_add_role_to_signup_meta , 该函数的详细代码如下:
functionbbp_user_add_role_to_signup_meta($meta=array){$forum_role=isset($_POST['bbp-forums-role'])?sanitize_key($_POST['bbp-forums-role']):bbp_get_default_role;$roles=array_keys(bbp_get_dynamic_roles);if(empty($forum_role)||!in_array($forum_role,$roles,true)){return$meta;}$meta['bbp_new_role']=$forum_role;return$meta;}2.1函数bbp_user_add_role_to_signup_meta使用POST方式获取参数bbp-forums-role的值 , 若用户通过POST方式传入了bbp-forums-role值 , 那么将其赋值给变量$forum_role;若未有bbp-forums-role值传入 , 那么将BBPress默认的用户角色赋值给$forum_role;
2.2该函数调用bbp_get_dynamic_roles函数 , 获取BBPress预定义角色的数组;
2.3接着检测$forum_role是否为空 , 并且检测其是否在BBPress预定义角色的数组中;
2.4由此可以推测 , 要破坏程序的正常逻辑 , 只要将有效的用户角色赋值给bbp-forums-role , 然后通过POST方式传递给WordPress站点即可 。
3.函数bbp_get_dynamic_roles迭代BBPress角色 , 然后将其创建为标准化数组 , 再通过apply_filters创建一个名为bbp_get_dynamic_roles的过滤器 , 详细代码如下:
functionbbp_get_dynamic_roles{$to_array=array;$roles=bbpress->roles;foreach($rolesas$role_id=>$wp_role){$to_array[$role_id]=(array)$wp_role;}return(array)apply_filters('bbp_get_dynamic_roles',$to_array,$roles);}4.函数bbp_get_keymaster_role将bbp_get_keymaster_role角色设置为bbp_keymaster , 这表明我们只有在post请求的末尾添加bbp_keymaster , 才能将定制的用户成功注册为bbp_keymaster用户 , 最终获取BBPress的最高等级权限 , 该函数的详细代码如下:
functionbbp_get_keymaster_role{returnapply_filters('bbp_get_keymaster_role','bbp_keymaster');}漏洞修复1.此漏洞在2.6.5版本中得到修复 , 修复后代码的不同之处主要在于函数bbp_user_add_role_to_signup_meta , 其中新增调用了函数bbp_validate_registration_role($to_validate) , 对POST传入的bbp-forums-role参数值进行了过滤 , 详细代码如下:
if(!empty($meta['bbp_new_role'])){return$meta;}$to_validate=!empty($_POST['bbp-forums-role'])&&is_string($_POST['bbp-forums-role'])?sanitize_key($_POST['bbp-forums-role']):'';$valid_role=bbp_validate_registration_role($to_validate);if(bbp_has_errors){return$meta;}$meta['bbp_new_role']=$valid_role;return$meta;}2.函数bbp_validate_registration_role检测当前是否处于WordPress后台控制面板中 , 并且当前用户是否具有创建用户的权限 , 若这两个条件同时为True , 那么可以创建任意角色的用户;否则只能创建默认角色的用户(默认角色为bbp_participant) 。 详细代码如下所示:


推荐阅读