IT・技術研修ならCTC教育サービス

サイト内検索 企業情報 サイトマップ

研修コース検索

コラム

ウェブ・セキュリティ学習のため徳丸本を読んでみた

CTC 教育サービス

 [IT研修]注目キーワード   Python  UiPath(RPA)  最新技術動向  Microsoft Azure  Docker  Kubernetes 

第4回 クッキーとセッション管理の基本をおさらいしよう (三雲 勇二) 2023年5月

みなさん、こんにちは。 エンジニアをしております、三雲と申します。

普段は初心者エンジニアに Web セキュリティについて教えることがあります。
ウェブセキュリティの分野は徳丸本(安全なWebアプリケーションの作り方 第2版)をオススメしております。
今回も初心者の気持ちで徳丸本を読んで、気になった部分について確認していきたいと思います。

前回まで実習環境を準備することに主眼をおいてきました。
実習環境を重視しているのは、手を動かして動作を確認しながら読み進めると、圧倒的に理解が進むからです。
まだ実習環境を準備していない方は、ぜひ実習環境をご準備のうえでいっしょに試していきましょう!
私は M1 MacBook & Docker 環境で実習しております。

さて今回は、紙書籍版 p.62 ~ p.72 の部分の内容になります。
テーマは「クッキーとセッション管理の基本をおさらいしよう」です。

クッキーとセッションは昔からある技術ですが、現在でも Web アプリケーションで必須の技術です。
基本的なところをきちんと原理原則のもと理解しておくと、新しい分野の知識を理解する上で重要となりますので、しっかり学習しておきたいところです。

せっかくですので私も初心に戻り、新人エンジニアやこれからエンジニアを目指している方の「Webセキュリティは大事なので改めて勉強してみよう!」という視点で、分かりやすい記事になればと思います。 どうぞよろしくお願いいたします。

セッションの動作確認

まずは、大事な原理原則のおさらいです。
HTTP および HTTPS は基本的にステートレスなプロトコルとなります。
ステートとは状態のことを意味しています。状態がない(レス)なので、ステートレスと呼ばれます。

では、実際に実習してみましょう。
ユーザ名を入力して、他のページでちゃんと同じユーザー名を維持できるか確認します。

実習用の Firefox を開いて下記ページにアクセスします。

http://example.jp/31/31-020.php

fig01

「ユーザ名」と「パスワード」を入力する欄が出ました。
これは空の文字でなければ何でもよいみたいなので、今回は次の値でログインしてみます。

  • ユーザ名: Mikumo
  • パスワード: pass

「ログイン」ボタンをクリックすると、別のページへ画面が遷移(せんい)します。

http://example.jp/31/31-021.php

fig01

パスワードの保存ダイアログが出た場合は「保存しない」をクリックしておきましょう。
少し難しい言葉を使用しましたが、「遷移」とはうつりかわることです。
「遷移」もエンジニアはよく使う言葉なので、こちらも覚えておきましょう。

「プロフィール」という文字がリンクになっているので、こちらをクリックしてみましょう。

http://example.jp/31/31-022.php

fig01

また別のページへ遷移しました。ユーザIDに、さきほど入力した「Mikumo」という文字が表示されています。

これはショッピングサイトなどでよく見る内容ですね。

セッションを無効化してみよう

今回使用されている PHP ファイルを加工して、セッションを無効化してみましょう。
ソースコードを編集するときには、もとに戻せるようにしておきましょう。

  • 31/31-022.php

この中で、次のようなコードがあります。


  session_start(); // セッションの開始

コメントアウトしてみましょう。


//  session_start(); // セッションの開始

Docker コンテナで実習環境の中に入ってソースを編集したい場合は、

Visual Studio Code (VS Code) + Remote Development プラグイン

この組み合わせが使いやすいかと思います。

先ほどと同じように、実習用の Firefox を開いて下記ページにアクセスします。

http://example.jp/31/31-020.php

fig01

「ユーザ名」と「パスワード」は先程と同じものを使用します。

  • ユーザ名: Mikumo
  • パスワード: pass

「ログイン」ボタンをクリックすると、先ほどと同じように別のページへ画面が遷移(せんい)します。

http://example.jp/31/31-021.php

fig01

「プロフィール」という文字がリンクになっているので、こちらをクリックしてみましょう。

http://example.jp/31/31-022.php

fig01

先ほどと同じように別のページへ遷移しました。
今度はエラーが表示されているはずです。


Warning: Undefined global variable $_SESSION in /var/www/html/31/31-
022.php on line 3 Warning: Trying to access array offset on value of type
null in /var/www/html/31/31-022.php on line 3 ログインしてください

これは、さきほどコメントアウトしたページはこのページだけなので、このページのセッションが作られなくなりました。


//  session_start(); // セッションの開始

最初に確認したとおり HTTP はステートレスです。
このページは、サーバー側ではセッションが作らなかったのでユーザ名が表示できませんでした。

クッキーを確認してみましょう。

fig01

徳丸本にある通り、クッキーには最初のページ(31/31-020.php)で作成されたものが格納されています。
クライアント側ではクッキーをある意味準備ができている状態です。
しかし、サーバー側でセッションの準備ができていないとセッションの維持はできないようです。

クッキーを加工してみよう

次に、クライアント側のクッキーを加工してみます。

まずは先程のサーバー側のソースコードのコメントを戻しておきます。

  • 31/31-022.php

//  session_start(); // セッションの開始

コメントを外しましょう。


  session_start(); // セッションの開始

クッキーを Firefox 側から確認してみましょう。
先ほどと同じように、実習用の Firefox を開いて下記ページにアクセスします。

http://example.jp/31/31-022.php

fig01

今回は Firefox の開発者モードを画面の下部に表示しております。
Cookies の中に PHPSESSID ではじまるセッション用のクッキー値が格納されていることが確認できます。


PHPSESSID:"453e9706e423afb23df7890c680d921d"

では、このクッキーの値を他のアクセスから使うとどうなるのか試してみましょう。
今回は Firefox のプライベートブラウジング機能を使って、別のアクセスとして認識させます。

http://example.jp/31/31-022.php

fig01

直接、ユーザ名を表示するページにアクセスしましたが、当然ログインをしていないため、エラーメッセージが表示されました。
このとき、プライベートブラウジング中の Firefox にもクッキーが発行されていますので値を確認してみましょう。


PHPSESSID:"2535aff515cbf0a0f716be3455d56a4d"

先ほどとは別の値が入っています。
ここに、先程ログインが成功している通常のブラウザで取得したクッキーの値 453e9706e423afb23df7890c680d921d に書き換えてアクセスし直してみます。

fig01

なんと、ユーザ名の Mikumo が取得できてしまいました!
今回のクッキー PHPSESSID はセッション ID と呼ばれているものです。
これが外部に漏れると、簡単にユーザ名などのデータを第三者が取得できることがわかりました。

上記のような情報漏えいを防ぐために、徳丸本 p69 で書かれている「セッションID漏洩防止」の内容をきちんと理解することで対策できそうです!

実習環境で試してみると、情報漏えいは簡単に起きうることがわかりました。
普段から原理原則に乗っ取り、プログラムをする際にはセッション ID の管理に細心の注意を払うことが必要です。

おすすめ!書籍のおすすめコラム

ちょっと実習環境から離れて、書籍のコラムをご紹介します。
今回は「p.62 認証と認可」のご紹介です。

「認証(Authentication)」と「認可(Authorization)」という単語は日本語も英語も似ており、はじめのうちはよく混同されがちです。
また、実習環境で動作確認するところでもそこまで意識が向かない部分になります。

例えば、遊園地に入場券を買って入った場合を考えてみましょう。これは「認証」でしょうか?「認可」でしょうか?「認証」と「認可」の組み合わせでしょうか?それとも、どちらでもないのでしょうか?
この場合は入場者を個人として判別する必要がなければ、「認可」のみとなります。

この基本的な意味がわかっていないと、クラウドなどで推奨されているゼロトラストなどの発展した考え方で間違った理解をすることになりかねません。
「認証」と「認可」の違いの説明に自信がない方はしっかりと読むと良いコラムです!

サポートサイトも確認

安全なWebアプリケーションの作り方 第2版」では、書籍に書かれている内容をお手元で試せる環境がダウンロードできます。

こちらの書籍、著者の徳丸先生がサポートサイトを公開しています!

安全なWebアプリケーションの作り方 第2版 サポートサイト

https://wasbook.org

実習環境VMのダウンロード、正誤表のリンクなど、必要な情報がまとめて手にいれられます。
今回の Docker 対応実習環境もこちらで情報を入手することができました。
こちらブックマーク(お気に入り)に追加しておいてください。

今回のコラムはいかがでしたでしょうか?
ウェブセキュリティを短期間で正しく理解するにはウェブセキュリティ研修が有効です。
興味がある方は以下の研修ページをご覧の上、是非ご受講ください。
https://www.school.ctc-g.co.jp/websecurity/

 


 

 [IT研修]注目キーワード   Python  UiPath(RPA)  最新技術動向  Microsoft Azure  Docker  Kubernetes