
SureForms <= 2.2.0 - تخزين ثنائي عبر الموقع بدون مصادقة
توجد ثغرة XSS مخزنة خطيرة في إضافة SureForms. تنشأ الثغرة من تنفيذ غير آمن من جانب العميل في ملف entries.js حيث يتم فك تشفير (عكس التعقيم من جانب الخادم) إدخال المستخدم برمجيًا ثم عرضه باستخدام dangerouslySetInnerHTML دون تعقيم مناسب من جانب العميل. وهذا يسمح للمهاجمين غير المصادقين بحقن حمولات جافا سكريبت ضارة عبر حقول النموذج القياسية، متجاوزين مرشحات الافتراضية لووردبريس.
wp_ksesللتحقق مما إذا كان الموقع المستهدف يشغل إضافة SureForms، افحص رأس ملف الترجمة الذي يحتوي عادةً على رقم الإصدار.
الرابط المستهدف:
http://target-site.com/wp-content/plugins/sureforms/languages/sureforms.pot
أمر التحقق:
curl -s "http://target-site.com/wp-content/plugins/sureforms/languages/sureforms.pot" | grep "Project-Id-Version"
توجد الثغرة في واجهة الإدارة القائمة على React والتي تعرض إدخالات النموذج (ملف entries.js).
في ملف entries.js المصغر، توجد دالة مساعدة (تم تحديدها كـ Xv في البناء الذي تم تحليله) مصممة للتعامل مع كيانات HTML.
منطق الكود (معاد بناؤه):
// Function Xv: Pre-processing field values
var Xv = function(input) {
var value = input.value;
// VULNERABILITY ROOT CAUSE:
// If the string contains HTML entities (e.g., <), create a textarea,
// inject the content, and extract the value.
// This effectively DECODES HTML entities back to raw HTML tags.
// Example: "<img ...>" becomes ""
if (typeof value === "string" && value.match(/&[a-zA-Z0-9#]+;/)) {
var textarea = document.createElement("textarea");
textarea.innerHTML = value;
// Logic to revert sanitization
if (textarea.value.includes("<") || textarea.value.includes(">")) {
value = textarea.value; // Now 'value' contains RAW HTML
}
}
return { ...input, value: value };
}
التحليل: تقوم هذه الدالة بتعطيل أمان الخلفية. حتى لو قام ووردبريس بتخزين <script> بشكل صحيح كـ <script> في قاعدة البيانات، تقوم هذه الدالة بتحويله مرة أخرى إلى <script> فور جلبه من API.
بعد فك التشفير، يتم تمرير البيانات إلى مكون العرض (تم تحديده كـ Jv).
منطق الكود (معاد بناؤه):
// Function Jv: Rendering the field
var Jv = function(props) {
var field = props.field;
var val = field.value; // This value is now raw HTML (post-decoding)
// THE TRIGGER: Check if the string looks like HTML
if (typeof val === "string" && val.match(/<[^>]+>/g)) {
// THE SINK: Render using dangerouslySetInnerHTML WITHOUT client-side sanitization (e.g., DOMPurify)
return React.createElement("span", {
dangerouslySetInnerHTML: { __html: val }
});
}
// Safe render for non-HTML text
return React.createElement("span", null, val);
}
الحقن: يرسل مهاجم غير مصادق نموذجًا في الواجهة الأمامية. بدلاً من استخدام علامات HTML الخام (التي سيتم تجريدها/تعقيمها بواسطة خلفية ووردبريس)، يرسل المهاجم كيانات HTML.
التخزين: يرى ووردبريس الإدخال (مثل <img...) كنص آمن ويخزنه في قاعدة البيانات.
التنفيذ (الفخ):
Xv الكيانات وتفك تشفير <img... إلى ` الإدخالات.انقر على الإدخال المرسل في الخطوة 1 لعرض التفاصيل.
النتيجة: سيقوم المتصفح بتنفيذ حمولة جافا سكريبت (alert('XSS_SUREFORMS')).