ユーザー入力を使って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の例を示しているので参照していただきたい。
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.