概要

SQLインジェクション(SQL Injection)とは、Webアプリの入力欄などに不正なSQL文(データベースへの命令)を注入(インジェクション)し、データベースを不正に操作する攻撃です。Webアプリの脆弱性を突く攻撃の代表格で、大規模な情報漏えいの原因となってきました。

利用者が入力したデータをそのままSQL文に組み込んでいると、攻撃者が入力欄に細工した文字列を入れることで、本来読めないデータの抜き取り・改ざん・削除・認証回避が可能になってしまいます。

詳細(仕組み)

例えばログイン認証で、入力値をそのまま使う次のようなSQLがあるとします。

SELECT * FROM users WHERE id='入力値' AND pw='入力値'

ここでパスワード欄に ' OR '1'='1 のような文字列を入れられると、条件が常に真となりパスワードなしでログインできてしまう、といった具合です。攻撃により次のような被害が起きます。

SQLインジェクションのキーワードは「不正なSQLを注入」「データベースの不正操作」。根本対策はプレースホルダ(バインド機構)である点が超頻出です。

対策

試験では「最も有効な対策はどれか」でプレースホルダ(バインド機構)が正解になりがちです。WAFは有効な「緩和策」ですが、根本対策はアプリ側でSQLを安全に組み立てることだと理解しましょう。

インシデント事例

ECサイトからのクレジットカード情報流出

SQLインジェクションの脆弱性を突かれ、ECサイトの会員情報やクレジットカード情報が大量に流出する事例が繰り返し発生しています。決済代行への切り替えやWAF導入などの再発防止策が求められました。

会員制サイトの個人情報漏えい

入力値をそのままSQLに組み込んでいたために、攻撃者がデータベースの中身を抜き取り、数百万件規模の個人情報が漏えいした事例もあります。プレースホルダ未使用が共通の原因でした。

試験での問われ方