

Super Admin、Administrator、Editor、Author、Contributor、Contributor などかなりあります。では、どうすれば管理者権限を得られるのでしょうか? まず、Ultimate Member プラグインがどのように動作するかを見てみましょう。プラグインを正常に機能させるには、まず Pages セクションでいくつかのページを作成し、それらを Ultimate Member > 設定 にリンクする必要があります。その後、新しいロールを作成するか、Ultimate Member が提供するデフォルトのロールを使用することができます。
Subscriber ロールで登録しました。mysql の wp_usermeta テーブルを見ると、wp_capabilities の値がシリアライズされた配列として設定されており、それによってロール(この場合は Subscriber)が定義されていることがわかります。
wp_capabilities の値を変更するにはどうすればよいのでしょうか? 登録時に、以下のように wp_capabilities を POST リクエストのパラメータとして渡すことができます:
is_metakey_banned という関数があり、この関数は "cap_key"、"wp_capabilities"、"wp_user_level"、"user_activation_key" などのいくつかの値をチェックします。私たちが注目するのは wp_capabilities ですが、リクエストボディにそれを含めると、そこで break に達してロールの変更を防がれてしまいます。
à, è, ì, ò, ù, À, È, Ì, Ò, Ù のようなアクセント文字を受け入れることを発見しました。では、リクエストボディに wp_càpabilities=administrator のようにこれらの文字を使用するとどうなるでしょうか? それは class-user.php の 182 行目のブレークポイントに当たらず、is_metakey_banned 関数をバイパスできます。


a:1:{s:13:"administrator";b:1;} のようなもの)を持っている必要があります。では、これをそのままパラメータに渡してみましょう。
wp_capabilities の値を設定できましたが、期待どおりではありません。
wp_capabilities を見ると、それはシリアライズされた配列です。それが私たちの望むものです。WordPress には独自のシリアライゼーションがあるので、それを利用して値を配列として渡すことができ、残りは WordPress が処理します。私たちのペイロードは次のようになります:wp_càpabilities[administrator]=1
wp_capabilities の値が a:1:{s:13:"administrator";s:1:"1";} に変更され、管理者としてログインできるようになりました。
