【セキュリティ】安全なWebアプリケーションの作り方まとめ

はじめに

Webアプリを作っていく中でセキュリティ面などそろそろ知っておきたいなと思ったので勉強しました。
(書籍、たぶん3,4か月放置してた。。。)

✅ゴール

・セキュリティ面の理解を深める

✅環境

Windows/XAMPP
※教材ではVirtualBoxを使用する。

✅参考教材

体系的に学ぶ 安全なWebアプリケーションの作り方

脆弱性とは

コンピュータのOSやソフトウェアにおいて、プログラムの不具合や設計上のミスが原因となって発生した情報セキュリティ上の欠陥のこと。

起こりうるリスク(悪用できるバグ)
・個人情報の流出
・Webサイトの内容書き換え
・ウイルス感染
・秘密情報の閲覧・売買
※経済的損失、法的な要求、精神的苦痛など及ぼす影響は様々。
原因
・バグ ex) SQLインジェクション/XSS(クロスサイト・スクリプティング)
・チェック機能不足 ex) ディレクトリ・トラバーサル脆弱性)

👇

・脆弱性には処理に起因するものと出力に起因するものがある
・入力に起因する脆弱性はない
・出力に起因する脆弱性には「インジェクション(注入)」が付くものが多い

脆弱性の種類

SQLインジェクション:SQL呼び出しに伴う脆弱性

データの中に引用符やデリミタなど「データの終端」を示すマークを混入させて、そのあとの文字列の構造を変化させる。

リスク:データベースの情報が盗まれる、書き換えられる、認証回避など

クロスサイトスクリプティング(XSS):表示処理に伴う問題

外部からの入力に応じて表示が変化する箇所、この部分のHTML生成の実装に問題があると生じる。

リスク:なりすましや個人情報が盗まれる。

手法:JavaScriptによるクッキー情報の取得。(フォーム入りのビューの描画などHTML要素のすり替え)

クロスサイト・リクエストフォージェリ(CSRF):「重要な処理」の際に混入する脆弱性

利用者の意図したリクエストであることの確認が漏れると、罠サイト経由で、利用者のブラウザから「重要な処理」を実行させられる場合がある。

リスク:利用者アカウントによる物品購入、退会処理、SNSや問い合わせフォームへの書き込み、パスワード・メールアドレスの変更。

対策:重要な処理を実行する前に、意図したリクエストであることを確認してもらう。秘密情報(トークン)の埋め込み。

※クリックジャッキングも同様のリスクがある。

✅セッションハイジャック:セッション管理の不備

リスク:利用者のなりすまし

✅オープンリダイレクト:リダイレクト処理にまつわる脆弱性

リスク:フィッシングサイトへの誘導を通じて、個人情報が盗まれる

✅クッキー出力にまつわる脆弱性

リスク:HTTPヘッダ・インジェクション脆弱性、クッキーのセキュア属性不備

✅メールヘッダ・インジェクション脆弱性:メール送信の問題

リスク:本文改ざん、迷惑メール送信の悪用(ウイルスメール)

✅OSコマンド・インジェクション:OSコマンド呼び出しの際に発生する脆弱性

リスク:Webサーバー内のファイルの閲覧、改ざん、削除。

✅キャッシュ制御不備による脆弱性

✅Web API実装における脆弱性(JSONハイジャック)

✅JavaScriptの問題

WebStorageの不適切な使用(重要な情報は保存しない)など。

HTTPとセッション管理

Webの特性に由来する脆弱性を理解するには、HTTPやセッション管理についての理解が不可欠。

☞認証/認可周りで脆弱性が起きやすいため。

✅リクエストメッセージとレスポンスメッセージ

ブラウザから送信する値(リクエストメッセージ)は利用者が書き換え可能。

※POSTメソッドは、ブラウザから入力された値が送信される。

まさる
情報量が多いので割愛。リクエストメッセージとレスポンスメッセージの中身をOWASP ZAPを通じてみることができたので、今までなんとなく理解していたリクエスト/レスポンスの理解が一気に深まった気がする。

✅認証と認可

HTTPプロトコルはステートレスで、サーバー側では状態を保持しない。
サーバー側でアプリケーションの認証状態を覚えておく仕組みをセッション管理と呼ぶ。

・認証:利用者が本人であることを何らかの手段で確認すること。
・認可:認証済みの利用者に権限を与えること。

✅クッキーとセッション変数

CookieにsessionのIDを格納することで、安全な通信が可能となる。

・クッキー:セッション管理をHTTPで実現する目的で導入された仕組み。レスポンスヘッダ(クライアント側)でクッキー値を保持する。(保持できる量に制限がある)
・セッション:一連の処理の始まりから終わりまでを表す概念。クッキー(セッションIDを管理させる)を利用した一連の操作のこと。
※Webブラウザを閉じるまで、リンクページなどに移動しても値を保持できる。サーバー側に保尊される。
・セッション変数:セッションにおけるパラメータの関連付けを格納する領域。認証成功後にセッションIDとログイン(ユーザー)IDを紐づけるなど。

この記事が大変参考になる⇒セッションとクッキーの違い

押さえておきたい用語

プロキシ

企業などの内部ネットワークとインターネットの境界にあり、内部のコンピュータの「代理」(proxy)としてインターネット上のコンピュータへ接続を行うコンピュータのこと。また、そのような機能を持つサーバソフトウェア。

おわりに

セキュリティに関して以前より理解を深めることができた。

しかし、各種脆弱性に対する対策法などしっかりと学んだわけではないので、Webアプリ制作を通じて意識しながら深堀していこうと思います。

参考

Cookieとセッションをちゃんと理解する
これだけは知っておきたいセッション変数の基礎 (1/4)
セッションとクッキーの違い
【PHP超入門】Cookieとセッションについて

学習の備忘録

割愛した部分

P73 受動的攻撃と同一ポリシー
P85 CORS(Cross-Origin Resource Sharing)
P102 入力処理とセキュリティ
P138 クロスサイト・スクリプティング(発展編)
P197 クリックジャッキング
P240 HTTPヘッダ・インジェクション
P281 ファイルアクセスにまつわる問題
P308~以降ざっと
P524~以降ほぼ読めてない

コメントを残す