Webセキュリティ周りのメモ

# 攻撃

## パスワードクラッキング

**概要**

IDとパスワードによる認証を行う会員制Webサイトからユーザーのパスワードを抜き出そうとする攻撃。

**手法**

- 辞書攻撃
    - ユーザーがパスワードで使いそうな単語を辞書として登録し、それを使ってパスワードを当てる方法
- ブルートフォース攻撃
    - パスワードに使われる文字の全組み合わせをしらみつぶしに試す方法

**対策**

パスワードの長さを指定したり、記号を必須にするなど。

## Dos攻撃

**概要**

短時間にサーバが処理しきれないような大量アクセスを行い、サービス停止に陥らせる攻撃。

**手法**

- SYNフラッド攻撃
    - TCPの接続要求を行うSYNパケットのみを大量に送りつける、サーバを接続待機状態にさせ、別のユーザからの新たな接続を確立できなくする
- F5攻撃
    - Webブラウザに表示されたWebページを何度も繰り返し再読み込みすることで、Webサーバを過負荷状態に陥らせる攻撃

**対策**

不自然なアクセスの増加を検知し、送信元からのIPアドレスからのアクセスをいち早く遮断する仕組みづくり。

## XSS（クロスサイトスクリプティング）

**概要**

攻撃者が悪意のあるスクリプトを正当なウェブページに挿入し、ブラウザ内でスクリプトを実行させること。
結果として、ユーザーのクッキー情報などの機密情報を盗んだり、偽のサイトを表示させたりすることができる。


**対策**

- バリデーション（サーバーサイド必須）
- エスケープ（スクリプトをただの文字列として扱う）

## CSRF（クロスサイトリクエストフォージェリ）

**概要**

ログインしているユーザーに対して不正なリンク（お金を攻撃者の口座に送金するリクエストなど）を踏ませることで、あたかもそのユーザーが操作しているかのように不正なリクエストを送信させる攻撃手法。

**対策**

アクセスかどうかチェックして処理を実行する。

- フォームに一時的なトークンを埋め込み、サーバ側でそのトークンの正当性を検証する
    - 入力画面が表示されたタイミングでワンタイムパスワードを発行し、hiddenタグとセッション変数に保存しておく
    - リクエストが実行されたら、送られてくるワンタイムパスワードとセッションに保存されているワンタイムパスワードを照合し、一致しているか確認する
- JWT認証の利用
    - リクエストのAuthorizationヘッダにJWTを載せることでCSRF脆弱性を防げる（Cookieに保存するとJWTがサーバーに渡ってしまう）
    - 攻撃者はリクエストヘッダの内容を任意に変更することができない

## セッションハイジャック

**概要**

第三者が何らかの方法でCookieの中身やセッションIDを取得し、ログイン済みユーザーとしてシステムを利用されること。

**手法**

- セッションIDの推測
    - ブルートフォース攻撃などで可能
- クロスサイトスクリプティング
    - ログインしているユーザーに対して不正なリンクを踏ませることで、あたかもそのユーザーが操作しているかのように不正なリクエストを送信させる手法
- セッションフィクセーション
    - 攻撃者が取得した正規のセッションIDを、ハイパーリンク経由などで別のユーザーに利用させ、その騙されたユーザーのログイン状態に便乗する方法

**対策**

- 通信の暗号化
- ログインしたユーザーが急に異なるIPアドレスから接続したきた場合に強制的にログアウトさせる仕組みづくり

## SQLインジェクション

**概要**

不正なSQLクエリの断片をWebアプリケーションの入力として注入することで、データベースを不正に操作したり、データを不正に取得したりする攻撃手法。

**対策**

ユーザーが指定した文字列をSQLにそのまま結合しないこと。

具体的にはプレースホルダ（何らかの値を後で置き換えるための予約された場所や記号）を用いて、命令の一部ではなくあくまで値として扱われるようにする。

# 暗号化

## 概要

元のデータを暗号化アルゴリズムで第三者が読み取れないデータにすること。

以下のような種類がある。

- 通信経路での暗号化（SSLやSSH通信）
- 保存データの暗号化（暗号化したデータを保存し、利用する度に復号する）
- ハッシュを利用したログイン処理（パスワードをハッシュ化して保存し、送信されてきたデータをハッシュ化して比較）
    - ハッシュ値から元の入力データを再現することは非常に困難
    - 同じ入力に対しては、常に同じハッシュ値が生成される

## ハッシュ化

**概要**

ハッシュ化とは、ハッシュ関数という特定の計算手法を使用して、任意の長さのデータを固定の長さのデータ（ハッシュ値）に変換するプロセスのこと。

以下の特徴をもつ。

- 同じ入力に対しては常に同じハッシュ値が生成される
- 異なる入力に対しては、異なるハッシュ値が生成される確率が非常に高い
- 元のデータからハッシュ値を逆算して元に戻すのは非常に困難
- 検索や比較が高速

**使い所**

- パスワードの保存
- データの一貫性（破損や改竄の是非）の確認に応用できる
    - 大量のデータや大きなファイルを直接比較する場合でも高速に検証できるため
    - データを送受信するフローが発生する場合でも、ハッシュ値ならば復元できないため
    - 元のデータが異なればハッシュ値も大きく異なるため
- キャッシュシステム
    - コンテンツが更新されたかどうかを高速に判定できる（内容のハッシュ値が変わっていれば内容も更新されたと判断できる）
- ハッシュテーブル
    - キーをハッシュ値に変換し、それをインデックスとして使用する

## SSL通信

ネットワーク上でのデータ通信を暗号化するためのプロトコル。

主にWebブラウザとサーバー間の通信を暗号化し、HTTP通信をHTTPSとしてセキュアにするために使用される。

以下のような利点がある

- 暗号化通信による盗聴防止
- メッセージダイジェストによる改ざん防止（送受信時にハッシュ値を比較して検証）
- なりすまし防止（SSLサーバ証明書を接続時に検証することでサーバーの正当性を証明）

公開鍵証明書（SLLサーバー証明書）とは、アクセス先のWebサイトが本物であることを証明するもの。

認証局と呼ばれる第三者機関から発行される。役割は以下の2つ。

1. HTTPS通信に使うための公開鍵の持ち主が誰なのかを証明する
2. 公開鍵の持ち主が実在することを証明する

## SSH通信

**概要**

暗号化されたセキュアな通信を提供するプロトコル。

これにより、盗聴やデータの改ざん、なりすましなどのリスクから保護された状態でリモートマシンにアクセスしたり、データを転送したりすることができる。

**流れ（公開鍵認証方式）**

1. キーペアの作成
2. 秘密にしたいものを、公開鍵で鍵をかける
3. 秘密鍵を持っている人のみがアクセスできる

公開鍵は南京錠、秘密鍵がその鍵のイメージ。

**利点**

- パスワードを使わずに認証できる
- 暗号化通信による盗聴防止
- 身元を確認できる（該当のキーペアでしか複合できないため）
- 改ざんの検知（送受信時にハッシュ値を比較して検証）