概要
ウェブアプリケーションのセキュリティの基礎や入門的な部分をざっくり書き出しました。
ログイン機能を使う場合やインフラよりのセキュリティは書いていません。
1. 脆弱性の原因と攻撃パターン
脆弱性が生まれる理由
- バグによるもの
- チェック機能不足によるもの
- ディレクトリ・トラバーサル等
能動的攻撃と受動的攻撃
- 能動的攻撃:攻撃者が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つの検証・変換が必要
クライアントブラウザ ↓ HTTPリクエスト ----- |入力| ←ここ |処理| |出力| ----- ↓ HTTPレスポンス クライアントブラウザ
文字エンコーディングの変換
言語 | 自動変換 | スクリプト記述 |
---|---|---|
PHP | pjp.iniなど | mb_convert_encoding |
Perl | - | Encode::decode |
Java | setCharacterEncoding | Stringクラス |
ASP.NET | web.config | - |
4. 表示処理の脆弱性
- 表示処理が原因で発生する問題には次の2つがある
- クロスサイト・スクリプティング
- エラーメッセージからの情報漏洩
クライアントブラウザ ↓ HTTPリクエスト ----- |入力| |処理| |出力| ----- ↓ HTTPレスポンス クライアントブラウザ ←ここ
クロスサイト・スクリプティング
- クロスサイトスクリプティングとは、ウェブページの部分をユーザからの入力をそのままエコーバック(おうむ返し)することによって生成しているアプリケーションのセキュリティ上の不備を利用して、サイト間を横断して悪意のあるスクリプトを注入する攻撃のこと
- クロスサイト・スクリプティングではユーザーに対して次のような被害がある
クロスサイト・スクリプティング対策
- 必須対策(個別):HTMLの要素内容について[<]や[&]をエスケープする、属性値は「"」で囲い[<]や[&]をエスケープする
- 必須対策(共通):HTTPレスポンスに文字エンコーディングを明示する
- 保険的対策:入力値検証、クッキーにHttpOnly属性を付与、TRACEメソッドを無効
5. SQLの脆弱性
- SQLの脆弱性にはSQLインジェクションがある
- SQLインジェクションとは、SQLの呼び出しに不備がある場合発生する脆弱性でSQLが開発者の意図しない形にに改変され実行されること
- SQLインジェクションに脆弱性がある場合、次のような影響を受ける可能性がある
- データベース内の全ての情報が盗まれる
- データベースの内容が書き換えられる
- 承認を回避される(IDとパスワードを用いずにログインされる)
- その他、データーバースサーバー上のファイルの読み書き、プログラム実行などが行われる
クライアントブラウザ ↓ HTTPリクエスト ----- |入力| |処理| |出力| ←ここ ----- ↓ HTTPレスポンス クライアントブラウザ
脆弱性が生まれる原因
文字列リテラル
# 文字列リテラルの例(BOOKSテーブルから著者がO'Reillyのデータを取得) SELECT * FROM BOOKS WHERE AUTHOR = 'O'Reilly' 'O'が文字列リテラルで、Reilly'が文字れるリテラルからはみ出した部分 (「SELECT * FROM BOOKS WHERE AUTHOR = 'O';DELETE FROM BOOKS;」みたいな感じで悪用できる)
数値リテラル
# 数値リテラルの例 SELECT * FROM BOOKS WHERE MONEY <= 20000;DELETE FROM BOOKS 20000が数値リテラル、それ以降が脆弱性を含む意図しない形のSQL
対策
6. まとめ
- 入力値のインジェクション対策はかならず行う(「"」「'」「;」等を含んだ入力値でテストする)
- HTMLの要素内容について[<]や[&]をエスケープする
- HTTPレスポンスに文字エンコーディングを明示する
- 入力値検証、クッキーにHttpOnly属性を付与、TRACEメソッドを無効
- おすすめ書籍
セキュリティの事がひと通り書いてあり、サイトを作成する前に考慮すべき考え事がわかりやすく書いてあります。