インジェクションとは・・
"「インジェクション」(injection)とは「注入」という意味"
by e-Words
- 入力された文字エンコーディングの検証
- 期待していない効果のある文字列が含まれていないかの検証
- 文字数の検証
情報入力時に意図しないデータの混入や操作を行われないようにしよう
- ダブルクォーテーション、シングルクォーテーションに誤りがないか確認
- エスケープが必要なものはすべてエスケープ
- 入力値の妥当性の検証
- 文字エンコーディングを指定する
- cookieをJavaScriptなどで読ませないようにHttpOnlyで制限
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ではなく、番号などにして推測されにくくする
- リダイレクト先のドメインをチェックする
- クッションページ置く
Locationやcookieなど、改行をはさんで情報をサーバに送ることで
情報を偽装することができる
- 改行のエスケープ、または検査
なんてファイルを置いて
?file=/etc/passwdなんて引数与えちゃえば
サーバのファイル見れちゃう
- ファイル名を直接指定しないようにする
- ファイル名にディレクトリ名が含まれないようにする
- ファイル名を英数字限定にする(記号を無効にする)
- 意図しないファイルを公開ディレクトリに置かない
- -Indexesの付与
外部からOSのコマンド使えてしまう
- シェル呼び出し機能のある関数を使わない
- 外部コマンド使うときは入力値を変数とかにして分ける
- コマンドに渡すパラメータを関数使ってエスケープさせる
- アプリケーションの実行権限を最小限にしておく。Apacheやnginxのオーナー制限
- 入力値を検証するコードを追記する
アップロードしたファイルに罠を仕掛けて悪いことする
ファイルダウンロードクロスサイトスクリプティングは感動した
- アップロードされる拡張子を制限する
- アップロードされたファイルが正しい拡張子か確認する関数をかませる
- Content-Typeをちゃんと設定する
- 画像の場合は拡張子と画像の中身(マジックバイト)が対応していることを確認する
- Content-Disposition: attachmentを付与して強制的にダウンロードさせる(サーバで実行させない)
- アップロード先を外部サービスに向ける(CDNなど)
-
secure属性(SSL通信時のみcookieを許可)の付与
問題:SSLをまたいだ時にcookieが発行できない
-
認証にはcookieだけじゃなくてtokenも併用しよう
-
認証と認可について同一視しないようなつくりにする
-
HttpOnly属性の付与
JavaScriptなどからcookieを読ませないように制限する
-
expiresとか気を付けないと長い時間cookie保持させちゃうのも危ない
自動ログインとかで使われてる
- 指定がなければ /tmp/ にファイルとして置かれる
共用サーバだと一元管理が危ないかも
- Same Origin Policy
関連項目
- iframe
- X-FRAME-OPTIONS
-
nginx
add_header X-Frame-Options
-
Apache
Header set X-Frame-Options "DENY"