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 データ内にあります。
- 検索インジェクション: インジェクション ポイントは検索場所です
- base64 インジェクション: 挿入された文字列は Base64 暗号化する必要があります
- 一般的なデータベース インジェクション
データベース インジェクションの場合、攻撃者はデータベースを使用してより多くのデータやより大きな権限を取得することに他なりません。使用方法 次のカテゴリに要約できます。 データのクエリ
ファイルの読み取りと書き込みコマンドの実行- # #プログラム注入の場合、攻撃者 どのデータベースでもこれら 3 つのことを実行しますが、異なるデータベースに注入される SQL ステートメントは異なります。
- すべてのクエリの列の数は同じである必要があります
- データ型には互換性がある必要があります
- SELECT suser_name(): ユーザーのログイン ID 名を返します。
- SELECT user_name(): 指定された ID に基づいてデータベース ユーザー名を返します。
- SELECT db_name(): データベース名を返します
- SELECT is_member('db_owner'): データベース ロールかどうか
- SELECT Convert(int, '5' ): データ型変換
- ③指定されたテーブルのすべてのフィールドをクエリします
- SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '***'
- INFORMATION_SCHEMA.COLUMNS テーブルは列情報を提供します。
-
現在のデータベース バージョン:
SELECT バナー FROM sys.v_$version WHERE rownum = 1 -
サーバー エクスポート IP: これは
utl_http.request## で実現できます。 -
#サーバー リスニング IP:
SELECT utl_inaddr.get_host_address FROM Dual -
サーバー オペレーティング システム:
SELECT member FROM v$logfile WHERE rownum = 1 -
サーバー SID:
SELECT インスタンス名 FROM v$instance -
現在接続されているユーザー:
SELECT SYS_CONTEXT('USERENV', 'CURRENT_USER') FROM Dual
ここでは、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 サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

AtomエディタMac版ダウンロード
最も人気のあるオープンソースエディター

MantisBT
Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

ZendStudio 13.5.1 Mac
強力な PHP 統合開発環境

EditPlus 中国語クラック版
サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

SecLists
SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。
