SQL インジェクションには 3 つの方法があります: 1. 数値インジェクション; 入力パラメータが整数の場合、数値インジェクションの脆弱性が存在する可能性があります。 2. 文字インジェクション; 入力パラメータが文字列の場合、文字インジェクションの脆弱性が存在する可能性があります。 3. その他のタイプ (例: 検索インジェクション、Cookie インジェクション、POST インジェクションなど)。
##SQL インジェクションの原則SQL インジェクション攻撃とは、Web に渡される特別な入力を構築することを指します。アプリケーションをパラメータとして使用する場合、これらの入力のほとんどは SQL 構文の組み合わせです。SQL ステートメントを実行することで、攻撃者は必要な操作を実行します。主な理由は、プログラムがユーザーが入力したデータを慎重にフィルタリングしていないため、不正なデータが生成されることです。侵入システム。
#SQL インジェクションの分類1. 数値インジェクション
入力パラメータが整数の場合、数値インジェクションの脆弱性が存在する可能性があります。
URL があるとします:HTTP://www.aaa.com/test.php?id=1
バックグラウンド SQL ステートメントは次のように推測できます:
SELECT * FROM table WHERE id=1数値脆弱性の SQL インジェクションポイントを決定する
① まず入力ボックスに入力します一重引用符
' を入力すると、SQL ステートメントは次のようになります:
SELECT * FROM table WHERE id=1'
, は構文に準拠していないため、このステートメントは間違いなく間違っており、スクリプト プログラムがデータベースからデータを取得できなくなり、元のページが異常になります。
② 入力ボックスに
and 1 = 1# と入力すると、SQL ステートメントは次のようになります:
ステートメントは正しく、正常に実行されます。返されるデータは元のリクエストと変わりません。
and 1 = 2
# と入力すると、SQL ステートメントは次のようになります: SELECT * FROM table WHERE id=1 および 1 = 2
上記の 3 つの手順がすべて満たされている場合、プログラムには数値 SQL インジェクションの脆弱性がある可能性があります。
入力パラメータが文字列の場合、文字インジェクションの脆弱性が存在する可能性があります。数値注入と文字注入の最大の違いは、数値型は一重引用符で閉じる必要がないのに対し、 文字型は通常一重引用符で閉じる必要があることです。
文字インジェクションで最も重要なことは、SQL ステートメント を閉じて 冗長コード
をコメント化する方法です。バックグラウンド SQL ステートメントが次のとおりであると仮定します。 SELECT * FROM table WHERE username = 'admin'
文字を決定するための SQL インジェクション ポイントtype vulnerabilities:
① 最初に単一引用符を入力することをお勧めします admin' to test
このような SQL ステートメントは次のようになります。 SELECT * FROM table WHERE ユーザー名 = 'admin''
② 入力:
注: admin '# の後には単一引用符があります。 # #、文字列を閉じるために使用され、最後にコメント文字
-- があります (
)。 SQL ステートメントは次のようになります:
SELECT * FROM table WHERE username = 'admin' and 1 = 1 --
ページは正しく表示されます。 。
③ 入力:
admin' および 1 = 2 --
SQL ステートメントは次のようになります: SELECT * FROM テーブル WHERE ユーザー名 = 'admin' および 1 = 2 --
ページ エラー。
上記の 3 つの手順が満たされている場合、文字 SQL インジェクションが存在する可能性があります。
3. その他のタイプ
実際には、SQL インジェクションには数値と文字の 2 種類しかないと思います。他にもCookieインジェクション、POSTインジェクション、ディレイドインジェクションなどの方法があると言う人も多いかもしれません。 これは確かに事実ですが、これらのタイプの注入は、最終的には数値および文字の注入の異なる表現形式、または異なる注入位置にすぎません。 一般的なインジェクション名は次のとおりです。
POST インジェクション: 挿入されたフィールドは POST データ内にあります。
データベース インジェクションの場合、攻撃者はデータベースを使用してより多くのデータやより大きな権限を取得することに他なりません。使用方法 次のカテゴリに要約できます。 データのクエリ
ファイルの読み取りと書き込みコマンドの実行ここでは、Oracle 11g、MySQL 5.1、SQL Server 2008 の 3 つのデータベースのインジェクションを示します。
SQL Server
1. エラー メッセージを使用して情報を抽出します
SQL Server データベースはa 攻撃者はエラー メッセージから必要なデータを抽出できるため、エラー情報を正確に特定できる優れたデータベースは攻撃者にとって非常に有益です。
① 現在のテーブルまたは列を列挙します。
このようなテーブルが存在すると仮定します。
ルートの詳細をクエリします。 user Information の SQL ステートメントの推測は次のとおりです: SELECT * FROM user WHERE username = 'root' AND passwd = 'root'
攻撃者は SQL Server の機能を使用して、次のことを行うことができます。機密情報を取得します。入力ボックスに次のステートメントを入力します: ' getting 1 = 1 --
最後に実行される SQL ステートメントは次のようになります: SELECT * FROM user WHERE ユーザー名 = 'root' AND パスワード = 'root' HAVING 1 = 1 --
SQL エグゼキュータはエラーをスローする可能性があります:
攻撃者 あなた現在のテーブル名が user であり、フィールド ID が存在することがわかります。
攻撃者は、次のステートメントを入力することで、この機能を使用して他の列名を取得し続けることができます: ' GROUP BY users.id HAVING 1 = 1 --
Then SQL ステートメントは For: SELECT * FROM user WHERE username = 'root' AND passwd = 'root' GROUP BY users.id HAVING 1 = 1 --
エラーがスローされます:
列名 username が含まれていることがわかります。エラー メッセージが返されなくなるまで再帰的にクエリを実行できるため、HAVING 句を使用して現在のテーブルのすべての列名を取得できます。
注: この列に集計関数が使用されていない限り、Select で指定された各列は Group By 句に表示される必要があります。
②. データ型エラーを使用した抽出 データ
文字列を文字列以外と比較しようとしたり、文字列を互換性のない別の型に変換しようとしたりすると、SQL エディターは例外をスローします。
次の SQL ステートメント: SELECT * FROM user WHERE ユーザー名 = 'abc' AND パスワード = 'abc' AND 1 > (SELECT TOP 1 ユーザー名 FROM ユーザー)
Executor エラー メッセージ:
これにより、ユーザーのユーザー名 root を取得できます。サブクエリ SELECT TOP 1 username FROM users
では、最初にクエリされたユーザー名が返されるため、戻り値の型は varchar 型であり、次に int 型の 1 と比較されます。2 つの型は異なります。データを指定することはできません。比較するとエラーが報告され、データ漏洩につながります。
このメソッドを使用してすべてのアカウント情報を再帰的に推定します: SELECT * FROM users WHERE username = 'abc' AND Password = 'abc' AND 1 > (SELECT TOP 1 username FROM users WHERE) ('root'))
にはありません。
このステートメントを作成すると、次のユーザー名を取得できます。サブクエリ内のユーザー名を他のカラム名に置き換えると、ここでは説明しませんが、他のカラムの情報も取得できます。
2. メタデータの取得
SQL Server には、メタデータの取得を容易にする多数のビューが用意されています。まずテーブル内の列の数を推測し、次に UNION を使用して SQL ステートメントを構築し、データを取得します。
例: SELECT *** FROM *** WHERE id = *** UNION SELECT 1, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
現在のテーブルの列数の場合が 2 の場合、現在のデータベース テーブルは UNION ステートメントで取得できます。現在のテーブルの列数を推測する方法については後述します。
一般的に使用されるシステム データベース ビュー:
データベース ビュー | 説明 |
---|---|
##SYS.DATABASES | SQL Server のすべてのデータベース |
SYS.SQL_LOGINS | SQL Server のすべてのログイン |
INFORMATION_SCHEMA.TABLES | 現在のユーザー データベース内のすべてのデータ テーブル |
INFORMATION_SCHEMA.COLUMNS | 現在のユーザーのすべての列データベース |
SYS.ALL_COLUMNS | ユーザー定義オブジェクトとシステム オブジェクトのすべての列の結合 |
SYS .DATABASE_PRINCIPALS | データベース内の各権限または列の例外権限 |
SYS.DATABASE_FILES | データベースに保存されているデータベース ファイル |
データベース内に作成されたすべてのオブジェクト (制約、ログ、ストアド プロシージャを含む) |
ストアド プロシージャ | 説明 |
---|---|
sp_addlogin | ユーザーが SQL Server ID を使用して SQL Server インスタンスに接続できるようにする新しい SQL Server ログインを作成します |
sp_dropuser | 現在のデータベースからデータベース ユーザーを削除します |
Microsoft Windows ローカル グループ リストを提供するか、指定された Windows ドメインでグローバル グループ リストを定義します | |
レジストリの読み取り | |
レジストリの書き込み | |
レジストリの削除 | |
ディレクトリの読み取り | |
パスワードの変更 | |
サービスの停止またはアクティブ化 |
Role | Permission |
---|---|
bulkadmin | BULK INSERT ステートメントを実行できます |
dbcreator | 任意のデータベースを作成、変更、削除、復元できます |
ディスク ファイルを管理できます | |
データベース エンジンで実行されているインスタンスをプラントできます | |
ログイン名とその属性を管理できます。サーバー レベルの権限の GRANT、DENY、および REVOKE を利用できます。また、データベース レベルの権限の GRANT、DENY、および REVOKE も利用できます。 ; さらに、SQL Server ログインのパスワードの設定をやり直すこともできます | |
サーバー全体の構成オプションを変更したり、サーバーをシャットダウンしたりできます | |
リンク サーバーを追加および削除でき、特定のシステム ストアド プロシージャを実行できます | |
できるデータベース エンジンで任意のアクティビティを実行します |
以上がSQL インジェクションの 3 つの方法は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。