PHP スクリプトに対する攻撃方法とその対策

参考:PHP サイバーテロの技法 攻撃と防御の実際 GIJOE著

Script Insertion

入力結果を反映した表示を行う場合、<script> タグが入力される可能性がある。この場合、任意のスクリプトが実行される危険性が生じる。入出力の際に危険な部位を無力化する必要がある。

対策

  • 入出力の際に SGML データは、htmlspecialchars($value,ENT_QUOTES) を利用する

XSS(Cross Site Scriptiong)

入力をそのまま表示するプログラムの場合、外部リクエストによる情報にスクリプト情報が含まれているとそのリクエスト経由で攻撃を受ける可能性がある。

対策

  • 入出力の際に SGML データは、htmlspecialchars($value,ENT_QUOTES) を利用する
  • 同ページへのリクエストの場合は action=”” として空を指定する
    • GET リクエストを同時に行う場合は action=”?key=value” としてクエリ部分のみを記述する

SQL Injection

SQL クエリに利用する入力データをそのまま利用していると、予期しない SQL クエリが作られる危険性が生じる。

対策

  • 整数値である事が絶対である場合、intval() や doubleval() を利用する
  • 文字列である場合は、addslashes() を利用する
    • Shift_JIS の場合、addshashes() は問題が起きる可能性がある
    • 可能な限り、mysql_escape_string() を使うべき(DBMS ごとに用意されたエスケープ関数)

CSRF(Cross Site Request Forgeries)

外部サイトから正しい HTTP リクエストがあった場合、アプリケーションとして予期しない実行であってもそれはただしく処理される。

対策

一連の流れが存在する場合、その一貫性をアプリケーション側で証明/検査する仕組みを実装する事で対応する。一例として、流れ上正しいとされるリファラからのリクエストのみを受け付ける方法があげられるが、偽装可能な情報なために確実ではない。

ヌルバイト攻撃

リクエスト文字列にヌルバイト(%00)を含め、セキュリティチェックをくぐり抜ける攻撃方法。一部処理において、文字列はヌルバイト以降は解釈されない場合がある。

対策

  • 処理の先頭でヌルバイト以降を切り捨てる

Directory Traversal (ディレクトリ遡り攻撃)

相対パス指定を許可する場合、予期しない(システムが管理しない)ディレクトリへのアクセスを許可する危険性がある。

対策

  • 許可するパターンを限定するホワイトリスト法
  • basename() を利用したサニタイズ
  • 許可しないパターンを設定するブラックリスト法
  • open_basedir によって利用する可能性のあるディレクトリを限定

注意事項

  • “../” を削除しての対応の場合、”....//” は “../” になる事に注意する
  • “..” の存在を確認する際に、利用する関数の戻り値を確認する(Boolean か Integer か)

変数汚染攻撃

PHP では一部の内部環境変数を HTTP リクエストから設定できる場合がある。

対策

  • 許可するパターンを限定するホワイトリスト法
  • 許可しないパターンを設定するブラックリスト法
  • “register_globals on” に依存した記述をしない
  • register_globals を off にする

HTTP レスポンス分割攻撃

リクエスト内に改行コードを含める事で、任意の HTTP レスポンスを指定する事が出来る。

リクエスト http://***?PHPSESSID=a%0d%0a(任意の HTTP レスポンスヘッダ)

レスポンスヘッダ Set-Cookie: PHPSESSID=a (任意の HTTP レスポンスヘッダ); path=/

対策

  • header() の引数(HTTP リクエストの URL)から改行コードを除去する
  • session.use_only_cookies を on にする

インクルード攻撃

サイト内外の想定外のファイルを読み込ませる(実行させる)攻撃。

対策

  • allow_url_fopen を off にして、URL 指定のファイルを読み込ませない
  • ファイル名に basename() をかける(ブラックリスト法)
    • 階層構造を持ったパス指定が出来なくなる事に注意
  • 開けるファイルを指定しておくホワイトリスト法

eval 利用攻撃

eval() やその応用関数に悪意あるリクエストを潜り込ませて、任意の PHP コードを実行する攻撃。

対策

  • ホワイトリスト法
  • preg_replace() の e 修飾子ではなく、preg_replace_callback() を使う
  • コールバック関数ホワイトリスト法

外部コマンド実行攻撃

プログラム実行系処理の引数にリクエストを混ぜて、任意のコマンドを実行する攻撃。

対策

  • escapeshellarg() を利用したシェルエスケープ法
  • ホワイトリスト法
  • php.ini で safe_mode 制限を書ける

ファイルアップロード攻撃

ファイルアップロード時の付加情報を偽装し、不正なファイルをアップロードする攻撃。

対策

  • ファイル保存場所を非公開にする
  • 拡張子ホワイトリスト法

セッションハイジャック

既知のセッション鍵を強制的に使わせたり、既存の既知鍵を盗む事で、他人のセッションを乗っ取る攻撃

対策

  • session 関連の設定変更
    • session.use_trans_sid = 0
    • session.use_cookies = 1
    • session.use_only_cookie = 1
    • session.auto_start = 0
  • IP アドレスチェック
  • セッション鍵の定期的な変更

スパムメール踏み台攻撃

メールヘッダ生成部に改行やカンマを含める事で任意の宛先にメールを送る攻撃。

対策

  • 引数の宛先部分を固定化するか、ホワイトリスト法を利用する
  • 同一 IP アドレスからの利用回数制限
  • データ整合性チェック
 
koshigoewiki/php/security/attack.txt · 最終更新: 2006/02/26 02:53 by koshigoebushou
 
Creative Commons License Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki