اكتشفت ثغرة في سكريبت التدوين ووردبريس و WordPress-MU أصابت الاصدار 2.8.3 وجميع الاصدارات التي قبله, تمكّن هذه الثغرة المهاجم من تغيير كلمة مرور مدير المدونة دون علمه عن طريق استغلال خطأ في دالة تغيير كلمة المرور reset_password الموجودة في ملف wp-login.php.

WordPress

 

الثغرة لا تمكّن المهاجم من معرفة كلمة المرور بعد تغييرها ولا تمكّنه من الوصول المباشر للوحة التحكم أيضا وكل ما يستطيع القيام به هو تغيير كلمة مرور مدير المدونة أو أي عضو يختاره (في حال كانت المدونة متعددة المستخدمين) دون علمه عن طريق تخطي تأكيد التغيير الذي يصل الى الايميل بسبب الخطأ في الدالة reset_password.

عندما يريد أحد المستخدمين تغيير كلمة المرور الخاصة به يتوجّه للرابط:

/wp-login.php?action=lostpassword

فيطلب منه سكريبت ووردبريس ادخال اسم المستخدم أو الايميل المسجّل ثم يقوم بارسال ايميل تأكيدي يحتوي على رابط تغيير كلمة المرور يشبه هذا:

/wp-login.php?action=rp&key=JR9PSKe5UDeqRCFkOXEs

عندما يقوم المستخدم بالضغط على الرابط يتم تغيير كلمة المرور الخاصة به بشكل أوتوماتيكي وارسالها على ايميله حيث يمكنه تغييرها مرة أخرى بعد الدخول للوحة التحكم.

 

اذا اطلعنا على الكود المصدري لملف wp-login.php سنرى في السطر 188 فلترة مدخلات المستخدم بشكل صحيح (بهذه الحالة هو المتغير key) عن طريق استخدام regex:

$key = preg_replace(‘/[^a-z0-9]/i’, ”, $key);

ثم يتم التأكد من قيمة المتغير key اذا كان فارغ أم لا بالسطر 190:

if ( empty( $key ) )

بعد ذلك اكمال عملية تغيير كلمة المرور. من ينظر للكود السابق قد لا يجد أي شيء يمكن استغلاله لكن الخطأ الذي وقع به المبرمج هنا أنه لم يتأكد من نوع المتغير key وهنا تمكّن المهاجم من استغلال ذلك عن طريق تحدد key على أنه مصفوفة Array وليس String.

/wp-login.php?action=rp&key[]=

 

حتى تاريخ كتابة هذا الخبر لم يتم اطلاق الاصدار 2.8.4 بعد لكن تم اصلاح الملف wp-login.php في WordPress Trac وأتوقع اطلاق الاصدار 2.8.4 قريبا. كحل مؤقت يمكن ترقيع الثغرة باستبدال السطر 190 الموجود في الملف wp-login.php:

if ( empty( $key ) )

بالسطر التالي:

if ( empty( $key ) || is_array( $key ) )

 

لمزيد من المعلومات: SecurityReasonWordPress Trac

Share on FacebookShare on Google+Tweet about this on TwitterShare on LinkedIn