Инъекции: SQL, командные, LDAP, десериализация

↑ 7.4 Безопасность бэкенда · ← Предыдущая · → Следующая

Желательно~3 мин чтенияУровень: senior

Зачем это на собесе

Инъекции — общий класс: данные пользователя интерпретируются как код.

Объяснение

ВидКак возникаетЗащита
SQLконкатенация в запросе (см. Параметризованные запросы и SQL-инъекции)параметры, ORM, белые списки для имён
Командные (OS)Process.Start("sh -c " + input)не вызывать shell, передавать аргументы массивом, allowlist
LDAPподстановка в фильтрэкранирование, параметризация
NoSQLJSON-операторы ({ "$ne": null })валидация типов, санитайзинг операторов
XML (XXE)внешние сущности в XMLотключить DTD/внешние сущности (DtdProcessing.Prohibit)
Небезопасная десериализацияBinaryFormatter, полиморфный JSON с типами из входных данныхне десериализовать недоверенные данные в произвольные типы
Template injectionпользовательский шаблонпесочница, не исполнять шаблоны от пользователей
XSSвывод HTML без экранированияконтекстное экранирование, CSP
Path traversal../ в путяхнормализация и проверка корня, генерация имён
Header/log injectionпереводы строк в значенияхсанитайзинг, структурные логи
// Плохо
Process.Start("bash", $"-c \"convert {fileName} out.png\"");
// Лучше: без shell, аргументы раздельно, имя из белого списка/GUID
var psi = new ProcessStartInfo("convert") { ArgumentList = { storedPath, "out.png" }, RedirectStandardError = true };
 
// System.Text.Json: типы задаются кодом, а не входными данными
var dto = JsonSerializer.Deserialize<OrderDto>(json);

Принцип: валидация на входе + кодирование на выходе + минимум прав.

Нюансы и подводные камни

  • BinaryFormatter удалён из .NET 9: не возвращайте его.
  • Newtonsoft TypeNameHandling.All на недоверенных данных приводит к RCE.
  • Регулярные выражения без таймаута дают ReDoS: Regex с matchTimeout.
  • Проверка расширения файла ≠ проверка содержимого.
  • Права процесса: запуск не от root, минимальные права на файлы и БД.

Практика

  1. Найдите в проекте вызовы Process.Start и небезопасные десериализаторы.
  2. Защитите обработчик загрузки от path traversal.
  3. Добавьте таймауты ко всем Regex.

Вопросы с ответами

Связанные темы