
إثبات المفهوم والتصحيح لـ CVE-2019-9787 (هجمات XSS/CSRF/RCE في ووردبريس). يعرض إصلاحات التعقيم، ملفات تعريف الارتباط HttpOnly، والدفاع القائم على التجزئة ضد CSRF مع تعديلات الشيفرة.
<script>alert('xss');</script>إصلاح الثغرة المنطقية في عملية التعقيم الخاصة بالمشرفين.
أضف السطرين في /wp-admin/includes/ajax-actions.php و /wp-includes/comment.php (تفاصيل في التقرير):
remove_filter( 'pre_comment_content', 'wp_filter_post_kses' );
add_filter( 'pre_comment_content', 'wp_filter_kses' );
HTTP-Only
بالنسبة لملفات تعريف الجلسة التي يديرها PHP، يتم تعيين العلامة إما بشكل دائم في php.ini (دليل PHP على HttpOnly) عبر المعامل:
session.cookie_httponly = True
دفاع قائم على التجزئة (hash-based)
لم يتم تنفيذ رمز التحقق من CSRF في ووردبريس لأن ذلك سيعيق ميزات trackbacks و pingbacks. لا يمكن للخادم التمييز بين طلب CSRF غير قانوني وطلب PINGBACK/TRACEBACK قانوني، لذلك يقبل ووردبريس التعليق تلقائيًا دون رمز CSRF صحيح كطلب PINGBACK/TRACEBACK ويقوم بتصفية ذلك التعليق باستخدام مرشح القائمة البيضاء.
للدفاع ضد هذه الثغرة CSRF، نضيف حقلًا جديدًا في النموذج يُسمى hashnonce للتحقق من أن التعليق مرسل من المشرف. يقوم المشرف بتوقيع قيمة حقل التعليق باستخدام ملف تعريف الارتباط الخاص به.
تم استخدام md5 لتوليد قيمة التجزئة لتوقيع قيمة حقل التعليق (انظر الرسم البياني).
عندما يحاول المشرف اعتماد PINGBACK/TRACEBACK ولا يمكن توفير _wp_unfiltered_html، نستخدم wp_verify_hashNonce. إذا فشل التحقق، سيتم الإبلاغ عن خطأ. حتى إذا نجح التحقق، فقد تم تصحيح الخطأ المنطقي وسيتم استخدام wp_filter_kses لتصفية التعليقات.
الأكواد المعدلة:
comment-template: كود js لحساب وإضافة hashNonce؛pluggable: كود PHP مضاف للتحقق من hashNonce.comment: كود PHP لتغيير منطق معالجة الطلب.الطريقة الثالثة مأخوذة من: https://github.com/sijiahi/Wordpress_cve-2019-9787_defense