#8 Gray Hat C#. Руководство для хакера по созданию и автоматизации инструментов безопасности. SQL-инъекции.
Здравствуйте, дорогие друзья.
В современных веб-приложениях, программистам необходимо иметь возможность скрыто хранить и запрашивать информацию, чтобы обеспечить высококачественный и надежный пользовательский интерфейс. Обычно это достигается с помощью базы данных языка структурированных запросов (SQL), такой как MySQL, PostgreSQL или Microsoft SQL Server. SQL позволяет программисту программно взаимодействовать с базой данных, с помощью операторов SQL — кода, который сообщает базе данных, как создавать, читать, обновлять или удалять данные на основе некоторой предоставленной информации или критериев. Например, оператор SELECT, запрашивающий у базы данных количество пользователей в размещенной базе данных, может выглядеть так, как показано в листинге 2-1.
SELECT COUNT(*) FROM USERS
Иногда программистам необходимо, чтобы операторы SQL были динамическими (то есть изменялись в зависимости от взаимодействия пользователя с веб-приложением). Например, программисту может потребоваться выбрать информацию из базы данных, на основе идентификатора или имени пользователя определенного пользователя. Однако, когда программист создает оператор SQL, используя данные или значения, предоставленные пользователем из ненадежного клиента, такого как веб-браузер, уязвимость SQL-injection может возникнуть, если значения, используемые для создания и выполнения операторов SQL, не очищены должным образом. Например, метод C# SOAP, показанный в листинге 2-2, может использоваться для вставки пользователя в базу данных, размещенную на веб-сервере. (SOAP, или Simple Object Access Protocol, — это веб-технология, основанная на XML, которая используется для быстрого создания API-интерфейсов в веб-приложениях. Она популярна в корпоративных языках, таких как C# и Java.)
В этом случае программист не очистил имя пользователя и пароль, перед созданием [1] и выполнением [2] строки SQL. В результате, злоумышленник может создать строку имени пользователя или пароля, чтобы заставить базу данных запускать тщательно созданный код SQL, предназначенный для удаленного выполнения команд и полного контроля над базой данных. Если бы Вы передали апостроф с одним из параметров (скажем, имя’ пользователя, вместо имя пользователя), метод ExecuteNonQuery() попытается выполнить недопустимый SQL-запрос (показанный в листинге 2-3). Тогда метод выдаст исключение, которое будет показано в ответе HTTP, чтобы злоумышленник мог его увидеть.
insert into users values(‘user’name’, ‘password’);
Многие программные библиотеки, обеспечивающие доступ к базе данных, позволяют программисту безопасно использовать значения, предоставленные ненадежным клиентом, например, веб-браузером, с параметризованными запросами. Эти библиотеки автоматически очищают любые ненадежные значения, передаваемые в запрос SQL, экранируя такие символы, как апострофы, круглые скобки и другие специальные символы, используемые в синтаксисе SQL. Параметризованные запросы и другие типы библиотек объектно-реляционного сопоставления (ORM), такие как NHibernate, помогают предотвратить проблемы с внедрением SQL-кода.
Такие значения, предоставляемые пользователем, как правило, используются в предложениях WHERE в запросах SQL, как показано в листинге 2-4.
SELECT * FROM users WHERE user_id = ‘1’
Как показано в листинге 2-3, добавление одного апострофа в параметр HTTP, который не был должным образом очищен перед использованием для построения динамического SQL-запроса, может привести к тому, что веб-приложение выдаст ошибку (например, код возврата HTTP 500). Поскольку апостроф в SQL обозначает начало или конец строки, одиночный апостроф делает оператор недействительным, преждевременно заканчивая строку или начиная строку, не заканчивая ее. Анализируя ответ HTTP на такой запрос, мы можем фаззить эти веб-приложения и искать предоставленные пользователем параметры HTTP, которые приводят к ошибкам SQL в ответе при изменении параметров.
На этом все. Всем хорошего дня!