Amarronの日記

iOSやMac、Web系の記事を書きます。

Web系 システム 開発 セキュリティ 備忘録

f:id:Amarron:20141124135656j:plain

概要

ウェブアプリケーションのセキュリティの基礎や入門的な部分をざっくり書き出しました。
ログイン機能を使う場合やインフラよりのセキュリティは書いていません。

  1. 脆弱性の原因と攻撃パターン
  2. 脆弱性一覧
  3. 入力処理の脆弱性
  4. 表示処理の脆弱性
  5. SQL脆弱性
  6. まとめ

1. 脆弱性の原因と攻撃パターン

脆弱性が生まれる理由

  1. バグによるもの
  2. チェック機能不足によるもの
    • ディレクトリ・トラバーサル等

能動的攻撃と受動的攻撃

  • 能動的攻撃:攻撃者がwebサーバーに対して直接攻撃すること(SQLインジェクション等)
  • 受動的攻撃:攻撃者がwebサーバーに対して直接攻撃せず、Webサイトの利用者に罠を仕掛ける
    • 単純な受動的攻撃:ユーザーが怪しいサイト閲覧してウィルスに感染
    • 正規サイトを悪用する受動的攻撃:攻撃者がwebサーバーに対して不正操作をして、ユーザーが正規サイトに訪れるとウィルスに感染
    • サイトをまたがった受動的攻撃:①ユーザーが罠サイトを閲覧②ユーザーが正規サイトに攻撃のリクエスト送信③正規サイトからJSなどの仕掛けを含むレスポンスが返却

2. 脆弱性一覧

  • 脆弱性には出力に起因するものと処理に起因するものがある
  • 出力に起因する脆弱性には「インジェクション」という単語がつくものが多い
    • インジェクションとは、「"」「'」等の終端マークを混入させ処理や出力の構造を変化させる行為
# 処理の流れ
クライアントブラウザ
   ↓ HTTPリクエスト
サーバー(入力値検証→処理→出力)
   ↓ HTTPレスポンス
クライアントブラウザ

機能と脆弱性の対応

処理 出力 対応アプリ 発生する脆弱性の種類 起因する脆弱性
処理 表示/HTML ブラウザ クロスサイト・スクリプティング
HTTPヘッダ・インジェクション
出力
処理 DB/SQL RDB SQLインジェクション 出力
処理 外部コマンド シェル OSコマンド・インジェクション 出力
処理 メール メール メールヘッダ・インジェクション 出力
処理 ファイル ファイル ディレクトリ・トラバーサル 処理
重要な処理 - - クロスサイト・リクエストフォージェリ 処理
認証 - - セッションフィクセーション 処理
許可 - - 認可不備 処理

インジェクション系脆弱性

脆弱性 インターフェース 悪用手口 データの終端
クロスサイト・スクリプティング HTML JS等の注入 < " など
HTTPヘッダ・インジェクション HTTP HTTPレスポンスヘッダの注入 改行
SQLインジェクション SQL SQL命令文注入 ' など
OSコマンド・インジェクション シェルスクリプト コマンドの注入 ; | など
メールヘッダ・インジェクション sendmailコマンド メールヘッダ、本文の注入・改変 改行

3. 入力処理の脆弱性

  • Webアプリケーションの入力には、HTTPリクエストとしてわたらせるパラメータ(GET,POST,cookieなど)がある
  • 入力処理には次の3つの検証・変換が必要
    1. 文字エンコーディングの妥当性検証
    2. 文字エンコーディングの変換(必要な場合のみ)
    3. パラメータ文字列の妥当性検証(アプリケーションの仕様に基づいた検証)
クライアントブラウザ
  ↓ HTTPリクエスト
-----
|入力| ←ここ
|処理|
|出力|
-----
  ↓ HTTPレスポンス
クライアントブラウザ

文字エンコーディングの変換

言語 自動変換 スクリプト記述
PHP pjp.iniなど mb_convert_encoding
Perl - Encode::decode
Java setCharacterEncoding Stringクラス
ASP.NET web.config -

4. 表示処理の脆弱性

  • 表示処理が原因で発生する問題には次の2つがある
クライアントブラウザ
  ↓ HTTPリクエスト
-----
|入力|
|処理|
|出力|
-----
  ↓ HTTPレスポンス
クライアントブラウザ ←ここ

クロスサイト・スクリプティング

  • クロスサイトスクリプティングとは、ウェブページの部分をユーザからの入力をそのままエコーバック(おうむ返し)することによって生成しているアプリケーションのセキュリティ上の不備を利用して、サイト間を横断して悪意のあるスクリプトを注入する攻撃のこと
  • クロスサイト・スクリプティングではユーザーに対して次のような被害がある
    • 攻撃者のスクリプトでクッキー値を盗まれる
    • 攻撃者のスクリプトでWebアプリケーションの機能を悪用される
    • 偽の入力フォームでのフィッシングで個人情報が盗まれる

クロスサイト・スクリプティング対策

  • 必須対策(個別):HTMLの要素内容について[<]や[&]をエスケープする、属性値は「"」で囲い[<]や[&]をエスケープする
  • 必須対策(共通):HTTPレスポンスに文字エンコーディングを明示する
  • 保険的対策:入力値検証、クッキーにHttpOnly属性を付与、TRACEメソッドを無効

5. SQL脆弱性

  • SQL脆弱性にはSQLインジェクションがある
  • SQLインジェクションとは、SQLの呼び出しに不備がある場合発生する脆弱性SQLが開発者の意図しない形にに改変され実行されること
  • SQLインジェクション脆弱性がある場合、次のような影響を受ける可能性がある
    • データベース内の全ての情報が盗まれる
    • データベースの内容が書き換えられる
    • 承認を回避される(IDとパスワードを用いずにログインされる)
    • その他、データーバースサーバー上のファイルの読み書き、プログラム実行などが行われる
クライアントブラウザ
  ↓ HTTPリクエスト
-----
|入力|
|処理|
|出力| ←ここ
-----
  ↓ HTTPレスポンス
クライアントブラウザ

脆弱性が生まれる原因

文字列リテラル

  • SQLの標準では、文字列リテラルは「'」で囲む
  • 「'」を使いはみ出した部分で脆弱性が生まれる
# 文字列リテラルの例(BOOKSテーブルから著者がO'Reillyのデータを取得)
SELECT * FROM BOOKS WHERE AUTHOR = 'O'Reilly'
'O'が文字列リテラルで、Reilly'が文字れるリテラルからはみ出した部分
(「SELECT * FROM BOOKS WHERE AUTHOR = 'O';DELETE FROM BOOKS;」みたいな感じで悪用できる)

数値リテラル

  • 文字列リテラル同様、「;」で区切りそのあとに意図しない形のSQLを実行できる
# 数値リテラルの例
SELECT * FROM BOOKS WHERE MONEY <= 20000;DELETE FROM BOOKS
20000が数値リテラル、それ以降が脆弱性を含む意図しない形のSQL

対策

  • プレースホルダSQL分の「?」に値が代入されるやつ)でSQLを組み立てる
  • アプリケーション側でSQLを組み立てる際にリテラルを正しく構成するなどSQL文を変更されないようにする

6. まとめ

  • 入力値のインジェクション対策はかならず行う(「"」「'」「;」等を含んだ入力値でテストする)
  • HTMLの要素内容について[<]や[&]をエスケープする
  • HTTPレスポンスに文字エンコーディングを明示する
  • 入力値検証、クッキーにHttpOnly属性を付与、TRACEメソッドを無効
  • おすすめ書籍

セキュリティの事がひと通り書いてあり、サイトを作成する前に考慮すべき考え事がわかりやすく書いてあります。