Webアプリケーションの脆弱性を総括するWebアプリケーションに潜むセキュリティホール(14)(2/5 ページ)

» 2005年03月04日 00時00分 公開
[中村隆之三井物産セキュアディレクション]

SQLインジェクション

 ユーザー入力を使ってSQL文を発行しているアプリケーションに対して、不正な入力を与えることにより別の意味となるSQL文を発行させる攻撃のことである。ユーザー入力をそのままSQL文に使用してしまうことが主な原因である。

 認証にデータベースを使用している場合、認証をバイパスされてしまうことがある。また、データベース内の任意のデータの参照やデータ改ざん、破壊といった攻撃を受ける場合もある。アプリケーションレベルの直接攻撃であるため危険度は非常に高い。

脆弱性が存在する可能性がある個所

 当然SQL文を発行している個所が対象となる。SQL文を発行するであろう主な機能を以下に挙げる。開発時にSQL文を呼び出しているアプリケーションをすべてリストアップしておくと脆弱性検査が楽になる。

  • ログイン
  • 検索
  • 個人情報表示
  • 何らかの処理のコミット(登録、買い物など)

対策

  • 入力チェック
  • サニタイジング
  • バインドメカニズム

 まずは入力チェックを行い、想定内の入力であるかどうかチェックしよう。その後、サニタイジングを行ってからSQL文を生成する。また、バインドメカニズムという仕組みを使えば、本来の意味とは異なるSQL文を発行できなくなるため非常に有効である。

言語別の対策例

 以下に、SQLインジェクションに対するサニタイジングを行うコードを言語別に紹介しておく。

perl

$text =~ s/’/’’/g;
$text =~ s/\\/\\\\/g;

PHP

pg_escape_string() ・・・(PostgreSQLの場合)
mysql_escape_string() ・・・(MySQLの場合)

ASP

safe_text = Replace(str, "'", "''")
safe_text = Replace(safe_text, "\", "\\")

 バインドメカニズムを使う例については、第2回「顧客データがすべて盗まれる?!」でASPの例を示しているので参照していただきたい。

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

 Webサーバプログラム(apacheやIIS)が稼働しているOS上で任意のOSコマンドを実行させる攻撃のことである。このとき、OSコマンドは通常はWebサーバの実行ユーザーと同じ権限で実行される。

 もしWebサーバ上のコンテンツがこのユーザーで書き換え可能である場合、簡単にページ改ざんを行える。また、任意のOSコマンドが実行できるため、スパムの踏み台やほかのサーバへ侵入するための踏み台として利用されることもある。

脆弱性が存在する可能性がある個所

 OSコマンドを呼び出している個所だけでなく、perlで開発している場合はファイルを開くopen()関数が使われている個所にも存在する可能性がある。詳細は、前回「OSコマンドインジェクションを防ぐルールを作成する」を参照していただきたい。また、問い合わせアプリケーションではsendmailコマンドを呼び出している場合が多いので特に注意が必要である。

対策

  • 入力チェック
  • サニタイジング

 まず、受け付ける文字列が想定されたものかどうかチェックしよう。perlのopen()関数の場合は、これだけでほぼ防ぐことができるだろう。

 次に、入力文字列をシェルに渡すような作りの場合、シェル上の特殊文字を取り除く必要がある。シェル上の特殊文字は第2回「顧客データがすべて盗まれる?!」で説明しているので参照していただきたい。

言語別の対策例

perl

 OSコマンドに渡す引数全体を「'(シングルクオーテーション)」でくくり、シングルクオーテーションをサニタイジングすれば特殊文字は全く機能しなくなる。

$text =~ s/’/\\’/g;
system("echo ‘$text'");

PHP

$safe_text = escapeshellarg($text);
system($safe_text);

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。