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

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

SQL インジェクションは、動的 SQL ステートメントを攻撃して、ステートメントの特定の部分をコメントアウトしたり、常に true となる条件を追加したりする攻撃です。 これは、設計が不十分な Web アプリケーションの設計上の欠陥を利用して、SQL ステートメントを悪用して悪意のある SQL コードを実行します。

データは、情報システムの最も重要なコンポーネントの XNUMX つです。 データベースを活用した Web アプリケーションは、組織が顧客からデータを取得するために使用されます。 SQL Structured Query Language の頭字語です。 データベース内のデータを取得および操作するために使用されます。

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という名前のファイル。
  • ログイン セッションを Cookie に保存するオプションがあります。これは remember_me チェックボックスから推測したものです。データの送信には post メソッドを使用します。つまり、値は URL に表示されません。

ユーザー ID をチェックするためのバックエンドのステートメントが次のとおりであると仮定します。

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

ここに、

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

sqlfiddle を使用した SQL インジェクション攻撃について説明します。 URLを開く http://sqlfiddle.com/ Web ブラウザで次のウィンドウが表示されます。

注: SQL ステートメントを作成する必要があります。

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の実行」をクリックします。次の結果が表示されます。

SQLインジェクションの動作

ユーザーが供給したものと仮定します 管理者@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インジェクションの動作

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

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

これを回避するには、代わりにパスワード フィールドを利用します。 以下の図は、従う必要がある手順を示しています

Web アプリケーションの SQL インジェクション

攻撃者が次のような入力をしたとしよう。

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

Web アプリケーションの SQL インジェクション

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

生成されるSQL文は以下のようになります。

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

以下の図は、ステートメントが生成されたことを示しています。

Web アプリケーションの SQL インジェクション

ここに、

  • このステートメントは、MD5 暗号化が使用されていることをインテリジェントに想定しています。
  • 一重引用符と閉じ括弧を完成させます
  • ステートメントに常に true となる条件を追加します。

一般に、SQL インジェクション攻撃が成功すると、攻撃を成功させるために上記で示したようなさまざまな手法が試行されます。

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

SQLインジェクションは、ログインアルゴリズムを渡すだけでなく、さらに大きな被害をもたらす可能性があります。攻撃には次のようなものがあります。

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

上記のリストはすべてを網羅したものではありません。 SQL インジェクションがどのようなものかを理解するだけです。

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

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

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

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

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

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

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

注: あなたの アンチウイルスプログラム その性質上、フラグを立てる可能性があります。除外リストに追加するか、ウイルス対策ソフトウェアを一時停止する必要があります。

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

SQL インジェクションに Havij を使用する

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

まとめ

  • SQL インジェクションは、不正な SQL ステートメントを悪用する攻撃タイプです。
  • SQL インジェクションを使用すると、ログイン アルゴリズムをバイパスし、データを取得、挿入、更新、削除することができます。
  • SQL インジェクション ツールには、SQLMap、SQLPing、SQLSmack などがあります。
  • SQL ステートメントを作成する際に適切なセキュリティ ポリシーを適用すると、SQL インジェクション攻撃を減らすことができます。