SQLインジェクション・XSS・CSRFの仕組みを図解で説明 〜Webアプリへの代表的な攻撃〜

「SQLインジェクション」「XSS」「CSRF」の違いを説明できますか?

どれもWebアプリケーションへの代表的な攻撃で、名前を聞いたことがある人は多いと思います。

しかし、3つとも入力や通信を悪用する攻撃なので、違いがあいまいになりがちです。

3つの攻撃の仕組みと対策について、図を使って説明していきます。

3つの攻撃の全体像の図。XSSは利用者のブラウザ、CSRFはWebサーバ、SQLインジェクションはデータベースで実行される

3つの攻撃の違いは「どこで実行されるか」

3つの攻撃は、悪いことが実行される場所が違います。

  • SQLインジェクション: データベース で、攻撃者のSQLが実行される
  • XSS: 利用者のブラウザ で、攻撃者のスクリプトが実行される
  • CSRF: Webサーバ で、利用者が意図していない操作が実行される

この違いを押さえておくと、対策も整理しやすくなります。

SQLインジェクション

Webアプリケーションは、利用者が入力した値を使ってSQLを組み立て、データベースを操作します。

例えば、ログイン画面で入力されたIDとパスワードを、そのままSQLの文字列につなげていたとします。

攻撃者が、SQLとして意味を持つ記号を混ぜた値を入力すると、SQLの意味が変わってしまいます。

これが SQLインジェクション です。

SQLインジェクションの流れの図。攻撃者の入力をWebサーバがそのままSQLに連結し、データベースが意味の変わったSQLを実行する

① 攻撃者が、SQLの一部になる文字列を入力する

② Webサーバが、入力をそのままSQLにつなげる

③ データベースが、意味の変わったSQLを実行する

④ パスワードの確認が無効になったり、他人のデータを読まれたりする

対策: プレースホルダを使う

対策の基本は、プレースホルダ(バインド変数)を使ってSQLを組み立てる ことです。

SQLの形を先に決めておき、入力された値は「値」としてだけ当てはめます。

プレースホルダの図。そのまま連結すると条件が常に成り立つが、プレースホルダでは入力が値として扱われる

入力にどんな記号が含まれていても、SQLの命令として扱われることはありません。

XSS(クロスサイトスクリプティング)

掲示板の書き込みのように、利用者の入力をそのまま画面に表示するWebページがあります。

入力にスクリプトが含まれていると、そのページを開いた人のブラウザでスクリプトが実行されてしまいます。

これが XSS(クロスサイトスクリプティング) です。

XSSの流れの図。攻撃者が書き込んだスクリプトをWebサーバがそのまま表示し、利用者のブラウザで実行される

① 攻撃者が、スクリプトを含む文字列を書き込む

② Webサーバが、その文字列をそのままページに入れて返す

③ 利用者のブラウザで、スクリプトが実行される

④ Cookieを盗まれたり、偽の入力欄を表示されたりする

対策: 出力する時にエスケープする

対策の基本は、画面に出力する時にエスケープ処理をする ことです。

エスケープ処理は、「<」を「&lt;」に置き換えるように、HTMLで特別な意味を持つ文字を、ただの文字として表示される形に変えることです。

また、CookieにHttpOnly属性を付けると、スクリプトからCookieを読めなくなるので、XSSが起きた時にCookieを盗まれる被害を減らせます。

ただし、スクリプトの実行そのものは防げないので、補助的な対策です。

CSRF(クロスサイトリクエストフォージェリ)

Webサービスにログインすると、ブラウザはログイン中であることを示すCookieを保存します。

ブラウザは、そのサービスへリクエストを送る時に、このCookieを自動で付けます。

攻撃者はこの仕組みを悪用して、ログイン中の利用者に、意図していないリクエストを送らせます。

これが CSRF(クロスサイトリクエストフォージェリ) です。

CSRFの流れの図。ログイン中の利用者が罠のページを開くと、Cookie付きのリクエストが自動で送られ、本人の操作として処理される

① 利用者が、Webサービスにログインしたままにしている

② 利用者が、攻撃者の用意した罠のページを開く

③ 罠のページから、Webサービスへのリクエストが自動で送られる

④ Webサービスは、本人の操作だと思って処理してしまう

書き込みや設定の変更、購入などを、本人が知らないうちに実行されてしまいます。

対策: 本人の画面から送られたか確かめる

対策の基本は、正しい画面から送られたリクエストかを確かめる ことです。

画面を表示する時に、推測できないランダムな値(トークン)を埋め込んでおき、送られてきたリクエストに、その値と同じ値が含まれているかを確かめます。

罠のページはこの値を知らないので、偽のリクエストを見分けられます。

ほかに、重要な操作の前にパスワードを再入力してもらう方法や、CookieのSameSite属性で、別のサイトからのリクエストにCookieを付けないよう制限する方法(トークンを補う対策)もあります。

3つの攻撃のまとめ

3つの攻撃の比較表。実行される場所、主な被害、対策の基本を比べている

WAFのように、通信の中身を見て攻撃を止める仕組みもあります。

しかし、WAFは補助の対策で、Webアプリケーション自体を安全に作ることが基本 です。

まとめ

今回はSQLインジェクション、XSS、CSRFの仕組みについて説明しました。

SQLインジェクションはデータベースで、XSSは利用者のブラウザで、CSRFはWebサーバで、悪いことが実行されます。

どの攻撃も、入力や通信を信用しすぎることが原因です。

「入力はそのまま使わない」「出力する時はエスケープする」「本人の操作か確かめる」を覚えておきましょう。

Webシステムの仕組みについては、Webシステムを図解で解説の記事で説明しています。

WAFとファイアウォールの違いについては、ファイアウォールとDMZの仕組みを図解で説明の記事で説明しています。

データベースの中身が盗まれた時に備えて、パスワードを安全に保存する仕組みについては、パスワードのハッシュ化の仕組みを図解で説明の記事で説明しています。