こんにちは。
GMOインターネットグループ株式会社 セキュリティエンジニアの谷山です。
私は2020年に新卒入社し、現在はセキュリティのチームにてWebアプリケーション脆弱性診断に従事しています。
脆弱性診断を行うために様々な脆弱性の知識が必要なので日々勉強しているところです。
さて、脆弱性には開発者の対策漏れで発生するものだけでなく
そもそもプログラム言語に用意されている処理で発生してしまうものがあります。
今回は、PHPなどの関数で用意されているシリアライズに潜む脆弱性について
Port Swiggerが公開しているWebSecurity Academyのページを使って一緒に挙動を見ていきましょう。
目次
注意事項
- 検査により、意図せずにシステムの停止や不具合を引き起こしてしまう可能性があるため、紹介する手順を試してみたい場合は本番に影響を及ぼさない検証環境か、それ専用に作られたテストサイトでの作業をお勧めします。
- 自組織が管理しないWebアプリケーションへの検査は、場合によっては不正アクセスとして違法となる可能性があります。
シリアライズされたデータ
まず、シリアライズとはアプリケーション上の構造を持ったデータを保存・伝達する目的でバイト列に変換する事をいい、反対にシリアライズされたデータをもとに戻ることをデシリアライズと言います。
ん・・・・・?
なんだかよく分かりませんよね?
私も言葉を聞いても良く分かりませんでした。
今回のテーマは「手を動かして理解する」ですので実際にテストページを見ていきましょう。
こちらがテストページのログインリクエストとレスポンスになります。

特にレスポンスに注目するとSet-cookieされているsessionの値は下記になっていますね。
Tzo0OiJVc2VyIjoyOntzOjg6InVzZXJuYW1lIjtzOjY6IndpZW5lciI7czo1OiJhZG1pbiI7YjowO30%3d一度ログアウトして再度ログインした際のSet-cookieされているsessionの値は上記に記載したものと全く同じでした。
つまり、乱数でsessionの値を生成しているのではなくユーザーごとにある規則性で生成されていそうですね。
先ほどのsessionの値を詳しくみていきましょう。
Tzo0OiJVc2VyIjoyOntzOjg6InVzZXJuYW1lIjtzOjY6IndpZW5lciI7czo1OiJhZG1pbiI7YjowO30%3d値の最後に%3dとありますのでURLエンコードされていそうです。
URLデコードしてみましょう。
Tzo0OiJVc2VyIjoyOntzOjg6InVzZXJuYW1lIjtzOjY6IndpZW5lciI7czo1OiJhZG1pbiI7YjowO30=%3dはURLエンコードで=になりましたね。
この=で、何か引っかかる方もいらっしゃいますかね?
この=というのは、とあるエンコード方式の特徴になっています。
そのエンコード方式というのは「BASE64」と呼ばれるものです。
BASE64でエンコードした場合は最後に4文字区切りで足りない文字は=で補います。
本記事ではエンコード・デコードの解説はしませんが、気になる方は別途調べてみてください。
少々エンコードの話をしてしまいましたので話を戻しましょう。
テストページのログインレスポンスのSessionの値をURLデコードしたら最後に=がありました。これはBASE64でエンコードされている気がするのでさらにBASE64でデコードしてみましょう。
すると下記文字列になりました。
O:4:"User":2:{s:8:"username";s:6:"wiener";s:5:"admin";b:0;}どうでしょうか?
何となく読める気がしませんか?
実はこれがシリアライズされたバイト列になります。
シリアライズ形式はデータの先頭に型やサイズがありその後データの文字列が続いています。
こちらを見ると下記のデータがありそうです。
username:wiener、admin:0以上が実際のサイトで使用されているシリアライズされたバイト列の例になります。
権限昇格を試みる
先ほど、シリアライズされたバイト列を確認しましたね。
もう一度確認していきましょう。
O:4:"User":2:{s:8:"username";s:6:"wiener";s:5:"admin"; b:0;}特に最後のadminのところが気になりますよね。
b:0とあるのでBoolean型の0だと考えられますね。
という事はb:1に変更するとどうなるのかやっていきます。
テストページでログインすると下記のような画面になっています。

この時のリクエストとレスポンスは下記のとおりです。

リクエストにはやはり先ほどと同じ値のcookieを持っていますね。
こちらに改ざんしたcookieを差し込んでいきます。
まずは先ほどBASE64デコードしたsessionの値のb:0部分をb:1に変更します。
O:4:"User":2:{s:8:"username";s:6:"wiener";s:5:"admin"; b:1;}変更したらこの値をBASE64でエンコードします。
Tzo0OiJVc2VyIjoyOntzOjg6InVzZXJuYW1lIjtzOjY6IndpZW5lciI7czo1OiJhZG1pbiI7YjoxO30=この値をさらにURLエンコードした文字列をMy-accountページを表示する際のcookieの値に指定すると
画面は下記になりました。

こちらをよく見てみるとAdmin panelが表示されていますね。
AdminのBoolean型の値を1にしたことでAdmin権限として表示されたことになり
実際に権限昇格が実行出来ました。
おわりに
いかがでしたでしょうか。
このようにプログラム言語に関数として機能がありますが、使い方を考えないと
思いもよらない攻撃をされてしまう可能性があります。
基本的にはシリアライズ機能は使わずにJSON形式などでデータを受け渡しする方が良いとされています。
昨今のサイトではほとんど使用していない気がしますが、昔に作成したサイトをそのまま運用しているというような場合はシリアライズ機能がないかチェックしてみると良いかと思います。
ブログの著者欄
採用情報
関連記事
KEYWORD
CATEGORY
-
技術情報(611)
-
イベント(244)
-
カルチャー(61)
-
デザイン(78)
TAG
- 5G
- Active Directory
- ADB
- AI
- AI for DevOps
- AI TALK
- AI 機械学習強化学習
- AI/機械学習
- AIO
- AIエージェント
- AIコーディング
- AIコーディングエージェント
- AIセキュリティ
- AI人財
- AI教育
- AI活用
- AI研究
- AI駆動
- Behind the Scenes
- BIT VALLEY
- blockchain
- ChatGPT
- ChatGPT Team
- Claude Code
- Claude Team
- CLI
- cloudflare
- cloudnative
- CNDO
- CNDT
- CODE BLUE
- ConoHa
- ConoHa VPS
- ConoHa VPS MCP
- CSS
- CTF
- DBMS_CLOUD
- DEF CON
- DEF CON 34
- Designship
- developer
- DevRel
- DevSecOpsThon
- Docker
- DTF
- EDR
- Engineering Journey
- Expert
- Expert Cross
- GMO AI&ロボティクス商事
- GMO AIR
- GMO DESIGN AWARD
- GMO Developers Day
- GMO Developers Night
- GMO Flatt Security
- GMO GPUクラウド
- GMO Hacking Night
- GMO kitaQ
- GMO SONIC
- GMOアドパートナーズ
- GMOアドマーケティング
- GMOインターネット
- GMOインターネットグループ
- GMOインターネットグループ陸上部
- GMOグローバルサイン
- GMOコネクト
- GMOサイバーセキュリティ byイエラエ
- GMOサイバーセキュリティbyイエラエ
- GMOデジキッズ
- GMOヒューマノイド・ラボ
- GMOブランドセキュリティ
- GMOペイメントゲートウェイ
- GMOペパボ
- GMOメイクショップ
- GMOメディア
- GMOロボッツ
- GMO大会議
- GMO天秤AI
- Go
- GPUクラウド
- GTB
- Hack-1グランプリ
- IETF
- iOS
- IoT
- ISUCON
- Japan Drone
- JapanDrone
- Java
- Jev
- JJUG
- JSAI2026
- K8s
- Kaigi on Rails
- Kerberos
- Kids VALLEY
- LLM
- LLMO
- MCP
- MCP Server
- MetaMask
- MySQL
- NFT
- Nuxt
- OpenStack
- Oracle
- Oracle Autonomous Database
- OSS
- Perl
- PHP
- PHPcon
- PHPerKaigi
- PL/SQL
- Python
- QUIC
- RFC
- RPA
- Ruby
- SECCON
- Selenium
- Spectrum Tokyo Meetup
- splunk
- SQL
- SRE
- Takumi byGMO
- Terraform
- TypeSafe AI
- TypeScript
- UI/UX
- vibe
- VLA
- VPN
- VPS
- VS Code
- WebRTC
- Webアプリケーション開発
- Webアプリ開発
- XR
- XSS
- Yoitoi Summit
- ZTNA
- アウトプット
- アドベントカレンダー
- イベントレポート
- インターンシップ
- インハウス
- インフラ
- エキスパート制度
- エキスパート座談会
- エンジニア採用
- エンジニア文化
- お名前.com
- カスタマーサポート
- クラウド
- クリエイターインタビュー
- クリエイティブ
- コーディングエージェント
- コンテナ
- コンピュータビジョン
- サイバーセキュリティ
- サマーインターン
- スクラム
- スパム対策
- スペシャリスト
- セキュリティ
- セキュリティカンファレンス
- セキュリティ人材
- センシング
- ソフトウェアサプライチェーン
- ソフトウェア開発
- チームビルディング
- データサイエンティスト
- データベース
- デザイン
- デプロイ
- ネットのセキュリティもGMO
- ハーネスエンジニアリング
- バイブコーディング
- バックエンド
- ヒューマノイド
- ヒューマノイドロボット
- フィジカルAI
- フルスタック開発
- プログラミング教育
- プロダクト開発
- ブロックチェーン
- フロントエンド
- プロンプトインジェクション
- ペアリング暗号
- ペネトレーションテスト
- ホスティング
- ホワイトハッカー
- ゆめみらいワーク
- リモートワーク
- レッドチーム
- レンタルサーバー
- ロボット
- ロボット導入
- ロボティクス
- ロリポップ!
- ロリポップ!デプロイナウ
- ワークフロー
- 世界モデル
- 京大ミートアップ
- 京都大学
- 京都未踏
- 人型ロボット
- 人工知能
- 人工知能学会
- 個人情報検出
- 光学
- 分類
- 国際ロボット展
- 国際標準化
- 基礎
- 多拠点開発
- 大阪公立大学
- 宇宙セキュリティ
- 宮崎オフィス
- 強化学習
- 応用
- 技育プロジェクト
- 技術イベント
- 技術ブログ
- 技術同人誌
- 技術広報
- 技術書典
- 拡張知能
- 新卒
- 新卒研修
- 新規サービス開発
- 映像
- 映像クリエイター
- 映像制作
- 暗号
- 未踏
- 業務効率化
- 機械学習
- 次世代育成
- 決済
- 生成AI
- 産学連携
- 研究開発
- 社会実装
- 社内コミュニティ
- 組織横断
- 耐量子暗号
- 脆弱性診断
- 自動化
- 自律実行
- 若手人材育成
- 通信技術
- 開発組織
- 開発者
PICKUP
-
【エキスパート座談会 #2】AI時代の技術コミュニティ:社内・社外のつながりと、これからの役割
技術情報
-
AIと作ったWebアプリをすぐに公開 エンジニアリングリード・深野悠吾さんに聞く、「ロリポップ!デプロイナウ byGMOペパボ」開発秘話・前編
技術情報
-
JevをOracleの関数にしてみた
技術情報
-
AI時代、人の心はどこで動くのか?GMO DESIGN AWARD 2026 審査員有馬トモユキ・清水勝太・広野萌が語る、作品に宿る 「作り手の理由」
デザイン
-
【エキスパート座談会 #1】生成AI活用の現在地:作業の自動化から「仕組みづくり」へ
技術情報
-
【第4回・AI TALK】GMOインターネットグループ・石丸智輝さんに聞く、AI時代に「人が書く意味」
技術情報