WEB脆弱性のインジェクションとは?
インジェクション(injection)の意味は、内部に何かを注入することです。
そして、WEB脆弱性のインジェクションには、以下の3つがあります。
- SQLインジェクション
- OSコマンドインジェクション
- HTTPヘッダインジェクション
つまり、SQL、OSコマンド、HTTPヘッダの各々に、Webページから悪意のコマンドをインジェクションされることなのです。
◆SQLインジェクション
たとえば、$uidと$passhをWebページから入力(POST)される以下のSQLがあったとします。
$query = "SELECT * FROM usr WHERE uid = '$uid' AND pass = '$passh'";
$uidに「taro'--」と入力されたら、以下のように展開されます。
$query = "SELECT * FROM usr WHERE uid = 'taro'--' AND pass = ''";
すると、SQLで「--」はコメントになりますので、パスワードがなくても以下のSQLが発行されてしまうのです。
$query = "SELECT * FROM usr WHERE uid = 'taro'";
これ、Delete文もインジェクションされるケースもあり、私は実際にテストで体験しております。DBがクリアされました!
◆OSコマンド・インジェクション
たとえば、$fromをWebページから入力(POST)される以下のopen文があったとします。
$from =~ s/"|;|'|<|>|\|| //ig; open(MAIL, "|/usr/sbin/sendmail -t -i -f $from");
$from に「`touch[0x09]/tmp/foo`」と入力されたら、以下のように展開されます。
$from =~ s/"|;|'|<|>|\|| //ig; open(MAIL, "|/usr/sbin/sendmail -t -i -f `touch[0x09]/tmp/foo`);
すると、touchコマンドが実行されてしまいます。
◆HTTPヘッダ・インジェクション
たとえば、$numをWebページから入力(POST)される以下のHTTPのLocationがあったとします。
$cgi = new CGI; $num = $cgi->param('num'); print "Location: http://example.jp/index.cgi?num=$num\n\n";
$num に「3%0D%0ASet-Cookie:SID=evil」と入力されたら、以下のようなクッキーが発行されてしまうのです。
Set-Cookie: SID=evil
◆インジェクション対策
ということで、WEBアプリケーションは、上記3つの対策を打たないといけないわけです。
対策は、以下を参照してください。
尚、本記事のサンプルは、上記URLを大変参考にさせて頂きました。問題があればコメント欄でご指摘ください。
あと、他にも以下の対策も必要ですね。
- ディレクトリ・トラバーサル
- セッション管理の不備
- クロスサイト・スクリプティング
- クロスサイト・リクエスト・フォージェリ