SQLインジェクション・XSS・CSRFは「Web三大攻撃」とも呼ばれる試験頻出テーマです。攻撃の仕組みと対策をセットで、身近なたとえで整理していきましょう。
Webサイトがハッキングされたってニュース、よく見るじゃん。
あれって具体的にどうやって攻撃してんの? なんかイメージわかないんだよね。
いい疑問ね。
実はWebアプリへの攻撃は、まず3つ押さえれば大半をカバーできるのよ。
SQLインジェクション・XSS・CSRF。
試験では「Web三大攻撃」のつもりで覚えておくといいわ。
えすきゅーえる…? いきなり呪文みたいですぅ。
大丈夫です。
一つずつ見れば怖くないですよ。
まずはSQLインジェクションから。
SQLというのはデータベースに命令を出す言葉のことです。
たとえばログイン画面で、ユーザー名の欄に ' OR '1'='1 という文字を入れると、命令が「パスワードが何であっても必ず正しい」という意味に書き換わってしまうことがあるんです。
マジか。
鍵かかってるのに『常に開いてる扉』に変えられちゃう感じじゃん。
ふふ、まさにそう。
だから対策は『入力欄に書かれた文字を、命令の一部として混ぜない』こと。
それを実現するのが基本対策ね。
具体的にはプレースホルダを使います。
SQL文の枠と入力値をきっちり分けるので、何を入れても命令には化けません。
枠と中身を分ける…お弁当箱の仕切りみたいなものですかぁ?
うまいたとえね、ほのかちゃん。
ご飯とおかずが混ざらない、あの仕切りよ。
補助的に怪しい文字を弾く入力値チェックもあるけれど、本命はプレースホルダ。
ここは試験でよく狙われるわ。
次がXSSです。
掲示板などに <script>…</script> という命令を書き込み、それを見た人のブラウザで勝手に動かす攻撃ですね。
ん? さっきのSQLと何が違うの? どっちも変な文字入れてるじゃん。
いい着眼点です。
対比するとわかりやすいですよ。
SQLインジェクションは狙う先がデータベース。
XSSは狙う先が他の利用者のブラウザ。
サーバ側かユーザー側か、で覚えると混同しません。
ふぇぇ…見ただけのわたしが被害者になっちゃうんですねぇ。
それで何をされちゃうんですかぁ?
被害者のセッション情報を盗まれて、本人になりすまされたり、偽サイトに誘導されたりするの。
対策はページに文字を出すときのエスケープ処理。
あわせてHttpOnly属性を付けると、盗まれにくくなるわ。
3つ目がCSRF、読み方は『シーサーフ』です。
たとえば、あなたが銀行サイトにログインしたまま別の罠サイトを開いたとするでしょう。
その瞬間、罠が裏で『送金しろ』というリクエストを銀行へ送る。
ブラウザはログイン中だから本人の操作だと信じて実行してしまうの。
うわ、自分は何も押してないのに勝手に送金…こわすぎじゃん。
どう防ぐの?
対策はCSRFトークン。
正規の操作にだけ毎回ちがう合言葉を付けておけば、合言葉を知らない罠サイトのリクエストは弾けるのよ。
補足すると、XSSとCSRFは名前が似ていて紛らわしいです。
XSSは『スクリプトを実行させる』攻撃、CSRFは『なりすまして操作を送らせる』攻撃。
対策もXSSはエスケープ、CSRFはトークン、と対で覚えると安全です。
三大攻撃、なんとか追いつけましたぁ。
他にも覚えることってあるんですかぁ?
はい。
ディレクトリトラバーサルやOSコマンドインジェクション、クリックジャッキングも試験範囲です。
全部を個別に防ぐのは大変だから、入口にWAFを置いて怪しい通信をまとめて止める手もあるわ。
世界標準の脆弱性まとめOWASP Top 10も名前だけ知っておくと安心よ。
なるほどね。
攻撃の名前と対策をペアで覚えるのがコツってことか。
だいぶスッキリしたじゃん!
ふふ、その通り。
最後に整理すると、SQLi=DB×プレースホルダ、XSS=ブラウザ×エスケープ、CSRF=なりすまし×トークン。
この『攻撃と対策のペア』が頭に入れば、もう試験は怖くないわよ。
確認クイズ
ログイン中の利用者になりすまし、本人が意図しない操作(送金など)のリクエストを送信させる攻撃はどれか。
- XSS
- SQLインジェクション
- CSRF
- ディレクトリトラバーサル
こたえを見る
正解: 3. CSRF
正解はCSRF(クロスサイトリクエストフォージェリ)です。ログイン状態を悪用して意図しない操作を送らせる攻撃で、対策は使い捨ての合言葉であるCSRFトークンです。XSSはブラウザでスクリプトを実行させる攻撃、SQLインジェクションはDBを不正操作する攻撃、ディレクトリトラバーサルは公開範囲外のファイルを読み出す攻撃で、いずれも本問の説明とは異なります。