公開日:2007年6月28日
独立行政法人情報処理推進機構
セキュリティセンター
本ページの情報は2007年6月時点のものです。
記載の資料は資料公開当時のもので、現在は公開されていないものも含みます。
SQL注入対策のうち、データベースシステム、アプリケーション実行環境、Webサーバソフトウェア等の設定の場面で行う設定における対策について述べる。
故意にデータベース(またはドライバ)エラーを起こすことで、HTMLページに出力されるエラーメッセージの内容から様々な情報を取得されるおそれがある。
例えば、次のような内容である。
このように、ユーザに不必要なエラーメッセージを表示することは、SQL注入攻撃の足がかりとなるのみでなく、エラーメッセージそのものにデータベーステーブルの内容の一部を表示させ、情報が盗み出されるおそれがある。
そのため、不必要なエラーメッセージがHTMLページに出力されないよう、処理系の設定およびアプリケーションプログラミングを行うべきである。
アプリケーション実行環境によって、エラーメッセージの出力をコードに記述して制御する場合と環境設定ファイルにより制御を行う場合がある。例えば、PHPは設定ファイルにエラーメッセージの出力に対して出力方法や出力レベル等の設定を記述することができる。
php.iniファイル内のディレクティブを設定する。
エラーをHTMLとして画面出力するかどうかを定義する
PHPの初期動作時点で起きるエラーをHTMLとして画面出力するかどうかを定義する。display_errorsをOffにするならこちらもOffにするべきである。
error_reporting=E_ALL:
すべてのエラーメッセージを出力する
致命的な実行時のエラーを出力する
回復可能な実行時のエラーを出力する
実行時の警告を出力する
コンパイル時の構文解析エラーを出力する
実行時の情報を出力する
コード互換性のための情報を出力する
PHPの初期動作時点で起きる致命的なエラーを出力する
PHPの初期動作時点で起きる警告を出力する
致命的なコンパイル時のエラーを出力する
コンパイル時の警告を出力する
ユーザを用意したエラーを出力する
ユーザが用意した警告を出力する
ユーザが用意した情報を出力する
エラーをログ出力するかしないかの設定
ログへのエラー出力量の最大値の設定
エラーログの出力先の設定
Webサーバにおけるエラーメッセージ出力に関する設定は、設定内容を変更する場合と設定ファイルにより出力方法や出力レベルを設定する場合がある。例えば、IISにおいては、標準のエラーメッセージ表示では詳細な情報が表示されてしまうのでカスタムのエラーページを用意することが可能である。また、Apacheにおいては設定ファイルにおいて出力方法や出力レベルを設定することが可能である。
ErrorLog logs/error.log
LogLevel warn
debug, info, notice, warn, error, crit, alert, emerg
ServerTokens Full
Full | OS | Minor | Minimal | Major | Prod
ServerSignature On
On | Off | EMail
独自エラーページの用意する。
RDEBMSにおいてもエラーメッセージの出力先や出力レベルを任意に設定することが可能である。
DBアクセスに対するエラーの標準出力は避け、ログファイルに出力するように設定を行ったり、ユーザの個人情報、クレジットカード情報などを扱う際にはエラー出力を行うこと自体を禁止するように設定を行う必要がある。例えばPostgreSQLでは以下のような設定が可能である。
以下のディレクティブをpostgresql.confに記述する。
SILENT_MODE (boolean) default : off
silent_modeは、標準出力・標準エラー出力にログメッセージを出力するかしないかを設定します。syslogへの出力をしていない場合、一切のログ確認ができなくなります。
SYSLOG (整数) default : 0
syslogは、ログ出力先を制御する。
データベース接続アカウントに対して、不必要な命令まで実行可能な権限を与えている場合は、不正利用の被害が深刻化するおそれがある。
そのため、データベース接続アカウントには、必要な命令のみ実行可能な最小限の権限を与えるべきである。可能ならば、異なる権限のアカウントを複数用意し、データ参照系画面(selectのみ)とデータ更新系画面(insert、updateのみ)で、アカウントを使い分けるべきである。
Microsoft SQL Server では、xp_cmdshellを使用してSQLからWindowsコマンドが実行可能であり、悪用されるとサーバ乗っ取りのおそれがある。
[ネットワークにバックドアを開く]
'; exec master..xp_cmdshell 'nc -l -p 666 -e cmd.exe'--
[悪意のVBScriptの送り込み]
'; exec master..xp_cmdshell 'echo 1行目 >> bad.vbs'--
'; exec master..xp_cmdshell 'echo 2行目 >> bad.vbs'--
'; exec master..xp_cmdshell 'echo 3行目 >> bad.vbs'--
:
'; exec master..xp_cmdshell 'bad.vbs'--
[サーバ内ファイルの削除]
'; exec master..xp_cmdshell 'del c:\*.* /F/Q/S'--
このため、xp_cmdshell をはじめとした悪用されると危険なストアドプロシージャは停止させるべきである。