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

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

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

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

SQLインジェクション

SQL インジェクションの仕組み

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

ログイン フォームを備えた単純な 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>

ここに、

  • 上記のフォームは e を受け入れますmail アドレスとパスワードを入力して送信します。 PHP Index.phpという名前のファイル。
  • ログイン セッションを Cookie に保存するオプションがあります。 これは remember_me チェックから推測されましたbox。 post メソッドを使用してデータを送信します。 これは、値が URL に表示されないことを意味します。

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

SELECT * FROM ユーザー WHERE email = $_POST['email'] AND パスワード = md5($_POST['パスワード']);

ここに、

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

sqlfiddle を使用した SQL インジェクション攻撃について説明します。 URLを開く http://sqlfiddle.com/ Webブラウザで。 次の情報が得られますwing 窓。

注: 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) このコードを右側のペインに入力します

ユーザーから * を選択します。

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

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

ユーザーが供給したものと仮定します 管理者@admin.sys > 1234 パスワードとして。 データベースに対して実行されるステートメントは次のようになります。

SELECT * FROM ユーザー WHERE email = 'admin@admin.sys' AND パスワード = md5('1234');

上記のコードは、パスワード部分をコメントアウトし、常に true となる条件を追加することによって悪用される可能性があります。 攻撃者が次の情報を提供したとします。wing eに入力mail アドレスフィールド。

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

xxx はパスワードです。

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

SELECT * FROM ユーザー WHERE email = 'xxx@xxx.xxx' OR 1 = 1 LIMIT 1 — ' ] AND パスワード = md5('1234');

ここに、

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

上記の SQL ステートメントをコピーして SQL に貼り付けます。 FiddleRSQL テキスト box 下に示すように

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

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

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

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

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

攻撃者が次の情報を提供したとします。wing

  • ステップ 1: e として「xxx@xxx.xxx」と入力します。mail 住所
  • ステップ 2: xxx') または 1 = 1 — を入力します。

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

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

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

SELECT * FROM ユーザー WHERE email = 'xxx@xxx.xxx' AND パスワード = md5('xxx') OR 1 = 1 — ]');

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

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

ここに、

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

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

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

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

  • データの削除
  • データの更新
  • データの挿入
  • トロイの木馬などの悪意のあるプログラムをダウンロードしてインストールできるコマンドをサーバー上で実行する
  • クレジットカードなどの貴重なデータをエクスポートするtails、およびmail、および攻撃者のリモートサーバーへのパスワード
  • ユーザーログインの取得tails 等

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

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

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

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

組織は次のことを採用できますwing SQL インジェクション攻撃から身を守るポリシー。

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

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

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

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

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

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

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

まとめ

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

Proof Based Scanning テクノロジーの開発者である Invicti は、Web アプリケーションのセキュリティ意識を高め、より多くの開発者が安全なコードの書き方を学べるようにするために、Guru99 プロジェクトを後援しました。