Ответ:
User.findOne({ username, password });
Поля из req.body напрямую попадают в фильтр MongoDB.
Mongoose без sanitizeFilter позволяет операторные ключи ($ne, $gt и т.п.).
{
"username": "admin",
"password": { "$ne": null }
}
{ username: "admin", password: { $ne: null } }
Пароль admin ≠ null → документ найден → FLAG получен.
Коротко и по делу:
mongoose.set('sanitizeFilter', true);
или проверять типы:
if (typeof password !== 'string') return 400;
#ctf_challenge
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4🥰2❤1
Представим, что специалистами по безопасности приложений была найдена ошибка в одном из продуктов, позволяющая изменять конечную цену товара. Известно, что внутри класса Promocode есть обращение к методу calculate_total. Выше представлена часть кода, содержащая уязвимость.
🥰 — Race Condition при применении промокода
👾 — Race Condition при добавлении товаров
❤️ — TOCTOU (Time-of-Check-Time-of-Use) при расчёте скидки
#ctf_challenge
Please open Telegram to view this post
VIEW IN TELEGRAM
🥰6❤4👾3