ブラインド時間ベースのブラインドインジェクションの
概要ブラインドインジェクション
とは、SQLインジェクションプロセス中に、SQLステートメントの実行を選択した後、選択したデータをフロントエンドページにエコーできないことを意味します。現時点では、いくつかの方法を使用して判断または試行する必要があります。このプロセスはブラインドインジェクションと呼ばれます。
ブラインドインジェクションの原理ブラインドインジェクションの本質は、ソリューションを推測することです。エコーデータがない場合、各クエリでわずかな違いが発生するのは「感触」にのみ依存し、この違いには、実行時間とページリターンの違いが含まれます。結果の違い。
ブールベースのブラインドインジェクションの場合は、インジェクションステートメントを作成して、入力したブール式をテストできます。ブール式のtrueまたはfalseの結果により、各ページの反応が異なります。
時間に基づくブラインドインジェクションの場合、作成するステートメントには、システムの実行時間に影響を与える可能性のある関数が含まれています。各ページから返された時間に基づいて、インジェクトされたステートメントが正常に実行されたかどうかを判断できます。
ブラインドインジェクションの分類
•ブールに基づくブラインドSQLインジェクション•
時間に基づくブラインドSQLインジェクション
•エラー報告プロセスに基づくブラインドSQLインジェクション
:
- SQLブラインドインジェクションポイントを見つけて確認する
- 一般的なエラーインターフェイスを強制する
- 副作用を含むクエリを挿入する
- ブール式の真と偽の結果に従って、さまざまな戻り結果と組み合わせて、注入が成功したかどうかを確認します
時間ベースのブラインドノート:
一般的な関数:
If(exp、v1、v2):式exprが保持されている場合は結果v1を返し、そうでない場合は結果v2を返しますSubstring(s、n、len):最初の文字列sを取得しますn位置は、文字列
Sleep(duration)の長さで始まります。durationパラメーターで指定された秒数の後に実行されます。
(注):スリープ関数は、スリープ(5)などの条件を満たす行がある限り、指定された時間だけ遅延しますが、実際に条件を満たす2つの行を見つけると、10秒遅れます。重要な情報、実際の侵入テストプロセスでは、テーブル全体の状況がわからない場合があります。たとえば、スリープ(0.001)に設定して結果を得るまでの最後の秒数を確認し、テーブルの行数を推測するために、この方法を使用できます。
共通の構文フォーマット:
id = 1のテーブルから*を選択し、if(ブール式、sleep(5)、1);
インジェクションのアイデア:
時間ブラインドインジェクションに基づく一般的なアイデアは遅延インジェクションです。率直に言えば、sleep()やベンチマーク()などの関数を使用してmysqlの実行時間を長くし、条件ステートメントif(expr1、expr2、expr3)と組み合わせてから、ページ全体を使用します。応答時間は、いくつかの不明なフィールドを推測するために、ステートメントによって返された値がTRUEかFalseかを判別することです。
インジェクションプロセス(データベースのバージョン情報を例にとります):
- 射出位置と射出タイプを決定する
- if判断ステートメントを使用し、バージョン()の長さを推測し、判断の基礎としてスリープ関数を使用します
- 真の長さが得られるまで手順2を繰り返します
- ステートメントを判断するためにifを使用し、バージョン()の最初の文字のASCIIコードを推測し、インジェクションステートメントを構築するための判断基準としてスリープ関数を使用します。
- 完全なバージョンの文字のASCIIコードを取得するまで、手順4を繰り返します
注入試験:
まず、ID = 1を参照して、注入点を見つけ、疑わしいSQLインジェクションが存在し得る
文字の注射の存在を示す、注入の種類を決定することによって、「エラー以下のシンボルの増加に従った
ブラインド試験時間、無エコーデータので、
ペイロードは、以下:
同上= 1 'and sleep(2);
スリープが正常に実行され、戻り時間が2秒であることを確認できます。これは、sleep()がフィルターされていないことを示して
います。データベースのバージョン情報を取得してみてください。まず、バージョン情報の長さを確認します
Id = 1'とif(length(version ())= 23、sleep(3)、1)-+
長さが23文字の場合、戻り時間は3秒です。それ以外の場合、すぐに戻ります。
長さを決定した後、各桁のASCIIコードを順番に検索します。
例:id = 1 'and if(ascii(substring(version()、1,1))= 53、sleep(3)、1)-+
最初に試す1桁のASCIIコードは53または10進数ですか?
上記の手順を繰り返して、すべてのバージョン情報を取得します
バイパス方法:
スリープ関数とベンチマーク関数がシールドされている場合、次の2つの方法を使用して制限戦略をバイパスできます
。1.
重ね合わせ完全配置いわゆる重ね合わせ完全配置は、デカルト積を複数のテーブルに接続し、クエリ時間が指数関数的になるようにします。成長、つまり攻撃者は単純なテーブルクエリを継続的に積み重ね、SQLステートメントを実行するためのシステムの負荷を継続的に増加させ、攻撃者が望む遅延が生成されるまで継続します。
例えば、マルチテーブルシステムテーブルinformation_schema.columnsの次のクエリ結果は
クエリの結果3083の単一テーブル、経過時間が0.05sである
2つのテーブルのクエリ結果は、使用時間が0.44であり、9504889である
ので、クエリ内のテーブルの数を制御し、照会番号テーブル注入時間が長すぎると注入時間が長すぎ、短すぎると感じられないので何度も試す必要があります。
2. get_lock()ロック機構
基本ステートメント:
テストからget_lock(キー、タイムアウト)を
選択します;テストからrelease_lock(キー)を選択します;
(1)GET_LOCKには2つのパラメーターがあり、1つはキー、つまりロックされるフィールドを意味します。 1つは、ロックが失敗した後の待機時間です。クライアントがフィールドをロックした後、別のクライアントはフィールドのロックに失敗し、設定された時間
(2)待機します。上記のロックを解除するためにRELEASE_LOCKが呼び出されるか、クライアントが切断されると、上記のロックが解除され、他のクライアントが入ることができます。
テストプロセス:
最初に名前フィールドをロックし、返される結果は1であり、時間は0であり、ロックが正常に
確立されたことを証明します。別のmysql接続、同じフィールドがロックされ、返される結果は0であり、時間はカスタム5です。証明ロックに失敗しました
上記の基本理論と時間ブラインド注入の原理を使用して、get_lock()の使用を実現し、時間ブラインド注入ステートメントを構築します。
- まず、フィールドをインジェクションによってロックします
Select * from xxx where id = 1 and get_lock( 'column_name'、1);
- 然る构造盲注语句
Select * from xxx where id = 1 and 1 and get_lock( 'column_name'、5);
* from xxxを選択します。ここで、id = 1および0およびget_lock( 'column_name'、5);
このバイパス方法には制限があります。つまり、データベースの接続は永続的な接続である必要があり、使用するのは前の接続と後者の接続のブロッキング効果であり、遅延が発生することです。したがって、このメソッドを使用できるのは、mysql_pconnect()メソッドを使用してPHPのデータベースに接続するWebサイトのみです。
タイムブラインドインジェクションの利点と欠点:タイムブラインドインジェクションを使用する最大の利点は、特にエラーベースの攻撃と比較して、ログにほとんど影響がないことです。ただし、多数のクエリまたはCPUを多用する関数(MySQLのBENCHMARK()など)を使用する必要がある場合、システム管理者は何が起こっているかを認識している場合があります。
考慮すべきもう1つのことは、注入する遅延時間です。これは、Webアプリケーションをテストするときに特に重要です。サーバーの負荷とネットワーク速度が応答時間に大きな影響を与える可能性があるためです。これらの不確実性がテスト結果に干渉しないように、クエリを十分に一時停止する必要があります。一方、適切な時間内にアプリケーションをテストするために遅延を十分に短くする必要があるため、この時間の長さを把握することは困難です。