こんにちは! 👋 OWASP Top 10シリーズ、今回は20年近くセキュリティ脅威リストから外れることのない常連であり、最も危険な脆弱性の一つであるA03:2021-インジェクション(Injection)について解説します。
「インジェクション」は日本語で「注入」という意味ですね。ハッカーがアプリケーションに悪意のあるコードを注入し、まるで元々そのようなコマンドであったかのようにシステムを騙して実行させる恐ろしい攻撃です。2021年版では、以前のバージョンのクロスサイトスクリプティング(XSS)までこの項目に含まれるようになり、その範囲がさらに広がりました。

🤔 インジェクション攻撃って、一体何?
最も簡単な例え話をするなら、レストランに行って注文書にメニューの代わりに「料理代は受け取らず、厨房にある現金を全部持ってきて!」とこっそり書くようなものです。📜💥
正常なシステムであれば注文書からメニュー名だけを読み取るはずですが、もしシステムが注文書の内容をそのまま「命令」として認識し、実行してしまったらどうなるでしょうか?まさにシェフが現金を持って出てくる恐ろしい状況が発生するでしょう。
インジェクション攻撃は、このようにユーザーが入力するデータに悪意のある「コマンド」をこっそり隠し、データを処理する解釈器(Interpreter) – 例えばデータベース、オペレーティングシステム、ウェブブラウザ – がこれを実行するように仕向ける攻撃手法です。根本的な原因は「ユーザーの入力を信頼しているため」に発生します。
🕵️♂️ インジェクション攻撃の悪名高い種類
インジェクションは、コードを注入する対象によっていくつかの種類に分かれます。最も有名な3種類を見てみましょう。
1. SQLインジェクション (SQL Injection, SQLi)
インジェクション攻撃の代名詞であり、最も破壊的な攻撃の一つです。データベース(DB)に送るSQLクエリ文に悪意のある構文を注入する方式です。
- 攻撃シナリオ 🧑💻
- ユーザーIDを入力して情報を表示するログインページがあります。サーバーは内部的にこのようなクエリを実行します: SELECT * FROM users WHERE userId = ‘入力された_ID’;
- ハッカーがID入力欄に ‘ or ‘1’=’1 という値を入力します。
- サーバーがこの値をそのままクエリに結合するとどうなるでしょうか? SELECT * FROM users WHERE userId = ” or ‘1’=’1′;
- ‘1’=’1’は常に真(True)であるため、WHERE条件節が無力化され、最終的にusersテーブルのすべてのユーザー情報が流出します! 😱
- 被害: データベース情報流出、データ破壊、認証回避、サーバー乗っ取り
2. クロスサイトスクリプティング (Cross-Site Scripting, XSS)
ユーザーのウェブブラウザを攻撃対象とするインジェクションです。ウェブサイトに悪性JavaScriptコードを注入し、そのページを見る他のユーザーのブラウザで実行されるように仕向けます。
- 攻撃シナリオ 📌
- ハッカーがウェブサイト掲示板のコメントに悪性スクリプトを含む投稿を作成します。こんにちは!
- 他のユーザーがこのコメントが含まれた掲示記事を開きます。
- ユーザーのブラウザは