Shikata Ga Nai

Private? There is no such things.

シリアライズされたオブジェクトの属性を改ざんする方法

Hello there, ('ω')ノ

🔍 概要

シリアライズとは、プログラム内のオブジェクトを文字列やバイト列に変換する仕組みです。多くのWebアプリでは、セッション情報やユーザー情報をクッキーなどでやり取りするためにこの方法を使います。

しかし、オブジェクトの内容(属性)を改ざんすることで、認証バイパスや特権昇格などの攻撃が可能になります。


🛠 具体的な攻撃例

次のようなPHPオブジェクトがクッキーとして送信されていたとします:

O:4:"User":2:{s:8:"username";s:6:"carlos";s:7:"isAdmin";b:0;}

🧠 読み解きポイント:

  • O:4:"User":Userというクラス
  • username:"carlos"
  • isAdminfalse(管理者ではない)

🚨 攻撃者の改ざん手順

  1. isAdminb:1(true)に変更:
O:4:"User":2:{s:8:"username";s:6:"carlos";s:7:"isAdmin";b:1;}
  1. 変更後のシリアライズ文字列をBase64やURLエンコードなどしてクッキーとして再送信。

💣 なぜ危険?

サーバー側でこのような処理があった場合:

$user = unserialize($_COOKIE['user']);
if ($user->isAdmin === true) {
  // 管理者ページへアクセス可能
}

改ざんされたオブジェクトでも、サーバーは正規のユーザーと認識して管理者権限を与えてしまうのです。


✍ ポイントまとめ

項目 内容
狙うべき属性 isAdminrolebalance などの重要な値
改ざん方法 シリアライズデータを手動で変更 or プログラムで再生成
典型的な結果 管理者権限の奪取、セッション偽装など

🧪 実戦での応用のコツ

  • 値が"true/false""admin/user" のような簡単なものから狙いましょう。
  • オブジェクトをデコードして観察しやすくするツール(例:Burp、CyberChef) を活用すると効率的です。
  • Javaのようなバイナリ形式は、言語でオブジェクトを再作成してシリアライズする方が確実です。

Best regards, (^^ゞ