[Этюд] По мотивам голосования
От: kochetkov.vladimir Россия https://kochetkov.github.io
Дата: 31.03.12 19:21
Оценка: 20 (3)
Довольно странно, что один из классов угроз оказался знаком столь малому проценту от числа проголосовавших. Предлагаю решить небольшую задачку по устранению всех узявимостей в существующем коде, а потом расскажу подробнее, что это за класс и почему с ним наверняка сталкивались почти все разработчики, хотя видимо не знали, что оно так называется. Заодно проверим, действительно ли все знают, как появляются SQL-инъекции и как с ними бороться

Легенда: у нас есть движок форума, одна из страниц которого позволяет посмотреть список всех участников, их статистику (ну там, количество сообщений, рейтинг и т.п.) и фильтровать список по значениям этих полей (например, отобразить всех участников с количеством сообщений больше 100, но меньше 200). Вся информация о пользователе (логин, пароль, никнейм, почта, всевозможные данные его статистики и т.п.) хранятся в одной таблице Users. Ну или вьюхе — не суть. Разработчики реализовали это тривиальным образом и, кроме того, оставили за собой возможность расширять критерии SQL-запроса GET-параметром, но только в том случае, если движок собран в DEBUG-конфигурации:

var fieldName = Request["field"] ?? "Id";
var minValue  = Request["min"]   ?? Int32.MinValue;
var maxValue  = Request["max"]   ?? Int32.MaxValue;
var debugStr  = Request["debug"] ?? string.Empty;

#if DEBUG
    var debugTemplate = "{0}";
#else
    var debugTemplate = string.Empty;
#endif

var queryTemplate = string.Format(
    "SELECT Id, Nickname, Rating, MessageCount, TopicCount FROM Users WHERE {0} >= @minValue AND {0} <= @maxValue {1} ORDER BY {0}",
    fieldName.Replace("'", string.Empty).Replace(" ", string.Empty).Replace("\\", string.Empty).Replace(",", string.Empty).Replace("(", string.Empty).Replace(")", string.Empty),
    debugTemplate
);

var selectCommand = string.Format(queryTemplate, debugStr);
var cmd = new SqlCommand(selectCommand, dataConnection);
cmd.Parameters.Add(new SqlParameter("@minValue", minValue));
cmd.Parameters.Add(new SqlParameter("@maxValue", maxValue));
// Ну и так далее. Далее осуществляется SQL-запрос, и отобранные поля уходят в виде HTML-таблицы в ответ на HTTP-запрос.


Найдите все уязвимости, допущенные в этом коде

[Интервью] .NET Security — это просто
Автор: kochetkov.vladimir
Дата: 07.11.17
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.