
CVE-2025-22783 の PoC
WordPress プラグイン
Component name SEO Plugin by Squirrly SEO
Vulnerable version <= 12.4.01
Component slug squirrly-seo
Component link https://wordpress.org/plugins/squirrly-seo/
Vulnerability class A3: インジェクション
Vulnerability type SQLインジェクション
Contributor 以上
SEO Plugin by Squirrly SEO は、特定のキーワードに基づいてソースページとターゲットページを選択できる内部リンク機能を通じて、ウェブサイトのSEOを改善することができます。内部リンク管理ページ(/wp-admin/admin.php?page=sq_focuspages&tab=innerlinks)で、各リンクのキーワード、ソースページ、ターゲットページ、ステータスを管理できます。
Squirrly SEO プラグインのバージョン12.4.01以下では、内部リンク管理ページで作成済みの内部リンクを検索できます。ユーザー(Contributor以上)が入力した検索語が検証なしでデータベースクエリに直接渡される際に、SQLインジェクションの脆弱性が発生します。
検索結果は内部リンク管理ページに直接表示されませんが、SLEEP関数などの時間ベースのSQLインジェクション手法を使用してデータベース情報を抽出することができます。
Squirrly SEO プラグインのバージョン12.4.01以下がインストールされているターゲットサイトに、Contributor以上の権限を持つアカウントでログインします。
次に、以下のURLにアクセスすると、SQLインジェクションペイロード内のIF文の条件「1=1」が常に真であるため、SLEEP(5)関数が実行され、ページの読み込みに5秒かかります。
http://localhost:8080/wp-admin/admin.php?page=sq_focuspages&tab=innerlinks&stype&squery='+AND+1%3D2)+UNION+SELECT+(IF(1=1,SLEEP(5),1)),2,3,4,5,6,7%23
一方、IF文の条件を「1=2」に変更すると、結果が偽となるためページは即座に読み込まれます。
http://localhost:8080/wp-admin/admin.php?page=sq_focuspages&tab=innerlinks&stype&squery='+AND+1%3D2)+UNION+SELECT+(IF(1=2,SLEEP(5),1)),2,3,4,5,6,7%23
Squirrly SEO プラグインの内部リンク管理ページ(/wp-admin/admin.php?page=sq_focuspages&tab=innerlinks)で内部リンクを検索すると、/wp-content/plugins/squirrly-seo/models/Qss.php ファイルの getSqInnerlinks 関数を呼び出してデータベースにクエリを実行します。

この時点で、変数 $query_where がSQLクエリに直接挿入されていることがわかります。変数 $query_where の値がどのように構築されるかを見てみましょう。
$search には内部リンク検索時に入力された検索語が含まれ、sanitize_text_field 関数がユーザー入力データの処理に使用されます。$search は条件句の一部として使用され、変数 $query_where に格納されます。$query_where に追加の条件が追加され、apply_filters 関数を通じてフィルターが適用されます。したがって、内部リンク検索時にユーザーが入力した検索語は sanitize_text_field 関数で処理されますが、この関数はSQLインジェクション攻撃を防ぐことはできません。SQLクエリで使用される特殊文字(シングルクォート(')、コメント(#)など)はフィルタリングされず、SQLインジェクションペイロードを含む変数 $search が適切にエスケープされずにデータベースクエリに渡されると、SQLインジェクションの脆弱性が発生します。
⚠️ 実装されたPoCコードは、管理者アカウントでログインして脆弱性の再現に必要な最小権限(Contributor以上)のアカウントを作成し、その後そのアカウントを使用して脆弱性を発動します。

次に、以下のコマンドを入力してPoCコードを実行します。
Required modulerequests
python poc.py
