メインコンテンツへスキップ

SQL インジェクションとは

この記事は約 2 分で読めます

SQL インジェクション (SQL Injection) とは、 Web アプリケーションの入力フォームなどに不正な SQL 文を挿入し、データベースを不正に操作する攻撃手法です。認証の回避、データの窃取・改ざん・削除、さらにはサーバーの制御権奪取にまで至る可能性がある、極めて危険な脆弱性です。 OWASP Top 10 でも長年上位にランクインしており、 2024 年もインジェクション攻撃は主要な脅威カテゴリとして位置づけられています。

入力を検査するだけでは閉じない理由

この脆弱性の原因は、入力された文字列の中に危険な記号が含まれていることではなく、外部から受け取った値が命令の一部として解釈される経路が残っていることにある。原因の所在をこう置くと、対処の方向も変わる。危険とされる記号を取り除く、あるいは特定の語を含む入力を拒否するという方式は、拾うべき対象の一覧を保守する作業になる。しかし一覧に載せる対象は、扱うデータベースの種類や記述の仕方によって変わり、同じ意味を別の書き方で表せる場合もある。一方で、記号を含む入力は業務上も普通に発生する。名前や住所、検索の語にも記号は現れるため、拒否の範囲を広げれば正当な入力が通らなくなり、狭めれば通り抜ける余地が残る。どちらの端にも寄せきれない調整が続き、境界をどこに置くかという判断は残り続ける。値を命令の一部として渡さず、値としてしか扱われない形で受け渡す仕組みに置き換えれば、この境界の判断そのものが不要になる。実務でもうひとつ問題になるのは、修正の単位である。ひとつの画面で確認された場合、同じ組み立て方が他の画面にも並んでいることが多い。ある機能のために書かれた書き方は、似た機能を作るときに参照されるためである。したがって、見つかった画面を直しても、同じ書き方が残る経路は同じ状態のままになる。数えるべきは指摘された画面の数ではなく、値を組み立てている書き方が何種類あり、それぞれが何か所で使われているかである。

SQL インジェクションのフロー

不正な SQL を入力
サーバーが SQL を実行
DB から不正にデータ取得
情報漏洩・改ざん

攻撃の仕組み

ユーザー入力をそのまま SQL 文に組み込むプログラムが攻撃対象となります。たとえば、ログインフォームに「' OR 1=1 --」と入力することで認証を回避したり、 UNION 句を使って他のテーブルのデータを取得したりできます。ブラインド SQL インジェクションでは、エラーメッセージが表示されなくても真偽値の違いからデータを推測できます。

具体的な被害シナリオ

よくある誤解は「 SQL インジェクションは古い攻撃手法で、現代のシステムでは起きない」というものです。実際には、レガシーシステムの改修や新規開発でもパラメータ化クエリを使わずに文字列結合で SQL を組み立てるコードはいまだに発見されています。 2024 年にも大手企業のデータベースから数百万件の顧客情報が SQL インジェクションで流出した事例が報告されています。攻撃者は自動化ツール (sqlmap など) を使って脆弱なサイトを効率的に探索するため、小規模なサイトでも標的になります。

ユーザーとしての備え

SQL インジェクションはサーバー側の脆弱性ですが、ユーザーとしても備えが必要です。サービスごとに固有のランダムパスワードを設定しておけば、 1 つのサービスでデータ漏洩が発生しても他のアカウントは安全です。利用するサービスがデータ漏洩を公表した場合は、速やかにパスワードを変更しましょう。

関連用語

この記事は役に立ちましたか?