こんにちは。
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
- 
                  技術情報(516)
 - 
                  イベント(193)
 - 
                  カルチャー(50)
 - 
                  デザイン(47)
 
TAG
- "eVTOL"
 - "Japan Drone"
 - "ロボティクス"
 - "空飛ぶクルマ"
 - 5G
 - Adam byGMO
 - AGI
 - AI
 - AI人財
 - APT攻撃
 - AWX
 - BIT VALLEY
 - Blade
 - blockchain
 - Canva
 - ChatGPT
 - ChatGPT Team
 - Claude Team
 - cloudflare
 - cloudnative
 - CloudStack
 - CM
 - CNDO
 - CNDT
 - CODEGYM Academy
 - ConoHa
 - ConoHa、Dify
 - CS
 - CSS
 - CTF
 - DC
 - design
 - Designship
 - Desiner
 - DeveloperExper
 - DeveloperExpert
 - DevRel
 - DevSecOpsThon
 - DiceCTF
 - Dify
 - DNS
 - Docker
 - DTF
 - Expert
 - Felo
 - GitLab
 - GMO AIR
 - GMO AIロボティクス大会議&表彰式
 - GMO DESIGN AWARD
 - GMO Developers Day
 - GMO Developers Night
 - GMO Developers ブログ
 - GMO Flatt Security
 - GMO GPUクラウド
 - GMO Hacking Night
 - GMO kitaQ
 - GMO SONIC
 - GMOアドパートナーズ
 - GMOアドマーケティング
 - GMOイエラエ
 - GMOインターネット
 - GMOインターネットグループ
 - GMOクラウド]
 - GMOグローバルサイン
 - GMOサイバーセキュリティbyイエラエ
 - GMOサイバーセキュリティ大会議
 - GMOサイバーセキュリティ大会議&表彰式
 - GMOソリューションパートナー
 - GMOデジキッズ
 - GMOブランドセキュリティ
 - GMOペイメントゲートウェイ
 - GMOペパボ
 - GMOメディア
 - GMOリサーチ
 - GMO大会議
 - Go
 - GPU
 - GPUクラウド
 - GTB
 - Hardning
 - Harvester
 - HCI
 - iOS
 - IoT
 - ISUCON
 - JapanDrone
 - Java
 - JJUG
 - K8s
 - Kaigi on Rails
 - Kids VALLEY
 - KidsVALLEY
 - LLM
 - MCP
 - MetaMask
 - MySQL
 - NFT
 - NVIDIA
 - NW構成図
 - NW設定
 - Ollama
 - OpenStack
 - Perl
 - perplexity
 - PHP
 - PHPcon
 - PHPerKaigi
 - PHPカンファレンス
 - QUIC
 - Rancher
 - RPA
 - Ruby
 - Selenium
 - Slack
 - Slack活用
 - Spectrum Tokyo Meetup
 - splunk
 - SRE
 - SSL
 - Terraform
 - TLS
 - TypeScript
 - UI/UX
 - vibe
 - VLAN
 - VS Code
 - Webアプリケーション
 - WEBディレクター
 - XSS
 - アドベントカレンダー
 - イベントレポート
 - インターンシップ
 - インハウス
 - オブジェクト指向
 - オンボーディング
 - お名前.com
 - カルチャー
 - クリエイター
 - クリエイティブ
 - コーディング
 - コンテナ
 - サイバーセキュリティ
 - システム研修
 - スクラム
 - スペシャリスト
 - セキュリティ
 - ソフトウェアテスト
 - チームビルディング
 - デザイン
 - ドローン
 - ネットのセキュリティもGMO
 - ネットワーク
 - ビジネス職
 - ヒューマノイド
 - ヒューマノイドロボット
 - プログラミング教育
 - ブロックチェーン
 - ベイズ統計学
 - マルチプレイ
 - ミドルウェア
 - モバイル
 - ゆめみらいワーク
 - リモートワーク
 - レンタルサーバー
 - ロボット
 - 京大ミートアップ
 - 人材派遣
 - 出展レポート
 - 動画
 - 協賛レポート
 - 基礎
 - 多拠点開発
 - 大学授業
 - 宮崎オフィス
 - 展示会
 - 応用
 - 技育プロジェクト
 - 技術広報
 - 採用
 - 採用サイトリニューアル
 - 採用活動
 - 新卒
 - 新卒研修
 - 日本科学未来館
 - 映像
 - 映像クリエイター
 - 暗号
 - 業務効率化
 - 業務時間削減
 - 機械学習
 - 決済
 - 物理暗号
 - 生成AI
 - 視覚暗号
 - 開発生産性
 - 開発生産性向上
 - 階層ベイズ
 - 高機能暗号
 
PICKUP
- 
                  
                    
                                        東京・福島・福岡の専門学校3校でConoHa AI Canvasを用いた講義を実施しました
技術情報
 - 
                  
                    
                                        【協賛レポート・前編】Designship 2025|参加者と“共につくる”デザインのかたち──私たちの挑戦を振り返る
デザイン
 - 
                  
                    
                                        NFSのパフォーマンストラブルに対応した話
技術情報
 - 
                  
                    
                                        Microsoft Entra アプリケーション プロキシ × Windows 統合認証環境での NTLM 廃止影響と対策
技術情報
 - 
                  
                    
                                        GMOインターネットグループ合同テクノロジーインターンシップ2025 体験記~ML/Webコース編①~
カルチャー
 - 
                  
                    
                                        ChatGPTとConoHa AI Canvasで検証:生成AIが変えるクリエイティブ制作
技術情報