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

SQLインジェクションとは何ですか?
SQLインジェクションとは、動的SQL文を改ざんして、文の一部をコメントアウトしたり、常に真となる条件を追加したりする攻撃です。設計の不備のあるWebアプリケーションの欠陥を悪用し、SQL文を悪用して悪意のあるSQLコードを実行します。
データは情報システムの最も重要な構成要素の1つです。データベースを利用したWebアプリケーションは、組織が顧客からデータを取得するために使用されます。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文はご自身で記述する必要があります。
ステップ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を実行」をクリックしてください。以下の結果が表示されます。
ユーザーがユーザー名に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 = 1LIMIT 1 は常に true となる条件で、返される結果は XNUMX つのレコードのみに制限されます。- — ' AND … はパスワード部分を削除した SQL コメントです。
上記の SQL ステートメントをコピーして、 SQL Fiddle 以下に示すように、SQLテキストボックスを実行します。
ハッキング アクティビティ: 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 -- ]');
下の図は、ステートメントがどのように生成されるかを示しています。
ここに、
- この記述は、MD5暗号化が使用されていることを前提としている。
- シングルクォーテーションと閉じ括弧を完成させます。
- 常に真となる条件をステートメントに追加します。
一般的に、攻撃を成功させるには、上記のような複数の手法を組み合わせる必要がある。
その他の SQL インジェクション攻撃タイプ
SQLインジェクションは、ログインアルゴリズムを回避するだけでなく、より深刻な被害をもたらす可能性があります。攻撃の例としては、以下のようなものがあります。
- データの削除
- データの更新
- データの挿入
- トロイの木馬などの悪意のあるプログラムをダウンロードしてインストールできるコマンドをサーバー上で実行する
- クレジットカードの詳細、電子メール、パスワードなどの貴重なデータを攻撃者のリモートサーバーにエクスポートする
- ユーザーログイン情報などを取得する。
- Cookieに基づくSQLインジェクション
- エラーベースのSQLインジェクション
- ブラインド SQL インジェクション
上記のリストは網羅的なものではなく、SQLインジェクションがどのようなことを引き起こす可能性があるかを示す一例にすぎません。
SQL インジェクションの自動化ツール
上記の例では、SQLに関する豊富な知識に基づいた手動攻撃手法を用いました。より効率的に、かつ最短時間で攻撃を実行できる自動化ツールも存在します。これらのツールには以下のようなものがあります。
- SQLマップ – http://sqlmap.org/
- jSQLインジェクション – https://www.kali.org/tools/jsql/
SQLインジェクション攻撃を防ぐ方法
組織は、SQL インジェクション攻撃から自らを保護するために、次のポリシーを採用できます。
- ユーザー入力は決して信用してはならない 動的SQL文で使用する前に、必ずサニタイズ処理を行う必要があります。
- ストアドプロシージャ これらはSQL文をカプセル化し、すべての入力をパラメータとして扱うことができます。
- 準備されたステートメント プリペアドステートメントは、まずSQLステートメントを作成し、次に送信されたすべてのユーザーデータをパラメータとして扱うことで機能します。これはSQLステートメントの構文には影響を与えません。
- 正規表現 これらは、潜在的に有害なコードを検出し、SQL文を実行する前に削除するために使用できます。
- データベース接続のユーザーアクセス権限 – 使用するアカウントには必要なアクセス権限のみを与えるべきである データベースに接続する。これは、サーバー上で SQL ステートメントが実行できる処理を減らすのに役立ちます。
- エラーメッセージ ―これらのメッセージには、機密情報やエラーが発生した正確な場所を開示してはなりません。エラーの原因となったSQL文を表示する代わりに、「申し訳ありませんが、技術的なエラーが発生しています。技術チームに連絡済みです。しばらくしてからもう一度お試しください」といった、シンプルなカスタムエラーメッセージを使用できます。
ハッキング アクティビティ: SQL インジェクションに Havij を使用する
この実践的なシナリオでは、Havij Advanced SQL Injectionプログラムを使用して、ウェブサイトの脆弱性をスキャンします。
注: Havij は古く、メンテナンスされていない Windows 上記のツールであるSQLMapは、現在のオープンソース標準です。
注:ウイルス対策プログラムによっては、その性質上、警告が表示される場合があります。除外リストに追加するか、ウイルス対策プログラムを一時停止してください。 アンチウイルスプログラム.
下の画像は、Havijのメインウィンドウを示しています。
上記のツールは、ウェブサイトやアプリケーションの脆弱性を評価するために使用できます。








