SQL インジェクションのチュートリアル: 例で学ぶ

⚡ スマートサマリー

SQLインジェクションとは、認証を回避したりデータを漏洩させたりするために、動的なSQL文を改ざんする攻撃です。この攻撃は、サニタイズされていないユーザー入力からクエリを生成するWebアプリケーションを悪用します。このページでは、この攻撃の仕組みと防止策について説明します。

  • 💉 定義: SQLインジェクションとは、検証されていない入力フィールドを介して、悪意のあるSQLをクエリに挿入する攻撃です。
  • 🔓 影響: 攻撃が成功すると、ログインを回避して記録を読み取り、変更、または削除することが可能になる。
  • 🧪 例: 常に真となる条件とコメントを組み合わせることで、ログインチェックをバイパスに変えることができます。
  • 🛠️ ツール: SQLMapとjSQLは、注入可能なパラメータの検出と悪用を自動化します。
  • 🛡️ 防止: パラメータ化されたクエリ、入力検証、および最小権限アカウントによって、そのギャップは解消されます。
  • 🤖 現代的なエッジ: AIを活用したスキャナーとファイアウォールは、固定シグネチャでは見逃されるインジェクションパターンを検出します。

SQLインジェクションチュートリアル

SQLインジェクションとは何ですか?

SQLインジェクションとは、動的SQL文を改ざんして、文の一部をコメントアウトしたり、常に真となる条件を追加したりする攻撃です。設計の不備のあるWebアプリケーションの欠陥を悪用し、SQL文を悪用して悪意のあるSQLコードを実行します。

データは情報システムの最も重要な構成要素の1つです。データベースを利用したWebアプリケーションは、組織が顧客からデータを取得するために使用されます。SQLは、 構造化照会言語これは、データベース内のデータを取得および操作するために使用されます。

SQLインジェクションが動的なデータベースクエリを操作する仕組みの図

SQLインジェクション攻撃はどのように機能するのか?

SQLインジェクション攻撃で実行できる攻撃の種類は、データベースエンジンの種類によって異なります。この攻撃は、動的SQL文に対して有効です。動的SQL文とは、WebフォームやURIクエリ文字列から渡されたパラメータを使用して実行時に生成される文のことです。

SQLインジェクションの例

ログインフォームを備えたシンプルなWebアプリケーションを考えてみましょう。HTMLフォームのコードは以下のとおりです。

<form action=‘index.php’ method="post">

<input type="email" name="email" required="required"/>

<input type="password" name="password"/>

<input type="checkbox" name="remember_me" value="Remember me"/>

<input type="submit" value="Submit"/>

</form>

ここに、

  • 上記のフォームはメールアドレスとパスワードを受け取り、それらを送信します。 PHP Index.phpという名前のファイル。
  • ログインセッションをクッキーに保存するオプションがあります。これは、remember_me チェックボックスから推測できます。データの送信には POST メソッドを使用します。つまり、値は表示されません。 URL.

ユーザーIDを確認するためのバックエンドでのステートメントが以下のようになっていると仮定しましょう。

SELECT * FROM users WHERE email = $_POST['email'] AND password = md5($_POST['password']);

ここに、

  • 上記のステートメントは、$_POST[]配列の値をサニタイズせずに直接使用しています。
  • パスワードはMD5アルゴリズムを使用してハッシュ化されます。

SQLインジェクション攻撃を例に説明します。 SQL Fiddle。 オープン URL http://sqlfiddle.com/ Web ブラウザで次のウィンドウが表示されます。

注:SQL文はご自身で記述する必要があります。

空の SQL Fiddle スキーマとクエリの準備ができたウィンドウ

ステップ1) 左側のペインにこのコードを入力してください。

CREATE TABLE `users` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `email` VARCHAR(45) NULL,
  `password` VARCHAR(45) NULL,
  PRIMARY KEY (`id`));
  
  
insert into users (email,password) values ('m@m.com',md5('abc'));

ステップ2) 「スキーマの構築」をクリックします。

ステップ3) 右側のペインにこのコードを入力してください。

select * from users;

ステップ4) 「SQLを実行」をクリックしてください。以下の結果が表示されます。

SQL Fiddle 単一ユーザーレコードが返された結果

ユーザーがユーザー名にadmin@admin.sys、パスワードに1234を入力したとします。データベースに対して実行されるステートメントは次のようになります。

SELECT * FROM users WHERE email = 'admin@admin.sys' AND password = md5('1234');

上記のコードは、パスワード部分をコメントアウトし、常に真となる条件を追加することで悪用できます。攻撃者がメールアドレス欄に次のような入力をしたと仮定しましょう。

xxx@xxx.xxx' OR 1 = 1 LIMIT 1 -- ' ]

xxx はパスワードです。

生成される動的ステートメントは次のようになります。

SELECT * FROM users WHERE email = 'xxx@xxx.xxx' OR 1 = 1 LIMIT 1 -- ' ] AND password = md5('1234');

ここに、

  • xxx@xxx.xxx 文字列の引用を完了する単一の引用符で終わります。
  • OR 1 = 1 LIMIT 1 は常に true となる条件で、返される結果は XNUMX つのレコードのみに制限されます。
  • — ' AND … はパスワード部分を削除した SQL コメントです。

上記の SQL ステートメントをコピーして、 SQL Fiddle 以下に示すように、SQLテキストボックスを実行します。

SQL Fiddle 注入された条件が実行された後にレコードを返す

ハッキング アクティビティ: Web アプリケーションへの SQL インジェクション

簡単な Web アプリケーションが次の場所にあります。 http://www.techpanda.org/ これは、デモンストレーション目的のみで、SQLインジェクション攻撃に対して脆弱です。上記のHTMLフォームコードはログインページから取得したものです。アプリケーションは、メールアドレスフィールドのサニタイズなど、基本的なセキュリティ機能を提供しています。つまり、上記のコードを使用してログインを回避することはできません。

それを回避するために、パスワード入力欄を利用します。以下の図は、その手順を示しています。

ログインフォームのパスワードフィールドを挿入する手順のフロー図

攻撃者が次のような入力を提供すると仮定しましょう。

  • ステップ1: メールアドレスとしてxxx@xxx.xxxを入力します
  • ステップ 2: xxx') または 1 = 1 — を入力します。

パスワード欄にインジェクション文字列が入力されたログインフォーム

  • [送信] ボタンをクリックします。
  • ダッシュボードに移動します。

生成されるSQL文は以下のとおりです。

SELECT * FROM users WHERE email = 'xxx@xxx.xxx' AND password = md5('xxx') OR 1 = 1 -- ]');

下の図は、ステートメントがどのように生成されるかを示しています。

挿入されたSQL文がどのように生成されるかの詳細

ここに、

  • この記述は、MD5暗号化が使用されていることを前提としている。
  • シングルクォーテーションと閉じ括弧を完成させます。
  • 常に真となる条件をステートメントに追加します。

一般的に、攻撃を成功させるには、上記のような複数の手法を組み合わせる必要がある。

その他の SQL インジェクション攻撃タイプ

SQLインジェクションは、ログインアルゴリズムを回避するだけでなく、より深刻な被害をもたらす可能性があります。攻撃の例としては、以下のようなものがあります。

  • データの削除
  • データの更新
  • データの挿入
  • トロイの木馬などの悪意のあるプログラムをダウンロードしてインストールできるコマンドをサーバー上で実行する
  • クレジットカードの詳細、電子メール、パスワードなどの貴重なデータを攻撃者のリモートサーバーにエクスポートする
  • ユーザーログイン情報などを取得する。
  • Cookieに基づくSQLインジェクション
  • エラーベースのSQLインジェクション
  • ブラインド SQL インジェクション

上記のリストは網羅的なものではなく、SQLインジェクションがどのようなことを引き起こす可能性があるかを示す一例にすぎません。

SQL インジェクションの自動化ツール

上記の例では、SQLに関する豊富な知識に基づいた手動攻撃手法を用いました。より効率的に、かつ最短時間で攻撃を実行できる自動化ツールも存在します。これらのツールには以下のようなものがあります。

SQLインジェクション攻撃を防ぐ方法

組織は、SQL インジェクション攻撃から自らを保護するために、次のポリシーを採用できます。

  • ユーザー入力は決して信用してはならない 動的SQL文で使用する前に、必ずサニタイズ処理を行う必要があります。
  • ストアドプロシージャ これらはSQL文をカプセル化し、すべての入力をパラメータとして扱うことができます。
  • 準備されたステートメント プリペアドステートメントは、まずSQLステートメントを作成し、次に送信されたすべてのユーザーデータをパラメータとして扱うことで機能します。これはSQLステートメントの構文には影響を与えません。
  • 正規表現 これらは、潜在的に有害なコードを検出し、SQL文を実行する前に削除するために使用できます。
  • データベース接続のユーザーアクセス権限 – 使用するアカウントには必要なアクセス権限のみを与えるべきである データベースに接続する。これは、サーバー上で SQL ステートメントが実行できる処理を減らすのに役立ちます。
  • エラーメッセージ ―これらのメッセージには、機密情報やエラーが発生した正確な場所を開示してはなりません。エラーの原因となったSQL文を表示する代わりに、「申し訳ありませんが、技術的なエラーが発生しています。技術チームに連絡済みです。しばらくしてからもう一度お試しください」といった、シンプルなカスタムエラーメッセージを使用できます。

ハッキング アクティビティ: SQL インジェクションに Havij を使用する

この実践的なシナリオでは、Havij Advanced SQL Injectionプログラムを使用して、ウェブサイトの脆弱性をスキャンします。

注: Havij は古く、メンテナンスされていない Windows 上記のツールであるSQLMapは、現在のオープンソース標準です。

注:ウイルス対策プログラムによっては、その性質上、警告が表示される場合があります。除外リストに追加するか、ウイルス対策プログラムを一時停止してください。 アンチウイルスプログラム.

下の画像は、Havijのメインウィンドウを示しています。

Havij SQLインジェクションツールのメインウィンドウ

上記のツールは、ウェブサイトやアプリケーションの脆弱性を評価するために使用できます。

よくあるご質問

サイト所有者の書面による許可がある場合に限ります。所有していないアプリケーションのテストは、米国のコンピュータ詐欺および濫用防止法などの法律で違法とされています。バグバウンティの範囲によって、許可される内容が定められています。

はい。OWASP Top 10:2025では、インジェクションはA05にランク付けされており、テストでは依然としてほぼすべてのアプリケーションでインジェクションの脆弱性が発見されています。毎年数千件もの新しいSQLインジェクションのCVEが報告されていることから、これは依然として主要なWebリスクとなっています。

MD5は高速なハッシュ関数ですが、暗号化には適していません。攻撃者はレインボーテーブルとGPUを使って簡単に解読できます。パスワードには、bcryptやArgon2のような、低速でソルト付きのアルゴリズムを使用してください。

動的に構築された SQL を介してクエリされるデータベース — MySQL, PostgreSQL, Microsoft SQL Server, Oracle, SQLite欠陥は、データベースエンジンではなく、アプリケーションがユーザー入力をクエリに連結する方法にある。

AI搭載ファイアウォールとスキャナーは、通常のトラフィックパターンを学習し、挿入された条件やコメントなどの異常な入力をリアルタイムで検出します。機械学習モデルは、固定シグネチャでは見逃してしまう難読化されたペイロードを検出します。

AIアシスタント GitHubコパイロット パラメータ化されたクエリや入力検証を提案することはできますが、同時に安全でないパターンを再現してしまう可能性もあります。それぞれの提案をドラフトとして扱い、セキュリティリンターと組み合わせてレビューしてください。

SQLインジェクションは、サーバー側のクエリにSQLを挿入することでデータベースを標的とする攻撃です。クロスサイトスクリプティングは、ブラウザ上で実行されるスクリプトを挿入することで他のユーザーを標的とする攻撃です。前者はデータを漏洩させ、後者はセッションを乗っ取ります。

ORM(オブジェクトリレーショナルマッパー)は、デフォルトでパラメータ化を用いてコードオブジェクトからクエリを構築するため、ほとんどのSQLインジェクション攻撃を防ぐことができます。しかし、ORMは万能ではありません。生のクエリや安全でないメソッドは依然として情報漏洩のリスクを伴うため、検証は依然として重要です。