Nefhara/CVE-2025-4396
GitHub: Nefhara/CVE-2025-4396
针对 WordPress Relevanssi 插件时间盲注漏洞的验证与利用工具包,支持密码哈希提取和自动化破解。
Stars: 0 | Forks: 0
# CVE-2025-4396 - WordPress Relevanssi 基于时间盲注 SQL 注入工具包
## 概述
本仓库包含针对 **CVE-2025-4396** 的实用研究和验证工具包,这是一个未经认证的 **基于时间盲注 SQL 注入 (Time-Based Blind SQL Injection)** 漏洞,影响 WordPress 的 **Relevanssi** 插件,通过 `cats` 参数触发。
该项目专为**授权紫队 (Purple Team)** 交战而构建,旨在:
- 以受控方式验证可利用性,
- 展示不同的攻击者技术级别,
- 衡量 SOC 检测覆盖率,
- 以真实方式提取 WordPress 密码哈希,
- 并在哈希恢复后自动化离线破解工作流。
仓库包括:
- 一个**标准提取脚本**,
- 一个**更快的二分查找提取脚本**,
- 以及一个辅助脚本,用于使用 Hashcat **准备并破解提取的 WordPress 6.8+ 哈希**。
## 测试环境
- 服务器:Debian 11
- WordPress 6.9.1,
- Relevanssi 插件 4.24.4 (下载自 https://wordpress.org/plugins/relevanssi/advanced/),
- POC 使用自 Kali Linux OS。
## CVE 描述
**CVE-2025-4396** 是一个影响 WordPress 中 **Relevanssi** 搜索功能的 SQL 注入漏洞。
在测试场景中,该问题可以通过搜索工作流访问,更具体地说是通过 `cats` 参数访问。易受攻击的代码路径允许攻击者控制的输入影响插件生成的 SQL 查询。
由于易受攻击的端点无需事先认证即可访问,因此该缺陷可被远程攻击者利用以执行**未经认证的 SQL 注入**。
实际影响包括:
- 数据库查询操纵,
- 基于时间盲注 SQL 注入 (Time-Based Blind SQL Injection),
- 提取敏感数据(如密码哈希),
- 以及根据环境不同,可能通过有效凭据恢复实现权限提升。
## 漏洞原理
### 根本原因
该漏洞的存在是因为来自搜索相关参数的用户可控输入在被合并到 SQL 查询之前未得到安全处理。
实际上,这意味着攻击者可以将 SQL 表达式注入后端查询逻辑,并强制数据库评估额外的条件。
### 为什么是盲注
该漏洞以**盲注 (blind)** 模式被利用,这意味着应用程序**不**直接显示 SQL 错误或原始数据库结果。
攻击者不是从页面读取查询输出,而是向数据库询问一系列**真/假问题**并观察一个副作用:
- 如果条件为**真**,数据库会休眠几秒钟,
- 如果条件为**假**,响应会立即返回。
### 为什么是基于时间的
利用依赖于 `SLEEP()` 等 SQL 函数,以在服务器响应时间中产生可测量的差异。
这允许攻击者无需直接查看数据即可推断出数据。
例如,攻击者可以提出如下问题:
- “第一个字符等于 `$` 吗?”
- “第二个字符的 ASCII 值是否大于 77?”
- “前 N 个字符是否与此模式匹配?”
通过重复此过程,攻击者可以逐个字符地重建完整的哈希。
## 漏洞利用原理
### 标准提取逻辑
标准方法遍历已知的字符集并逐一测试每个候选字符。
对于目标哈希中的每个位置:
1. 构建针对单个字符的 SQL 条件。
2. 仅在猜测正确时触发服务器延迟。
3. 测量响应时间。
4. 重新发送相同的请求以减少网络抖动引起的误报。
5. 将确认的字符附加到提取的哈希中。
6. 移至下一个位置。
这种方法简单且可靠,但相对较慢,因为每个字符可能需要许多请求。
### 二分查找提取逻辑
更快的方法对每个字符的 ASCII 值使用**二分查找**。
它不是问:
- “字符等于 `a` 吗?”
- “字符等于 `b` 吗?”
- “字符等于 `c` 吗?”
而是问:
- “ASCII 值大于 79 吗?”
- “大于 55 吗?”
- “大于 43 吗?”
这将在每次请求时将搜索空间减半,并显着减少 HTTP 请求数量。
### 实际结果
该攻击允许操作员从 `wp_users` 中提取 `user_pass` 值,通常针对选定的 WordPress 用户 ID,例如:
- `1` 代表默认管理员,
- 或命令行传递的另一个 ID。
在最近的 WordPress 版本中,此值可能使用新的 **WordPress 6.8+ 密码管道**,该管道结合了:
- 使用 **HMAC-SHA384** 的预哈希阶段,
- Base64 编码,
- 以及最终的 **bcrypt** 哈希。
## 包含的脚本
### CVE_2025_4396.py
这是**标准提取脚本**。
#### 目的:
它执行经典的基于时间盲注 SQL 注入,并在固定字符集上使用线性搜索**逐个字符**提取目标哈希。
#### 关键特性:
- 简单易懂,
- 在稳定环境中可靠,
- 双重验证逻辑以减少误报,
- 用作检测工程和 PoC 演示的基线。
#### 工作原理:
对于每个字符位置:
- 遍历预定义的字符集,
- 构建匹配单个字符的 SQL 条件,
- 等待服务器响应,
- 并通过第二个请求确认命中。
#### 需求:
- `python3`
- `requests`
- `urllib3`
#### 安装:
```
pip3 install requests urllib3
```
##### 用法:
```
python3 CVE_2025_4396.py -t "https://target.local/?s=test&cats=" -u 1 -s 3 -v
```
```
Arguments :
-t, --target : vulnerable target URL including the injectable parameter
-u, --userid : WordPress user ID to target
-s, --sleep : sleep threshold in seconds
-v, --verbose : enable debug logging
```
### CVE_2025_4396_Stealth.py
这是二分查找版本。
#### 目的:
它执行与标准脚本相同的提取目标,但用对 ASCII 值的二分查找代替了线性的逐字符搜索。
#### 关键特性:
- 明显更少的 HTTP 请求,
- 更小的网络占用,
- 仍包含双重检查步骤以防止误报。
#### 工作原理:
对于每个位置:
- 定义一个可打印的 ASCII 范围。
- 测试中点。
- 询问目标字符是否大于该中点。
- 相应地缩小范围。
- 继续直到识别出确切的字符。
#### 需求:
- `python3`
- `requests`
- `urllib3`
#### 安装:
```
pip3 install requests urllib3
```
#### 用法:
```
python3 CVE_2025_4396_Stealth.py -t "https://target.local/?s=test&cats=" -u 1 -s 3 -v
```
#### 何时使用:
- 目标已确认存在漏洞,
- 延迟足够稳定,
- 并且目标是减少请求量。
## 离线哈希破解工作流
从 WordPress 提取密码哈希后,下一步是离线破解它。
WordPress 6.8+ 哈希说明。在测试的工作流中,提取的值可能如下所示:
```
$wp$2y$10$zPA8xGJMvr.kvAAIIYaCreIMnTDpgw/9o8K7.ONBm/KBbNIywQtu.
```
对于 Hashcat,可用的 bcrypt 部分是:
```
$2y$10$zPA8xGJMvr.kvAAIIYaCreIMnTDpgw/9o8K7.ONBm/KBbNIywQtu.
```
然而,此 bcrypt 不是直接应用于原始密码。WordPress 首先应用一个预处理阶段:
- 对候选密码进行 PHP 风格的 trim,
- 使用密钥 wp-sha384 进行 HMAC-SHA384,
- 对结果摘要进行 Base64 编码,
- 然后进行 bcrypt 验证。
#### 为什么需要预哈希步骤
这意味着如果你想复现确切的 WordPress 6.8+ 逻辑,就不能将普通字典直接发送给 Hashcat。
相反,每个候选密码必须首先转换为其兼容 WordPress 的预哈希表示。
仓库还包含一个“辅助”脚本,它:
- 接受提取的哈希作为参数,
- 在需要时去除 `$wp$` 前缀,
- 预处理提供的字典,
- 生成转换后的字典,
- 可选择创建映射文件,
- 自动启动 Hashcat,
- 将恢复的预哈希解析回原始的明文密码。
#### 典型工作流
提取哈希:
- 示例结果:`$wp$2y$10$zPA8xGJMvr.kvAAIIYaCreIMnTDpgw/9o8K7.ONBm/KBbNIywQtu.`
准备破解环境:
- `python3`
- `hashcat` 并在 PATH 中可用
运行 `Auto_Crack.py`:
```
python3 Auto_Crack.py -H '\$wp\$2y\$10\$zPA8xGJMvr.kvAAIIYaCreIMnTDpgw/9o8K7.ONBm/KBbNIywQtu.' -w /usr/share/wordlists/rockyou.txt
```
```
We need to escape "$" with "\" -> bash compatibility
```
## SOC 检测指南
以下检测内容可供 SOC 团队用于识别利用尝试并衡量防御成熟度。
### Sigma 检测
```
title: Potential Time-Based Blind SQLi (CVE-2025-4396 Relevanssi)
id: 5a8a1c93-5c74-4b5b-a620-8e1c3e41ab5d
status: experimental
description: Detects HTTP GET requests containing typical Time-Based Blind SQL injection payloads often used to exploit CVE-2025-4396 in the WordPress Relevanssi plugin (bypassing comma filters).
author: n3fhara
date: 2026-03-18
tags:
- attack.initial_access
- attack.t1190
- cve.2025-4396
logsource:
category: webserver
detection:
selection_endpoint:
cs-uri-query|contains:
- 's='
- 'cats='
- 'tags='
selection_payload:
cs-uri-query|contains:
- 'SLEEP('
- 'WAITFOR'
- 'SUBSTRING('
- 'ASCII('
- 'LENGTH('
selection_bypass_indicators:
cs-uri-query|contains:
- 'FROM'
- 'FOR 1'
- '*('
condition: selection_endpoint and selection_payload and selection_bypass_indicators
falsepositives:
- Highly unlikely. Legitimate search queries should not contain SQL functions.
level: high
```
### Suricata 检测
```
alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS (msg:"ET EXPLOIT WordPress Relevanssi SQLi Attempt (CVE-2025-4396)"; flow:established,to_server; content:"GET"; http_method; content:"cats="; http_uri; pcre:"/(cats|tags)=.*(SLEEP|WAITFOR)%28.*(%2A|\*).*SUBSTRING/i"; classtype:web-application-attack; sid:1000001; rev:1; metadata:created_at 2026_03_18, cve CVE_2025_4396;)
```
### SPLUNK 检测
```
index=web_logs sourcetype=access_combined
| regex uri_query="(?i)cats=|tags="
| stats count as request_count, avg(response_time) as avg_time, max(response_time) as max_time, dc(uri_query) as unique_payloads by clientip
| where request_count > 20 AND max_time > 2000
| sort - max_time
```
### KQL 检测
```
url.query : (*cats=* OR *tags=* OR *s=*) AND url.query : (*SLEEP* OR *WAITFOR* OR *SUBSTRING* OR *ASCII*) AND url.query : (*FROM* OR *FOR* OR *%2A*)
```
### EQL 检测
```
sequence by source.ip with maxspan=1m
[network where url.path == "/" and url.query : "*cats=*" and event.duration > 2000000000]
[network where url.path == "/" and url.query : "*cats=*" and event.duration > 2000000000]
[network where url.path == "/" and url.query : "*cats=*" and event.duration > 2000000000]
```
### 检测缺口与建议
上述基线检测对于非混淆的利用效果很好,但当操作员引入更先进的技术时,它们会变弱。
当攻击者开始使用以下手段时,SOC 的可见性会下降:
- 替代 SQL 函数代替明显的函数,
- URL 编码和基于注释的混淆,
- 通过二分查找减少请求量,
- 抖动和低速慢速计时,
- 代理轮换,
- 浏览器模拟。
#### SOC 的其他检测思路:
- 检测异常的缓慢搜索流量,
- 监控对 WordPress 搜索端点的请求,其中:
- 响应时间反复升高,
- 同一客户端执行许多搜索请求,
- 或同一端点随时间推移显示出异常的延迟模式。
- 对包含编码运算符的搜索参数发出警报,
- 即使不可见明显的 SQL 关键字,搜索参数若包含以下组合:
- 编码的比较运算符,
- 可疑的括号密度,
- 重复的数字逻辑,
- 或重度 URL 编码的查询字符串。
- 按端点关联,而不仅仅是按源 IP,
- 如果攻击者轮换代理,IP 关联就会变弱。检测还应侧重于:
- 重复访问同一端点,
- 重复的延迟响应,
- 或针对同一 WordPress 页面的重复格式错误的搜索查询。
- 使用长窗口行为检测:
- 30 分钟,
- 1 小时,
- 或数小时窗口。
- 监控数据库端的慢查询
## 仓库结构
```
.
├── CVE_2025_4396.py
├── CVE_2025_4396_Stealth.py
├── Auto_Crack.py
├── README.md
└── relevanssi.4.24.4.zip
```
# 法律声明
仅在你被明确授权测试的环境中使用。
作者和贡献者对误用不承担任何责任。
标签:0day, Bitdefender, CISA项目, CVE-2025-4396, Debian, Hashcat, Maven, PoC, Relevanssi插件, Web安全, WordPress漏洞, 二分查找, 多线程, 密码哈希提取, 数据展示, 数据库攻击, 无需认证, 时间盲注, 暴力破解, 概念验证, 漏洞验证, 盲注, 紫队, 红队, 自动化利用, 蓝队分析, 逆向工具