Skip to content

Instantly share code, notes, and snippets.

@kenjiskywalker
Created February 7, 2012 21:24
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kenjiskywalker/1762073 to your computer and use it in GitHub Desktop.
Save kenjiskywalker/1762073 to your computer and use it in GitHub Desktop.
徳丸本まとめ

インジェクション系脆弱性のまとめ

インジェクションとは・・
"「インジェクション」(injection)とは「注入」という意味"
by e-Words

対策方法

  • 入力された文字エンコーディングの検証
  • 期待していない効果のある文字列が含まれていないかの検証
  • 文字数の検証

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

情報入力時に意図しないデータの混入や操作を行われないようにしよう

対策方法

  • ダブルクォーテーション、シングルクォーテーションに誤りがないか確認
  • エスケープが必要なものはすべてエスケープ
  • 入力値の妥当性の検証
  • 文字エンコーディングを指定する
  • cookieをJavaScriptなどで読ませないようにHttpOnlyで制限

SQLインジェクション

UNIONなどをインジェクトされて意図しないSQLを実行されないようにしよう

対策方法

  • プレースホルダを利用する

プレースホルダ -> 代替物
プリペアド -> 準備された
ステートメント -> 宣言

プレースホルダは静的と、ライブラリを利用した動的プレースホルダが存在するが
理由がない限りは静的プレースホルダを利用するべき

  • SQL文と入力する値を切り離してSQL文中にゴミを混ぜさせないようにする

保険的対策

  • エラーメッセージの抑止
  • 入力値の妥当性の検証
  • データベースの接続ユーザの権限設定
  • 文字コード指定(MySQLの場合はmy.cnfを指定)

クロスサイトリクエストフォージェリ

session_idはサーバサイドへ保存される。
そのため、対象のサービスで入力される値を把握していれば
別のサーバに意図しない情報を与えて、対象のサービスへ
保存されたsession_idを利用してPOSTすることが可能なのかな。
もうちょい勉強が必要(iframe)

対策方法

  • tokenの埋め込み
  • パスワードの再入力(ログインとは別にもう一度入力させる)
  • Refererのチェック(外部サイトからPOSTされていないか)

保険的対策

  • POSTされたことを登録されているメールアドレスに通知
  • CAPTCHAの導入

セッションハイジャック

接続されたセッションを途中で代わりに乗っ取っちゃう

対策方法

  • セッションの生成は独自で作成しない(推測されやすい場合が多い為)
  • cookieにセッションIDを保存する
  • 認証された後はセッションIDを新しく割り振る
  • 認証されるまではセッション変数に重要な情報を入れさせない

オープンリダイレクタ

?continue=URLで別のサーバに移動させられる
その後似せたサイトに罠をはって色々させちゃう

対策方法

  • リダイレクト先のURLを固定化
  • リダイレクト先をURLではなく、番号などにして推測されにくくする
  • リダイレクト先のドメインをチェックする

保険的対策

  • クッションページ置く

HTTPヘッダインジェクション

Locationやcookieなど、改行をはさんで情報をサーバに送ることで
情報を偽装することができる

対策方法

  • 改行のエスケープ、または検査

ディレクトリ・トラバーサル


なんてファイルを置いて

?file=/etc/passwdなんて引数与えちゃえば
サーバのファイル見れちゃう

対策方法

  • ファイル名を直接指定しないようにする
  • ファイル名にディレクトリ名が含まれないようにする
  • ファイル名を英数字限定にする(記号を無効にする)
  • 意図しないファイルを公開ディレクトリに置かない
  • -Indexesの付与

OSコマンドインジェクション

外部からOSのコマンド使えてしまう

対策方法

  • シェル呼び出し機能のある関数を使わない
  • 外部コマンド使うときは入力値を変数とかにして分ける
  • コマンドに渡すパラメータを関数使ってエスケープさせる
  • アプリケーションの実行権限を最小限にしておく。Apacheやnginxのオーナー制限
  • 入力値を検証するコードを追記する

ファイルアップロード

アップロードしたファイルに罠を仕掛けて悪いことする
ファイルダウンロードクロスサイトスクリプティングは感動した

対策方法

  • アップロードされる拡張子を制限する
  • アップロードされたファイルが正しい拡張子か確認する関数をかませる
  • Content-Typeをちゃんと設定する
  • 画像の場合は拡張子と画像の中身(マジックバイト)が対応していることを確認する
  • Content-Disposition: attachmentを付与して強制的にダウンロードさせる(サーバで実行させない)
  • アップロード先を外部サービスに向ける(CDNなど)

cookie

  • secure属性(SSL通信時のみcookieを許可)の付与
    問題:SSLをまたいだ時にcookieが発行できない

  • 認証にはcookieだけじゃなくてtokenも併用しよう

  • 認証と認可について同一視しないようなつくりにする

  • HttpOnly属性の付与
    JavaScriptなどからcookieを読ませないように制限する

  • expiresとか気を付けないと長い時間cookie保持させちゃうのも危ない
    自動ログインとかで使われてる

session_id

  • 指定がなければ /tmp/ にファイルとして置かれる
    共用サーバだと一元管理が危ないかも

JavaScript

  • Same Origin Policy

関連項目

  • iframe
  • X-FRAME-OPTIONS
  • nginx
    add_header X-Frame-Options

  • Apache

    Header set X-Frame-Options "DENY"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment