
This repository contains a practical research and validation toolkit for CVE-2025-4396, an unauthenticated Time-Based Blind SQL Injection affecting the WordPress Relevanssi plugin through the `cats` parameter.
このリポジトリには、CVE-2025-4396 に関する実践的な調査・検証ツールキットが含まれています。これは、WordPressの Relevanssi プラグインの cats パラメータに影響を与える、認証不要の時間ベースブラインドSQLインジェクションです。
このプロジェクトは、認定されたPurple Team演習のために構築され、以下の目的で使用されます:
リポジトリには以下が含まれます:
免責事項
このプロジェクトは、教育目的、防御的検証、および認定されたセキュリティテストのためにのみ提供されます。
所有していないシステムや、明示的な書面による評価許可を得ていないシステムに対して使用しないでください。
CVE-2025-4396 は、WordPressの Relevanssi 検索機能に影響を与えるSQLインジェクションの脆弱性です。
テストしたシナリオでは、この問題は検索ワークフローを通じて、より具体的には cats パラメータを通じて到達可能です。この脆弱なコードパスにより、攻撃者が制御する入力がプラグインによって生成されるSQLクエリに影響を与えることができます。
脆弱なエンドポイントは事前認証なしでアクセス可能であるため、この欠陥はリモート攻撃者によって悪用され、認証不要のSQLインジェクションを実行される可能性があります。
実際の影響には以下が含まれます:
この脆弱性は、検索関連パラメータからのユーザー制御入力が、SQLクエリに組み込まれる前に安全に処理されないために存在します。
実際には、攻撃者がSQL式をバックエンドのクエリロジックに注入し、データベースに追加の条件を評価させることができることを意味します。
この脆弱性はブラインドモードで悪用されます。つまり、アプリケーションはSQLエラーや生のデータベース結果を直接表示しません。
ページからクエリ出力を読み取る代わりに、攻撃者はデータベースに一連の真/偽の質問を投げかけ、1つの副作用を観察します:
この悪用は、サーバーの応答時間に測定可能な差を生み出すために、SLEEP() などのSQL関数に依存しています。
これにより、攻撃者はデータを直接見ることなく推測することができます。
例えば、攻撃者は次のような質問をすることができます:
$ と等しいか?」このプロセスを繰り返すことで、攻撃者はハッシュ全体を1文字ずつ再構築することができます。
標準的なアプローチは、既知の文字セットを反復処理し、各候補を1つずつテストします。
ターゲットハッシュの各位置について:
この方法はシンプルで信頼性がありますが、文字ごとに多くのリクエストが必要になる可能性があるため、比較的遅いです。
より高速なアプローチは、各文字のASCII値に対する二分探索を使用します。
次のような質問をする代わりに:
a と等しいか?」b と等しいか?」c と等しいか?」次のように質問します:
これにより、リクエストごとに探索空間が半分に分割され、HTTPリクエストの数が劇的に削減されます。
この攻撃により、オペレーターは wp_users から user_pass 値を抽出できます。通常は、以下のような選択されたWordPressユーザーIDが対象です:
1、最近のWordPressバージョンでは、この値は新しいWordPress 6.8+パスワードパイプラインを使用する場合があり、以下を組み合わせます:
CVE_2025_4396.pyこれは標準抽出スクリプトです。
固定された文字セットに対する線形探索を使用して、古典的な時間ベースブラインドSQLインジェクションを実行し、ターゲットハッシュを1文字ずつ抽出します。
各文字位置について:
python3requestsurllib3pip3 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値に対する二分探索に置き換えます。
各位置について:
python3requestsurllib3pip3 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は最初に前処理段階を適用します:
これは、WordPress 6.8+の正確なロジックを再現したい場合、通常のワードリストをHashcatに直接送信できないことを意味します。
代わりに、各候補パスワードは、まずWordPress互換の事前ハッシュ表現に変換する必要があります。
このリポジトリには、以下の「ヘルパー」スクリプトも含まれています:
$wp$ プレフィックスを除去し、ハッシュを抽出する:
$wp$2y$10$zPA8xGJMvr.kvAAIIYaCreIMnTDpgw/9o8K7.ONBm/KBbNIywQtu.クラッキング環境を準備する:
python3hashcat が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チームが悪用の試みを特定し、防御の成熟度を測定するために使用できます。
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
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;)
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
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*)
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の可視性は低下します:
.
├── CVE_2025_4396.py
├── CVE_2025_4396_Stealth.py
├── Auto_Crack.py
├── README.md
└── relevanssi.4.24.4.zip
明示的にテストを許可された環境でのみ使用してください。 著者および貢献者は、誤用に対する責任を負いません。
免責事項
このプロジェクトは、教育目的、防御的検証、および認定されたセキュリティテストのためにのみ提供されます。
所有していないシステムや、明示的な書面による評価許可を得ていないシステムに対して使用しないでください。