Shikata Ga Nai

Private? There is no such things.

インセキュア・デシリアライゼーションの見つけ方

Hello there, ('ω')ノ

👀 どうやって見つけるの?

🧪 1. 通信の中にシリアライズされたデータがないか探す

Burp Suiteやプロキシツールで、Webアプリケーションとサーバーのやり取り(リクエストとレスポンス)を観察します。


🔍 よく見かけるシリアライズ形式

🐘 PHPのシリアライズ形式

人間でも読める形式で、文字と数字の組み合わせになっています。

例:

O:4:"User":2:{s:4:"name":s:6:"carlos";s:10:"isLoggedIn":b:1;}

意味:

  • O:4:"User" → 「User」という名前のクラスのオブジェクト
  • 2 → 属性が2つある
  • s:4:"name" → 「name」というキー
  • s:6:"carlos" → 値は「carlos」
  • b:1 → 値は真(true)

💡 PHPでは、serialize()unserialize()を使う箇所をソースコードで検索すれば、脆弱な処理を特定しやすいです。


☕ Javaのシリアライズ形式

バイナリ形式なので読みにくいですが、特定のパターンがあります。

  • 先頭のバイト列が必ず ac ed(16進数)や rO0(Base64)から始まる。
  • java.io.Serializable インターフェースを実装しているクラスはシリアライズ可能。
  • readObject() メソッドでオブジェクトを読み込んでいる箇所を探す。

🧠 Burp Suite Proの便利機能

Burp Suite Professionalでは、シリアライズされたオブジェクトらしきデータを自動で検出してフラグ付けしてくれます。


✅ まとめ

言語 見分け方 注意点
PHP O:s: などのシリアライズ文字列 unserialize() を使う箇所を重点的に調査
Java バイナリデータ(ac edrO0 readObject() を使う箇所に注意

Best regards, (^^ゞ