Sql инъекция что это: SQL injection для начинающих. Часть 1 / Хабр
Содержание
SQL-инъекции — распространённый метод взлома веб-приложений и сайтов
SQL-инъекции — это один из очень распространённых способов взлома сайтов и веб-приложений, работающих с реляционными базами данных.
Этот способ основан на внедрении в выполняемый приложением запрос к базе данных произвольного SQL-кода, переданного злоумышленником. SQL-инъекции являются одной из разновидностей атак типа «инъекция кода».
SQL-инъекции, в зависимости от типа уязвимости, может дать возможность атакующему выполнить произвольный запрос к базе данных. То есть атакующий сможет прочитать содержимое любых таблиц, удалить, изменить или добавить данные, а также есть вероятность получения возможности работы с локальными файлами и выполнения произвольных команд на атакуемом сервере.
Последствия SQL-инъекций:
- Кража данных
- Модификация данных
- Удаление данных
- Полный взлом системы
Атаки типа внедрения SQL становятся возможными из-за некорректной обработки приложением входных данных. Разработчики сайтов и приложений, работающих с реляционными базами данных, должны знать о таких уязвимостях и принимать меры противодействия.
С точки зрения безопасности сайта или веб-приложения, наиболее правильной является фильтрация всех полученных данных (приложение в принципе не должно принимать в обработку те параметры, которые непонятно зачем были переданы) и продуманная обработка тех параметров, которые используются для построения запроса к базе данных.
Для предотвращения SQL-инъекций основными направлениями обработки входных данных должны являться:
- экранирование специальных символов в полученных строковых параметрах (универсальный способ)
- приведение полученных данных к ожидаемому приложением типу (отлично работает на булевом типе и на числах)
- нормализация и очистка полученных параметров регулярными выражениями (похоже на приведение к типу, но работает для более комплексных параметров)
- валидация полученных параметров по справочникам (часто перечень ожидаемых параметров известен и ограничен)
- усечение полученных параметров (длина инъекций, как правило, достаточно велика)
- использование параметризованных запросов (запрос передаётся отдельно от параметров, параметры в этом случае экранируются автоматически)
- правильное использование клиентских библиотек и возможностей ORM (библиотеки для работы с СУБД и ORM обычно хорошо документируют правильное с точки зрения безопасности их использование)
- фильтрация по ключевым словам и последующий бан атакующего (мера, позволяющая усложнить сканирование на уязвимости)
Что такое инъекция SQL? — CodeRoad
Может кто-нибудь объяснить SQL инъектон?
SQL инъекция происходит, когда вы интерполируете некоторое содержимое в строку запроса SQL, и результат изменяет синтаксис вашего запроса так, как вы не собирались.
Это не обязательно должно быть злонамеренным, это может быть несчастный случай. Но случайная инъекция SQL с большей вероятностью приведет к ошибке, чем к уязвимости.
Вредоносный контент не обязательно должен исходить от пользователя, это может быть контент, который ваше приложение получает из любого источника или даже генерирует само в коде.
Как это вызывает уязвимости?
Это может привести к уязвимостям, поскольку злоумышленники могут отправлять в приложение значения, которые, как они знают, будут интерполированы в строку SQL. Будучи очень умными, они могут манипулировать результатами запросов, считывать данные или даже изменять данные, что им не должно быть позволено делать.
Пример в PHP:
$password = $_POST['password'];
$id = $_POST['id'];
$sql = "UPDATE Accounts SET PASSWORD = '$password' WHERE account_id = $id";
Теперь предположим, что злоумышленник устанавливает параметры запроса POST в » password=xyzzy
» и «id=account_id
«, что приводит к следующему SQL:
UPDATE Accounts SET PASSWORD = 'xyzzy' WHERE account_id = account_id
Хотя я ожидал, что $id
будет целым числом, злоумышленник выбрал строку, которая является именем столбца. Конечно, теперь условие верно для каждой строки, поэтому злоумышленник просто установил пароль для каждой учетной записи. Теперь злоумышленник может войти в любую учетную запись, включая привилегированных пользователей.
Где именно находится точка, в которую вводится SQL?
Это не SQL, который вводится, это содержимое, которое интерполируется («injected») в строку SQL, что приводит к другому типу запроса, чем я предполагал. Я доверял динамическому контенту, не проверяя его, и слепо выполнил полученный запрос SQL. Вот тут-то и начинаются неприятности.
SQL инъекция-это ошибка в коде приложения, обычно не в базе данных, библиотеке доступа к базе данных или фреймворке.
В большинстве случаев внедрения SQL можно избежать, используя параметры запроса. Смотрите, как я могу предотвратить инъекцию SQL в PHP? для примера.
Страница не найдена – Information Security Squad
Если вы работаете с Kubernetes, то монтирование файловой системы хоста в контейнер в виде тома должно не давать вам спать по ночам. Позвольте мне объяснить почему. Что такое “volume” (том)? Поскольку контейнеры должны быть эфемерными и без статических данных, им необходим какой-то способ сохранения данных за пределами контейнера. В некоторых случаях им даже требуется постоянное […]
Команда passwd используется для установки начального пароля пользователя или изменения существующего пароля. Синтаксис команды passwd следующий: $ passwd [username] Пользователь root может установить пароль для любого пользователя на любое значение, не зная его текущего пароля. От обычного пользователя, просто введите эту команду в CLI. В ответ вы увидите что-то вроде этого: $ passwd Changing password […]
Если у вас возникла потребность в новом сервере, ваш старый не справляется с задачами или вышел из строя, впервые решили приобрести серверное оборудование, но вас останавливает цена и множество сопутствующих факторов (дополнительное помещение, техническое обслуживание и тому подобные моменты), есть другое решение. Оно вам позволит одновременно и не тратить большие деньги, и при этом быть […]
Следить за своими паролями может быть непростой задачей. Часто вы склонны забывать их со временем, особенно после длительного периода бездействия. Большинство пользователей в результате записывают их где-нибудь на бумажк или в блокноте, что считается рискованной практикой. Третьи лица могут завладеть ими, и что может произойти дальше, вы догадываетесь не хуже меня. Менеджеры паролей помогают пользователям […]
Готовы рассматривать кандидатов на позицию “Head of sale team”. 🌐Киев Компания ИТ-интегратор в связи с расширением открывает вакансию «Менеджер по информационной безопасности»! ‼️Важно: • Опыт работы в продажах ИT решений и проектов корпоративным клиентам 2+ года • Успешно реализованные интеграционные проекты за последние 2 года • Знание техники продаж ИТ решений для корпоративного сегмента рынка […]
Что такое SQL-инъекция и как она влияет на безопасность? ITIGIC
Что такое SQL-инъекции?
Когда мы говорим об атаках SQL-инъекций, мы ссылаемся на метод, который использует ошибки которые существуют в веб-приложениях. В основном это уязвимости, которые позволяют потенциальному злоумышленнику внедрить вредоносный код для выполнения своих атак и поставить под угрозу безопасность и конфиденциальность пользователей.
Атака SQL-инъекции может быть направлена на компрометирующие веб-страницы или базы данных , Хакер может манипулировать, красть или удалять информацию и данные на этих скомпрометированных веб-сайтах или базах данных.
Как мы уже упоминали, SQL-инъекции основаны на существующие уязвимости , Вот почему крайне важно постоянно обновлять системы, устройства и любое программное обеспечение, которое мы используем. Таким образом, мы можем исправить ошибки безопасности, которые могут быть использованы третьими сторонами для проведения своих атак. Нам нужно всегда иметь последние патчи и обновления.
Например, киберпреступник мог вводить вредоносные запросы SQL в поле ввода сети. Таким образом, вы можете обмануть сайт, выполняя команды и получая доступ к его базе данных. Логически атака такого типа может сделать работу Интернета неадекватной. Это может повлиять на производительность. Тем не менее, это также влияет на конфиденциальность, крадя данные и информацию, изменяя или даже удаляя их.
Следует отметить, что он известен как атака с использованием SQL-инъекций для любого метода проникновения без различия возможных уязвимостей. Короче говоря, это любой момент, когда инвазивный код SQL вводится в законный. Это проблема компьютерной безопасности, которая может иметь шпионский характер.
Как избежать SQL-инъекций
Мы видели, что такое атака SQL-инъекцией и как она действует. Теперь мы собираемся дать серию советов, чтобы избежать их. Мы уже знаем, что безопасность является фундаментальным фактором, и мы всегда должны находить способы защиты наших устройств и систем. Вот почему важно помнить определенные рекомендации.
Имейте в виду, что в большинстве случаев внедрение SQL происходит на веб-сайтах. Поэтому он не влияет на устройства пользователей. Это делает меры безопасности необходимыми для тех, кто отвечает за эти страницы.
Важно, чтобы лица, ответственные за веб-сайты или веб-приложения, имели свои услуги. обновлено правильно , Крайне важно исправить возможные уязвимости и избежать доступа хакеров к контенту.
Также будет необходимо иметь средства безопасности , Они могут защитить нас от самых разных атак, таких как SQL-инъекция. Есть дополнения, которые мы можем добавить на наш сайт, чтобы избежать этой проблемы.
Короче говоря, атаки с использованием SQL-инъекций затрагивают приложения и веб-страницы. По сути, он состоит из введения вредоносного кода, который модифицирует легитимный код и который предназначен для кражи пользовательских данных и получения информации из них. Что касается частных пользователей, мы мало что можем сделать, чтобы защитить себя, поскольку это зависит главным образом от веб-страниц, которые должны защищать лица, ответственные за них.
Безопасность и конфиденциальность — очень важные факторы, и вы всегда должны заботиться о них. Это требует наличия определенных инструментов безопасности, которые мы можем использовать. Все это необходимо применять независимо от типа устройства или операционной системы, которые мы используем.
Что такое SQL Injection защита [АйТи бубен]
Внедрение операторов SQL (SQL Injection). Эти атаки направлены на Web- серверы, создающие SQL запросы к серверам СУБД на основе данных, вводимых пользователем.
Большинство серверов поддерживают язык SQL в вариантах, стандартизированных ISO и ANSI. В большинстве современных СУБД присутствуют расширения диалекта SQL, специфичные для данной реализации (PL/pgSQL в PostgreSQL, T-SQL в Microsoft SQL Server, PL SQL в Oracle и т.д.). Методы SQL Injection зависят от типа используемой СУБД. Например, SQL- инъекция на базе данных Oracle осуществляется в основном с помощью использования ключевого слово union, и она намного более трудна, чем на MS SQL- сервере, где можно выполнить множественные запросы, отделяя их символом точки с запятой. В заданной по умолчанию конфигурации MS SQL- сервер выполняется с привилегиями Local System и имеет расширенную процедуру «xp_shell», позволяющую выполнение команд операционной системы.
Многие Web- приложения используют данные, переданные пользователем, для создания динамических Web- страниц. Если информация, полученная от клиента, должным образом не верифицируется, атакующий получает возможность модифицировать запрос к SQL- серверу, отправляемый приложением. Запрос будет выполняться с тем же уровнем привилегий, с каким работает компонент приложения, выполняющий запрос (сервер СУБД, Web-сервер и т.д). В результате злоумышленник может получить полный контроль на сервером СУБД и даже его операционной системой. С точки зрения эксплуатации SQL Injection очень походит на LDAP Injection.
Предположим, аутентификация в Web- приложение осуществляется с помощью Web- формы, обрабатываемой следующим кодом:
SQLQuery = "SELECT Username FROM Users WHERE Username = '" & strUsername & "' AND Password = '" & strPassword & "'" strAuthCheck = GetQueryResult(SQLQuery)
В этом случае разработчики непосредственно использует переданные пользователями значения strUsername и strPassword для создания SQL- запроса. Предположим, злоумышленник передаст следующие значения параметров:
Login: ' OR ''=' Password: ' OR ''='
В результате серверу будет передан следующий SQL-запрос:
SELECT Username FROM Users WHERE Username = '' OR ''='' AND Password = '' OR ''=''
Вместо сравнения имени пользователя и пароля с записями в таблице Users, данный запрос сравнивает пустую строку с пустой строкой. Естественно, результат подобного запроса всегда будет равен True, и злоумышленник войдет в систему от имени первого пользователя в таблице.
Обычно выделяют два метода эксплуатации внедрения операторов SQL: обычная атака, и атака вслепую (Blind SQL Injection). В первом случае злоумышленник подбирает параметры запроса, используя информацию об ошибках, генерируемую Web- приложением.
Сервер генерирует сообщение, аналогичное следующему:
Microsoft OLE DB Provider for ODBC Drivers error '80040e14' [Microsoft][ODBC SQL Server Driver][SQL Server]All queries in an SQL statement containing a UNION operator must have an equal number of expressions in their target lists.
Из этого следует, что оператор union был передан серверу, и теперь злоумышленнику необходимо подобрать используемое в исходном выражении select количество параметров. Внедрение SQL кода вслепую. В этом случае стандартные сообщения об ошибках модифицированы, и сервер возвращает понятную для пользователя информацию о неправильном вводе. Осуществление SQL Injection может быть осуществлено и в этой ситуации, однако обнаружение уязвимости затруднено.
Наиболее распространенный метод проверки наличия проблемы – добавление выражений, возвращающих истинное и ложное значение.
Выполнение подобного запроса к серверу: http://example/article.asp?ID=2+and+1=1 должно вернуть ту же страницу, что и запрос: http://example/article.asp?ID=2 поскольку выражение ‘and 1=1’ всегда истинно.
Если в запрос добавляется выражение, возвращающее значение «ложь»: http://example/article.asp?ID=2+and+1=0 пользователю будет возвращено сообщение об ошибках или страница не будет сгенерирована. В случае если факт наличие уязвимости подтвержден, эксплуатация ничем не отличается от обычного варианта.
Кратко о SQL-инъекции и ее типам
Данные являются одной из наиболее ценных частей информационных систем. Почти каждая организация в этой отрасли использует своего рода веб-приложения на основе баз данных. Язык структурированных запросов или SQL используется для хранения, извлечения и обработки данных в базе данных.
Что такое SQL-инъекция?
SQL-инъекция используется для атаки на приложения, управляемые данными, путем вставки большого количества вредоносных операторов SQL в поле выполнения. Этот метод внедрения кода помогает хакерам уничтожить базу данных, как жизненно важную часть любой организации.
SQL-инъекция также является разновидностью хакерских атак, известных как инъекционные атаки или техника веб-хакерства. Эта атака вставляет вредоносный код в базу данных, вводя данные на веб-странице.
Хакеры могут легко пройти тесты безопасности и получить данные из базы данных SQL. Они также могут добавлять, изменять и удалять записи в базе данных.
База данных может быть любой из MySQL, SQL Server, Oracle, SQL Server и т.д. Атаки с использованием SQL-инъекций обычно работают с динамическими операторами SQL. Эти атаки также могут нанести вред всей системе, если она плохо спроектирована.
Если веб-сайт или приложение плохо спроектированы, эти атаки могут нанести вред всей системе.
Типы SQL-инъекций
SQL-инъекция на основе ошибок
В этом типе внедрения хакер анализирует различные операции и находит образец ошибки в базе данных. Затем он/она получает доступ к нему, чтобы взломать/повредить базу..
Классическая SQL-инъекция
В этом методе хакер использует результаты из базы данных и взламывает базу данных, чтобы добиться цели. Это также называется внутриполосной инъекцией SQL.
SQL-инъекция на основе объединения
Этот метод также является частью внутриполосного внедрения SQL. В этом методе пользователь объединяет запрос и возвращает результат как часть HTTP-ответа.
Инференциальная SQL-инъекция
Это один из самых опасных типов SQL-инъекций. Здесь хакеры не используют полосу для получения данных из базы данных. Они могут изменить структуру базы данных, наблюдая за моделями базы данных. Эта атака занимает больше времени.
Основанная на времени слепая инъекция SQL
Этот метод SQL-инъекции используется хакерами для размещения данных. Здесь хакер дает время базе данных для выполнения запроса. Это делает эту атаку медленной по своей природе.
Внеполосное внедрение SQL
Это не очень распространенная атака. Обычно она используется в ситуациях, когда хакеру нужно использовать разные каналы для атаки и получения результата. Эти методы зависят от способности сервера баз данных делать DNS или HTTP-запросы для доставки данных хакеру.
Просто помните, что создание базы данных является наиболее важным шагом. Если вы будете тщательно следовать стандартным правилам безопасности, вероятность потери данных будет значительно снижена.
Что такое SQL-инъекция
Инъекция SQL — это уязвимость веб-безопасности, которая позволяет злоумышленнику вмешиваться в запросы, выполняемые скриптом в базе данных сайта. Как правило, злоумышленник может просматривать данные, которые не видны обычному пользователю сайта. Это могут быть данные, например, принадлежащие другим пользователям веб-ресурса, или любые другие данные базы данных сайта. Во многих случаях злоумышленник может изменить или удалить эти данные, что приводит к сбою скрипта сайта или изменениям содержимого страниц сайта.
В некоторых ситуациях злоумышленник может усилить атаку с использованием SQL-инъекции, чтобы поставить под угрозу сервер базы данных или другую внутреннюю инфраструктуру, или выполнить атаку типа «отказ в обслуживании» (DoS).
Успешная атака с использованием SQL-инъекций может привести к несанкционированному доступу к конфиденциальным данным, таким как: пароли, данные банковских карт или личные данные пользователей веб-ресурса. За последнее время большинство утечек данных стали результатом именно атак с использованием SQL-инъекций, что приводит к нанесению ущерба и подрыву репутации компаний. В некоторых случаях злоумышленник может получить постоянный бэкдор в системы организации, что приведет к долгосрочному компромиссу, который может оставаться незамеченным в течение длительного периода времени.
Существует множество уязвимостей, атак и методов внедрения SQL-кода, используемых злоумышленниками в разных случаях.
Распространенные примеры внедрения SQL:
• Получение скрытых данных, где злоумышленник может изменить запрос SQL для получения дополнительных результатов данных;
• Подрыв логики работы скрипта веб-сайта, где злоумышленник может изменить запрос для нарушения работоспособности кода сайта;
• UNION-атаки, где злоумышленник может получить данные из таблицы базы данных, например, логин и пароль;
• Изучение базы данных, где злоумышленник может извлечь информацию о версии и структуре базы данных;
• Слепое внедрение SQL — это когда результаты запроса к базе данных не возвращают ответ для корректной работы скрипта сайта.
Большинство случаев внедрения SQL можно предотвратить с помощью параметризованных запросов (подготовленные выражения), используя их вместо конкатенации строк в запросе.
Параметризованные запросы могут использоваться в любых случаях, когда ненадежный ввод отображается как данные в запросе, включая WHERE-предложение и значения в операторе INSERT или UPDATE. Их нельзя использовать для обработки ненадежного ввода в других частях запроса, таких как имена таблиц и столбцов или ORDER BY. Функциональные возможности скрипта, которые помещают ненадежные данные в эти части запроса, должны будут использовать другой подход, например, использование разрешенных входных значений белого списка или использование другой логики для обеспечения требуемого результата.
Чтобы параметризованный запрос был эффективен для предотвращения внедрения SQL, строка, которая используется в запросе, всегда должна быть жестко закодированной константой и никогда не должна содержать никаких переменных данных из любого источника. Не поддавайтесь искушению решать в каждом конкретном случае, является ли элемент данных надежным, и продолжайте использовать конкатенацию строк в запросе для случаев, которые считаются безопасными. Слишком легко ошибиться в отношении возможного происхождения данных или вносить изменения в другой код, предположив, что данные испорчены.
ВСЕ СТАТЬИ
Что такое SQL-инъекция (SQLi) и как предотвратить атаки
SQL-инъекция (SQLi) — это тип атаки путем инъекции, которая позволяет выполнять вредоносные операторы SQL. Эти операторы управляют сервером базы данных за веб-приложением. Злоумышленники могут использовать уязвимости SQL Injection, чтобы обойти меры безопасности приложений. Они могут обходить аутентификацию и авторизацию веб-страницы или веб-приложения и извлекать содержимое всей базы данных SQL. Они также могут использовать SQL Injection для добавления, изменения и удаления записей в базе данных.
Уязвимость внедрения SQL-кода может затронуть любой веб-сайт или веб-приложение, использующее базу данных SQL, например MySQL, Oracle, SQL Server или другие. Преступники могут использовать его для получения несанкционированного доступа к вашим конфиденциальным данным: информации о клиентах, личным данным, коммерческой тайне, интеллектуальной собственности и т. Д. Атаки с использованием SQL-инъекций — одна из старейших, наиболее распространенных и самых опасных уязвимостей веб-приложений. Организация OWASP (Open Web Application Security Project) перечисляет инъекции в своем документе OWASP Top 10 2017 как угрозу номер один для безопасности веб-приложений.
Как и почему выполняется атака с использованием SQL-инъекции
Чтобы совершить атаку с использованием SQL-инъекции, злоумышленник должен сначала найти уязвимые вводимые пользователем данные на веб-странице или в веб-приложении. Веб-страница или веб-приложение, имеющее уязвимость SQL-инъекции, использует такой пользовательский ввод непосредственно в SQL-запросе. Злоумышленник может создавать входной контент. Такой контент часто называют вредоносной полезной нагрузкой и является ключевым элементом атаки. После того, как злоумышленник отправит это содержимое, в базе данных выполняются вредоносные команды SQL.
SQL — это язык запросов, который был разработан для управления данными, хранящимися в реляционных базах данных. Вы можете использовать его для доступа, изменения и удаления данных. Многие веб-приложения и веб-сайты хранят все данные в базах данных SQL. В некоторых случаях вы также можете использовать команды SQL для выполнения команд операционной системы. Следовательно, успешная атака с использованием SQL-инъекции может иметь очень серьезные последствия.
- Злоумышленники могут использовать SQL-инъекции для поиска учетных данных других пользователей в базе данных. Затем они могут выдавать себя за этих пользователей.Выдающийся пользователь может быть администратором базы данных со всеми привилегиями базы данных.
- SQL позволяет выбирать и выводить данные из базы данных. Уязвимость SQL-инъекции может позволить злоумышленнику получить полный доступ ко всем данным на сервере базы данных.
- SQL также позволяет изменять данные в базе данных и добавлять новые данные. Например, в финансовом приложении злоумышленник может использовать SQL-инъекцию для изменения балансов, аннулирования транзакций или перевода денег на свой счет.
- Вы можете использовать SQL для удаления записей из базы данных, даже для удаления таблиц.Даже если администратор создает резервные копии базы данных, удаление данных может повлиять на доступность приложения до тех пор, пока база данных не будет восстановлена. Кроме того, резервные копии могут не охватывать самые свежие данные.
- На некоторых серверах баз данных вы можете получить доступ к операционной системе с помощью сервера баз данных. Это может быть намеренно или случайно. В таком случае злоумышленник может использовать SQL-инъекцию в качестве исходного вектора, а затем атаковать внутреннюю сеть за брандмауэром.
Существует несколько типов атак SQL Injection: внутриполосный SQLi (с использованием ошибок базы данных или команд UNION), слепой SQLi и внеполосный SQLi.Вы можете узнать больше о них в следующих статьях: Типы SQL-инъекций (SQLi), Слепые SQL-инъекции: что это такое.
Чтобы шаг за шагом проследить, как выполняется атака с использованием SQL-инъекции и какие серьезные последствия она может иметь, см .: Использование SQL-инъекции: практический пример.
Пример простой SQL-инъекции
Первый пример очень простой. Он показывает, как злоумышленник может использовать уязвимость SQL Injection, чтобы обойти безопасность приложения и пройти аутентификацию в качестве администратора.
Следующий сценарий представляет собой псевдокод, выполняемый на веб-сервере. Это простой пример аутентификации с использованием имени пользователя и пароля. В примере базы данных есть таблица с именем пользователей
со следующими столбцами: имя пользователя
и пароль
.
# Определить переменные POST
uname = request.POST ['имя пользователя']
passwd = request.POST ['пароль']
# SQL-запрос уязвим для SQLi
sql = «ВЫБРАТЬ ИД ОТ пользователей ГДЕ username =’ »+ uname +« ’AND password =’ »+ passwd +« ’»
# Выполнить инструкцию SQL
база данных.выполнить (sql)
Эти поля ввода уязвимы для SQL-инъекции. Злоумышленник может использовать команды SQL во входных данных таким образом, чтобы изменить инструкцию SQL, выполняемую сервером базы данных. Например, они могут использовать трюк с одинарной кавычкой и установить в поле passwd
значение:
.
пароль 'ИЛИ 1 = 1
В результате сервер базы данных выполняет следующий SQL-запрос:
ВЫБЕРИТЕ идентификатор из пользователей, ГДЕ имя пользователя = 'имя пользователя' И пароль = 'пароль' ИЛИ 1 = 1 '
Из-за оператора OR 1 = 1
, предложение WHERE
возвращает первый id
из таблицы пользователей
независимо от имени пользователя
и пароля .Первый пользователь
id
в базе данных очень часто является администратором. Таким образом злоумышленник не только обходит аутентификацию, но и получает права администратора. Они также могут закомментировать остальную часть оператора SQL для дальнейшего управления выполнением запроса SQL:
- MySQL, MSSQL, Oracle, PostgreSQL, SQLite
'ИЛИ' 1 '=' 1 '–
'ИЛИ' 1 '=' 1 ' / *
- MySQL
'ИЛИ' 1 '=' 1 ' #
- Доступ (с использованием нулевых символов)
'ИЛИ' 1 '=' 1 '% 00
'ИЛИ' 1 '=' 1 '% 16
Пример внедрения SQL на основе объединения
Один из наиболее распространенных типов SQL-инъекций использует оператор UNION.Это позволяет злоумышленнику объединить результаты двух или более операторов SELECT в один результат. Техника называется union -based SQL Injection.
Ниже приведен пример этой техники. Он использует веб-страницу testphp.vulnweb.com , преднамеренно уязвимый веб-сайт, размещенный на Acunetix.
Следующий HTTP-запрос является обычным запросом, который отправляет законный пользователь:
ПОЛУЧИТЬ http://testphp.vulnweb.com/artists.php?artist= 1 HTTP / 1.1
Хост: testphp.vulnweb.com
Параметр Artist
уязвим для внедрения SQL. Следующая полезная нагрузка изменяет запрос для поиска несуществующей записи. Он устанавливает значение в строке запроса URL равным -1
. Конечно, это может быть любое другое значение, которого нет в базе данных. Однако отрицательное значение - хорошее предположение, потому что идентификатор в базе данных редко бывает отрицательным числом.
В SQL Injection оператор UNION
обычно используется для присоединения вредоносного SQL-запроса к исходному запросу, предназначенному для выполнения веб-приложением.Результат введенного запроса будет объединен с результатом исходного запроса. Это позволяет злоумышленнику получать значения столбцов из других таблиц.
ПОЛУЧИТЬ http://testphp.vulnweb.com/artists.php?artist= -1 UNION SELECT 1, 2, 3 HTTP / 1.1
Хост: testphp.vulnweb.com
В следующем примере показано, как можно использовать полезную нагрузку SQL Injection для получения более значимых данных с этого намеренно уязвимого сайта:
ПОЛУЧИТЬ http: // testphp.vulnweb.com/artists.php?artist= -1 UNION SELECT 1, pass, cc FROM users WHERE uname = 'test' HTTP / 1.1
Хост: testphp.vulnweb.com
Как предотвратить внедрение SQL
Единственный надежный способ предотвратить атаки SQL-инъекций - это проверка ввода и параметризованные запросы, включая подготовленные операторы. Код приложения никогда не должен использовать ввод напрямую. Разработчик должен очистить все входные данные, а не только входные данные веб-форм, такие как формы входа в систему. Они должны удалить элементы потенциально вредоносного кода, такие как одинарные кавычки.Также неплохо отключить отображение ошибок базы данных на рабочих сайтах. Ошибки базы данных можно использовать с SQL Injection для получения информации о вашей базе данных.
Если вы обнаружите уязвимость SQL-инъекции, например, с помощью сканирования Acunetix, возможно, вы не сможете исправить ее немедленно. Например, уязвимость может быть в открытом исходном коде. В таких случаях вы можете использовать брандмауэр веб-приложения для временной очистки вводимых данных.
Чтобы узнать, как предотвратить атаки SQL-инъекций на языке PHP, см. Предотвращение уязвимостей SQL-инъекций в приложениях PHP и их устранение.Чтобы узнать, как это сделать на многих других языках программирования, обратитесь к руководству Bobby Tables по предотвращению SQL-инъекций.
Как предотвратить SQL-инъекции (SQLi) - общие советы
Предотвратить уязвимости внедрения SQL-кода непросто. Конкретные методы предотвращения зависят от подтипа уязвимости SQLi, ядра базы данных SQL и языка программирования. Однако есть определенные общие стратегические принципы, которым вы должны следовать, чтобы обеспечить безопасность своего веб-приложения.
Шаг 1. Обучите и поддерживайте осведомленностьЧтобы обеспечить безопасность вашего веб-приложения, каждый, кто участвует в создании веб-приложения, должен знать о рисках, связанных с SQL-инъекциями. Вы должны предоставить подходящее обучение безопасности для всех своих разработчиков, сотрудников отдела контроля качества, DevOps и системных администраторов. Вы можете начать с ссылки на эту страницу. | |
Шаг 2. Не доверяйте никакому вводу пользователяСчитать все данные, вводимые пользователем, ненадежными.Любой пользовательский ввод, который используется в SQL-запросе, представляет риск SQL-инъекции. Обращайтесь с вводом от аутентифицированных и / или внутренних пользователей так же, как с общедоступным вводом. | |
Шаг 3. Используйте белые, а не черные спискиНе фильтровать вводимые пользователем данные по черным спискам. Умный злоумышленник почти всегда найдет способ обойти ваш черный список. Если возможно, проверяйте и фильтруйте вводимые пользователем данные, используя только строгие белые списки. | |
Шаг 4. Принятие новейших технологийСтарые технологии веб-разработки не имеют защиты SQLi.Используйте последнюю версию среды разработки и языка, а также новейшие технологии, связанные с этой средой / языком. Например, в PHP используйте PDO вместо MySQLi. | |
Шаг 5: Используйте проверенные механизмыНе пытайтесь создать защиту SQLi с нуля. Большинство современных технологий разработки могут предложить вам механизмы защиты от SQLi. Используйте такие механизмы вместо того, чтобы изобретать велосипед. Например, используйте параметризованные запросы или хранимые процедуры. | |
Шаг 6. Регулярное сканирование (с помощью Acunetix)SQL-инъекции могут быть введены вашими разработчиками или через внешние библиотеки / модули / программное обеспечение. Вам следует регулярно сканировать свои веб-приложения с помощью сканера веб-уязвимостей, такого как Acunetix. Если вы используете Jenkins, вам следует установить плагин Acunetix для автоматического сканирования каждой сборки. |
Дополнительная литература
Часто задаваемые вопросы
SQL Injection - это веб-уязвимость, вызванная ошибками программистов.Это позволяет злоумышленнику отправлять команды в базу данных, с которой взаимодействует веб-сайт или веб-приложение. Это, в свою очередь, позволяет злоумышленнику получать данные из базы данных или даже изменять их.
См. Пошаговый пример того, как происходят SQL-инъекции.
Единственный эффективный способ обнаружения SQL-инъекций - использование сканера уязвимостей, часто называемого инструментом DAST (динамическое тестирование безопасности приложений).Acunetix, как известно, является лидером в обнаружении SQL-инъекций и других уязвимостей. Acunetix может достичь того места, где другие сканеры не работают.
Узнайте, что Acunetix Premium может для вас сделать.
Лучший способ предотвратить SQL-инъекции - использовать безопасные программные функции, которые делают невозможными SQL-инъекции: параметризованные запросы (подготовленные операторы) и хранимые процедуры.В настоящее время каждый основной язык программирования имеет такие безопасные функции, и каждый разработчик должен использовать только такие безопасные функции для работы с базой данных.
Просмотрите библиотеку безопасных функций для всех языков программирования.
Что такое SQL-инъекция? Примеры атак и предотвращение
Насколько опасны SQL-инъекции?
В случае успешного выполнения SQL-инъекции могут нанести огромный ущерб любому бизнесу или отдельному человеку.После того, как конфиденциальные данные будут скомпрометированы в результате атаки, их полное восстановление может быть затруднено.
Базы данных обычно предназначены для внедрения через приложение (например, веб-сайт, который запрашивает ввод пользователя, а затем выполняет поиск в базе данных на основе этого ввода), но они также могут быть нацелены напрямую. Атаки с использованием SQL-инъекций включены в список 10 лучших рисков безопасности приложений OWASP, с которыми борются компании.
Типы атак с использованием SQL-инъекций
Атака
SQL-инъекцией может быть осуществлена несколькими способами.Злоумышленники могут наблюдать за поведением системы, прежде чем выбрать конкретный вектор / метод атаки.
Необработанный ввод
Необработанный ввод - это распространенный тип атаки SQLi, при котором злоумышленник предоставляет пользовательский ввод, который не очищен должным образом для символов, которые следует экранировать, и / или ввод не проверяется на соответствие типу, который является правильным / ожидаемым.
Например, веб-сайт, используемый для оплаты счетов в Интернете, может запросить номер учетной записи пользователя в веб-форме, а затем отправить его в базу данных, чтобы получить информацию о связанной учетной записи.Если веб-приложение динамически создает строку SQL-запроса с номером учетной записи, предоставленным пользователем, это может выглядеть примерно так:
« ВЫБРАТЬ * ОТ клиентов ГДЕ account =‘ «+ userProvidedAccountNumber +» ’;»
Хотя это работает для пользователей, которые правильно вводят номер своей учетной записи, это оставляет дверь открытой для злоумышленников. Например, если кто-то решил предоставить номер счета «‘ или ‘1’ = ‘1», это приведет к строке запроса:
« ВЫБРАТЬ * ОТ клиентов, ГДЕ account =‘ ’или‘ 1 ’=‘ 1 ’;»
Поскольку «1» = «1» всегда принимает значение ИСТИНА, отправка этого оператора в базу данных приведет к тому, что данные для будут возвращены для всех клиентов, а не только для одного клиента.
Слепая инъекция SQL
Также называемая Inferential SQL Injection, атака с слепым SQL-внедрением не раскрывает данные непосредственно из целевой базы данных. Напротив, злоумышленник внимательно изучает косвенные признаки поведения. Детали в HTTP-ответах, пустые веб-страницы для определенного пользовательского ввода и время, необходимое базе данных для ответа на определенный пользовательский ввод, - все это может быть подсказкой в зависимости от цели злоумышленника. Они также могут указать злоумышленнику на другой способ атаки SQLi.
Впрыск за пределами диапазона
Эта атака немного более сложна и может использоваться злоумышленником, когда он не может достичь своей цели с помощью единственной прямой атаки типа запрос-ответ. Как правило, злоумышленник создает операторы SQL, которые при представлении в базе данных запускают систему базы данных для создания соединения с внешним сервером, управляемым злоумышленником. Таким образом злоумышленник может собирать данные или потенциально контролировать поведение базы данных.
Инъекция второго порядка - это тип атаки внеполосной инъекции.В этом случае злоумышленник предоставит SQL-инъекцию, которая будет сохранена и выполнена отдельным поведением системы базы данных. Когда происходит вторичное поведение системы (это может быть что-то вроде задания, основанного на времени или что-то, инициированное другим типичным администратором или пользователем базы данных) и выполняется SQL-инъекция злоумышленника, тогда «протянуть руку» к системе, происходит контроль злоумышленника.
Пример внедрения SQL
Для этого примера внедрения SQL воспользуемся двумя таблицами базы данных: «Пользователи» и «Контакты».Таблица Users может быть такой же простой, как и всего три поля: ID, имя пользователя и пароль. В таблице «Контакты» содержится дополнительная информация о пользователях, такая как UserID, FirstName, LastName, Address1, Email, номер кредитной карты и защитный код.
Таблица Users содержит информацию, используемую для входа в систему, например:
- jsmith, P @ $$ w0rd
- sbrown, WinterIsComing!
- kcharles, Sup3rSecur3Password $
Примечание. Пароли всегда должны хешироваться и обрабатываться при хранении в базе данных, а не в виде открытого текста.
Когда кто-то хочет войти в систему, он переходит на страницу входа и вводит свое имя пользователя и пароль. Затем эта информация отправляется на веб-сервер, который создает запрос SQL и отправляет этот запрос на сервер базы данных. Пример того, как выглядит этот запрос, может быть:
Выберите идентификатор среди пользователей, где имя пользователя = ’jsmith’ и пароль = ’P @ $$ w0rd’
Принцип работы SQL заключается в том, что он затем выполняет сравнение "истина" или "ложь" для каждой строки, запрашиваемой запросом.В нашем примере запрос требует проверить таблицу Users и вернуть значение идентификатора для каждой строки, где имя пользователя - jsmith, а пароль - P @ $$ w0rd. Часто веб-сервер затем видит, что возвращает сервер базы данных, и является ли это числом. В нашем случае веб-сервер получит в ответ 1 и позволит пользователю пройти страницу входа в систему.
Но что, если мы хотим этим подстегнуть? Поскольку сервер базы данных выполняет эту проверку истинности или ложности, мы можем обманом заставить его поверить в то, что мы успешно прошли аутентификацию.Мы можем сделать это, добавив к паролю ИЛИ. Если мы войдем в систему с паролем x ’или 1 = 1, будет создан новый SQL-запрос, который будет выглядеть так:
Выберите идентификатор среди пользователей, где имя пользователя = ’jsmith’ и пароль = ’x’ или 1 = 1
Это сработает для нас, потому что, хотя x не является паролем jsmith, сервер базы данных затем проверит второе условие. Если x не является паролем jsmith, тогда 1 равно 1? Оно делает! Идентификатор будет отправлен обратно в приложение, и пользователь будет успешно аутентифицирован.
Это не обязательно должно быть условие 1 = 1. Подойдут любые два равных значения: 2 = 2, 4726 = 4726 или даже a = a.
Если веб-страница способна отображать данные, также можно распечатать дополнительные данные на экране. Чтобы получить доступ к данным, мы можем попытаться связать два запроса SQL. В дополнение к нашему «или 1 = 1» мы можем добавить к нему второй оператор, такой как UNION SELECT LastName, номер кредитной карты, защитный код из контактов. Подобные дополнительные предложения могут потребовать дополнительной работы, но получение доступа к данным является конечной целью атаки с использованием SQL-инъекции.
Другой метод, который мы можем использовать для слепой инъекции SQL, при котором данные не отправляются обратно на экран, - это вводить другие подсказки. Подобно нашему условию «или 1 = 1», мы можем указать серверу спать. Мы могли бы добавить: «or sleep (10)», и это будет делать то, что кажется. Он скажет серверу базы данных вздремнуть 10 секунд, и все ответы будут отложены.
Как предотвратить атаки с использованием SQL-инъекций
Следующие предложения могут помочь предотвратить успешную атаку с использованием SQL-инъекции:
Не использовать динамический SQL
Очистить вводимые пользователем данные
- Правильно экранируйте те символы, которые нужно экранировать.
- Убедитесь, что тип представленных данных соответствует ожидаемому типу.
Не оставляйте конфиденциальные данные в виде открытого текста
- Шифровать личные / конфиденциальные данные, хранящиеся в базе данных.
- Соль зашифрованные хэши.
- Это также обеспечивает еще один уровень защиты на случай, если злоумышленник успешно извлечет конфиденциальные данные.
Ограничить разрешения и привилегии базы данных
- Установите возможности пользователя базы данных до минимально необходимого.
- Это ограничит действия злоумышленника, если ему удастся получить доступ.
Избегайте отображения ошибок базы данных непосредственно пользователю
- Злоумышленники могут использовать эти сообщения об ошибках для получения информации о базе данных.
Используйте брандмауэр веб-приложений (WAF) для веб-приложений, которые обращаются к базам данных
- Обеспечивает защиту веб-приложений.
- Это может помочь идентифицировать попытки SQL-инъекции.
- В зависимости от настройки это также может помочь предотвратить попытки внедрения SQL-кода в приложение (и, следовательно, в базу данных).
Используйте решение для тестирования безопасности веб-приложений для регулярного тестирования веб-приложений, взаимодействующих с базами данных
- Это может помочь выявить новые ошибки или регрессии, которые могут привести к SQL-инъекции.
Обновлять базы данных до последних доступных исправлений
- Это предотвращает использование злоумышленниками известных слабых мест / ошибок, имеющихся в старых версиях.
SQL-инъекция - популярный метод атаки для злоумышленников, но, приняв надлежащие меры предосторожности, такие как обеспечение шифрования данных, защита и тестирование веб-приложений и наличие обновленных исправлений, вы можете предпринять важные шаги. для обеспечения безопасности ваших данных.
SQL-инъекция - определение
SQL-инъекция , также известная как вставка, представляет собой вредоносный метод, который использует уязвимости в прикладном программном обеспечении на основе SQL целевого веб-сайта путем внедрения вредоносных операторов SQL или использования неверного ввода.В 2013 году проект Open Web Application Security Project [OWASP] назвал инъекцию наиболее распространенной угрозой для уязвимых веб-приложений.
SQL-инъекция - один из наиболее распространенных методов внедрения кода, используемых злоумышленниками для атаки на веб-сайты. После взлома веб-сайта злоумышленники пытаются получить root-доступ к серверу, что позволяет им собирать информацию, а также получать доступ к базам данных и другим устройствам в сети.
В марте 2011 года SQL-инъекция использовалась для взлома множества веб-сайтов и внедрения вредоносного сценария, который запускает перенаправления на определенные URL-адреса, ведущие к вредоносным программам, таким как FAKEAV.
Разница при межсайтовом скриптинге
Хотя обе уязвимости могут быть вызваны вредоносным кодом или данными, отправленными пользователями и администраторами веб-сайта / приложения, они различаются по степени воздействия. CSS / XSS обычно вызывают сбои на стороне клиента или посетителя и могут использоваться для перехвата сеансов, деактивации веб-сайтов, загрузки вредоносного контента и перенаправления URL-адресов. С другой стороны, инъекции серьезно влияют на серверную часть и могут привести к потере данных и другим последствиям.
Как предотвратить атаки с использованием SQL-инъекций
Видео: Trend Micro Tech-TV: демонстрация и предотвращение эксплойтов внедрения SQL
Связанные термины: межсайтовый скриптинг (CSS / XSS), искажение веб-сайтов, уязвимости, эксплойт
Для предприятий:
- Используйте инструменты тестирования, чтобы убедиться, что развернутые коды безопасны.Предприятия и организации могут вкладывать средства в инструменты тестирования, такие как сканеры веб-приложений, сканеры уязвимостей и статические анализаторы кода. Эти инструменты помогают ИТ-командам тестировать и оценивать коды до, во время и после развертывания.
- Рассмотрите возможность использования брандмауэров веб-приложений. Они обеспечивают защиту брандмауэра на уровне веб-приложений.
- Практикуйтесь в безопасном кодировании. Компании, у которых есть веб-сайты, должны использовать и внедрять стандарты безопасного кодирования. Open Web Application Security Project (OWASP) - это некоммерческая организация, которая помогает веб-разработчикам, администраторам и владельцам практиковать безопасное кодирование через отзывы сообщества.
- Подключите системы и сети соответственно. ИТ-администраторам следует проявлять особую осторожность, чтобы убедиться, что ВСЕ системы в сети исправлены, потому что одна система без исправлений может привести к катастрофе. Это предотвращает использование злоумышленниками уязвимостей в незащищенном / устаревшем программном обеспечении.
- Сканировать веб-приложения на наличие уязвимостей: предприятиям необходимо проверять свои веб-приложения на наличие уязвимостей, поскольку они могут привести к атакам с использованием SQL-инъекций и межсайтовых сценариев.
Ссылки:
https: // www.owasp.org/index.php/Top_10_2013-A1-Injection
http://blog.trendmicro.com/trendlabs-security-intelligence/lizamoon-etc-sql-injection-attack-still-on-going/
Продукты: Trend Micro ™ Deep Security ™ и защита от уязвимостей, Trend Micro ™ Deep Discovery ™
Что такое SQL-инъекция и как ее предотвратить?
SQL-инъекция - это тип кибератаки, при которой хакер использует фрагмент кода SQL (язык структурированных запросов) для управления базой данных и получения доступа к потенциально ценной информации.
Это один из наиболее распространенных и опасных типов атак, поскольку он потенциально может быть использован против любого веб-приложения или веб-сайта, использующего базу данных на основе SQL.
Основные примеры включают заметные атаки на Sony Pictures и Microsoft среди других.
Как работает SQL-инъекция?
В стандартной практике программного обеспечения SQL-запрос - это, по сути, запрос, отправляемый в базу данных - компьютеризированное хранилище информации - для выполнения некоторого типа деятельности или функции, например запроса данных или выполнения кода SQL.
Одним из таких примеров является отправка информации для входа в систему через веб-форму, чтобы пользователь мог получить доступ к сайту.
Обычно этот тип веб-формы предназначен для приема только очень определенных типов данных, таких как имя и / или пароль. Когда эта информация добавляется, она сверяется с базой данных, и если она совпадает, пользователю предоставляется запись. В противном случае им отказано в доступе.
Возможные проблемы возникают из-за того, что большинство веб-форм не имеют возможности предотвратить ввод дополнительной информации в формы.Хакеры могут воспользоваться этой уязвимостью и использовать поля ввода в форме для отправки собственных запросов в базу данных. Это потенциально может позволить им выполнять ряд гнусных действий, от кражи конфиденциальных данных до манипулирования информацией в базе данных в своих собственных целях.
Растущая проблема
Из-за большого количества веб-сайтов и серверов, использующих базы данных, метод атаки с использованием SQL-инъекции является одним из старейших и наиболее распространенных типов кибератак.
Некоторые разработки в хакерском сообществе увеличили риск этого типа атак, в первую очередь появление программ автоматизированного внедрения SQL.
Бесплатные программы для автоматизированного внедрения SQL-кода, доступные у разработчиков с открытым исходным кодом, позволяют злоумышленникам автоматически выполнять атаки всего за несколько минут, предоставляя им доступ к любой таблице или любому столбцу в базе данных одним щелчком мыши и атакой.
Предотвращение
Есть несколько способов предотвратить эти типы атак, в том числе с помощью брандмауэра веб-приложений, такого как брандмауэры, имеющиеся в различных решениях Kaspersky Security.Еще одна превентивная мера - создать несколько учетных записей пользователей базы данных, чтобы только определенные и доверенные лица могли получить доступ к базе данных.
Связанные статьи:
Связанные продукты:
Что такое SQL-инъекция?
Kaspersky
SQL-инъекция - это тип кибератаки, при которой хакер использует фрагмент кода SQL (язык структурированных запросов) для управления базой данных и получения доступа к потенциально ценной информации.
что это такое и как это предотвратить
SQL-инъекция - это атака системы безопасности, которая настолько же опасна, насколько и изобретательна.Злоупотребляя механизмами ввода данных приложения, злоумышленник может манипулировать сгенерированным SQL-запросом в своих интересах, что может вызвать катастрофические события.
Многие сегодня считают, что SQL-инъекции остались в прошлом. По правде говоря, они совсем другие. Например, 70% попыток использования уязвимостей в приложениях Rails, проанализированных в отчете Sqreen о состоянии безопасности приложений, были инъекциями SQL. Этот вывод показывает, что даже надежная среда, такая как Ruby on Rails, которая считается проверенной и надежной ORM в форме Active Record, не является серебряной пулей, когда дело доходит до SQL-инъекций.SQL-инъекция по-прежнему находится на вершине списка наиболее распространенных угроз безопасности веб-приложений и существует уже довольно давно.
Что же тогда организации должны делать, чтобы избежать этой проблемы? Образование - ключ к успеху. И вот о чем этот пост: рассказать людям не только о том, что такое SQL-инъекции и как они работают, но, что наиболее важно, как их избежать. Давайте копаться.
Что, почему и как используют SQL-инъекции
Прежде чем научиться эффективно защищать свой код от SQL-инъекций, вы должны понять, как они работают и какую угрозу они представляют.Давайте посмотрим на это сейчас.
Что такое SQL-инъекция?
SQL-инъекция - это угроза безопасности, которая позволяет злоумышленнику манипулировать SQL-запросами, которые приложение отправляет в базу данных. Таким образом, злоумышленник может получить доступ к данным, которые он не имеет права просматривать, например к данным других пользователей. Еще хуже сценарий, в котором злоумышленник может получить права записи в базу данных. Затем они могут обновить или удалить данные, что приведет к серьезному и длительному ущербу.
Почему SQL-инъекции так опасны?
Кто-то может подумать, что SQL-инъекция действительно опасна только тогда, когда злоумышленник получает права записи в базу данных.
Это далеко не так.
Злоумышленник, который читает несанкционированную информацию в одиночку, может доставить вам много головной боли. Злоумышленник может получить доступ и раскрыть конфиденциальные данные, такие как финансовые данные и личная информация. Такая утечка не только запятнает репутацию вашей организации, но и приведет к последствиям для ваших пользователей / клиентов, поскольку данные распространяются и продаются. Это также может вызвать проблемы с правилами конфиденциальности, такими как GDPR в Европе или CCPA в Калифорнии, что может привести к серьезным юридическим и финансовым последствиям.
Как работают атаки с использованием SQL-инъекций?
Большинство приложений позволяют пользователям каким-либо образом вводить данные, и веб-приложения не исключение. Злоумышленники могут злоупотреблять этими механизмами ввода данных, мешая генерации SQL-запросов.
То, что я называю «механизмами ввода данных», - это способы, которыми пользователи вводят данные в приложение. В большинстве случаев это будут поля формы и параметры URL. Правильно воздействуя на эти элементы, злоумышленники могут вводить - отсюда и название - дополнительные команды SQL, которые будут выполняться.
Пример SQL-инъекции
Представьте себе сайт агентства недвижимости. Зайдя на сайт, вы можете искать различные типы недвижимости и фильтровать их по «аренде» или «покупке». Типичный материал. После выбора параметров поиска и нажатия кнопки «Поиск» выбранные параметры будут добавлены как параметры URL. Итак, допустим, вы ищете квартиру. Ваш URL-адрес будет выглядеть примерно так:
https://fakerealestate.com/properties?category=Apartments
И результирующий SQL-запрос, который будет отправлен в базу данных, будет примерно таким:
ВЫБРАТЬ * ИЗ свойств ГДЕ категория = 'Квартиры'
Запрос выше довольно прост.Мы хотим получить строки из таблицы properties , в которых значение столбца category равно Apartments.
Допустим, этот сайт уязвим для инъекций SQL. Посмотрим, что произойдет, если кто-то изменит URL-адрес на этот:
https://fakerealestate.com/properties?category=Apartments’+OR+1=1–
Это приведет к следующему запросу:
ВЫБРАТЬ * ИЗ свойств ГДЕ категория = «Квартиры» ИЛИ 1 = 1
Поскольку один всегда равен единице, приведенный выше запрос успешно запрашивает у базы данных свойства из всех категорий.Это безобидный пример, но общий способ работы тот же: злоумышленник хочет завершить законный запрос и ввести после него дополнительные команды, чтобы получить доступ к чему-то, к чему он не должен иметь доступа, например, список всех пользователей и паролей.
Защита вашего кода от SQL-инъекций
Самый важный аспект блокирования SQL-инъекций можно резюмировать одним предложением: Всегда предполагайте, что ввод данных пользователем небезопасен. Под пользовательским вводом я на самом деле подразумеваю любую информацию, поступающую извне вашего приложения, которую само приложение не поместило туда.
Итак, не доверяйте данным сторонних систем, которые импортирует ваше приложение. Кроме того, следует автоматически не доверять любому типу данных, предоставленных пользователем, например, полям формы, параметрам URL или файлам, предоставленным пользователем. Данные из API-интерфейсов, которые использует ваше приложение, также входят в этот список. Эти примеры далеко не исчерпывающие, но действует то же правило: считайте ввод данных пользователем небезопасным по умолчанию.Сначала проверьте его и продолжайте только тогда, когда сочтете это безопасным.
Этот совет может показаться общим советом по безопасности, применимым к множеству различных сценариев. Как вы примените его конкретно к проблеме SQL-инъекций? Вот на что мы сейчас и посмотрим.
Нанять ORM
Один из способов избежать написания SQL-запросов, уязвимых для эксплойтов, - это вообще не писать SQL-запросы! В настоящее время большинство языков рассчитаны на мощные и гибкие инфраструктуры ORM (объектно-реляционного сопоставления), которые берут на себя всю тяжелую работу, связанную с базами данных.
Однако, как мы упоминали ранее, ORM - далеко не серебряная пуля против SQL-инъекций. Как вы помните, большинство эксплойтов безопасности Rails - это инъекции SQL, несмотря на Active Record. И они также представляют свои собственные проблемы безопасности в виде ошибок, больших поверхностей API, которые могут сбить с толку пользователей, или других проблем.
Использовать параметризованные запросы
Когда вам действительно нужно создавать SQL-запросы, включающие данные, введенные пользователями, вы должны делать это безопасно.К счастью, большинство языков программирования предлагают способы создания параметризованных запросов. Как следует из названия, параметризованные запросы - это запросы, которые вы готовите с помощью шаблона. Этот подготовленный запрос содержит параметры, которые затем можно связать со значениями, указанными пользователем.
Таким образом вы избегаете конкатенации строк, а «уловка», заключающаяся в предоставлении одинарной кавычки для закрытия оператора, не сработает, что приведет только к недопустимому SQL.
Анализ кода
Инструменты анализа кода
, также называемые линтерами, - это инструменты, которые анализируют исходный код и предоставляют рекомендации, касающиеся, среди прочего, передовых практик, соблюдения стандартов кодирования и правил форматирования.Они также могут определять антишаблоны и возможные проблемы с безопасностью.
К счастью, большинство основных языков программирования работают с линтером. В Ruby у вас есть такие инструменты, как Rubocop и Brakeman, среди многих других. Разработчики Python могут рассчитывать на Pylint, который, несмотря на то, что он не является явным инструментом безопасности, может обнаруживать проблемы кода, которые могут привести к проблемам с безопасностью.
Выполнить с наименьшими возможными привилегиями
Этот совет отличается от предыдущих. Здесь мы ненадолго оставим сферу языков программирования.Вместо этого мы займемся базой данных. Этот совет не столько об избежании SQL-инъекций, сколько о смягчении их последствий, если они произойдут.
Сама идея проста: в областях, где вы просто читаете данные, не используйте строки подключения, в которых пользователь имеет права записи. Таким образом, даже если злоумышленнику удастся ввести вредоносный запрос, он не сможет вставить, изменить или удалить какие-либо данные.
Короче говоря, всегда выполняйте вещи с наименьшими привилегиями, которые вам могут сойти с рук.
Безопасность - это сложно; не усложняй
Обеспечить безопасность сложно. Ошибка имеет ужасные последствия. В этом посте мы говорили о SQL-инъекции, старой угрозе безопасности, которая отказывается умирать. На протяжении этого введения в тему мы объяснили, что такое SQL-инъекции, объяснили, почему они так опасны, и обрисовали в общих чертах простые шаги, которые можно предпринять, чтобы их избежать.
Защита вашего кода имеет большое значение для предотвращения SQL-инъекций и других уязвимостей, но невозможно уловить все.Вот почему такие производственные решения, как RASP, были рекомендованы такими организациями, как NIST.
Внедрение решения для мониторинга и защиты в производственной среде, такого как Sqreen, позволяет обнаруживать и блокировать SQL-инъекции в реальном времени. Благодаря пяти-минутной установке на основе агентов Sqreen позволяет вам в мгновение ока получить видимость безопасности в ваших производственных приложениях и защитить их. Попробуйте сами или запросите демонстрацию.
Спасибо, что прочитали, и до следующего раза.
Этот пост написал Карлос Шульц. Карлос - разработчик программного обеспечения .NET с опытом разработки как для настольных компьютеров, так и для веб-разработки, а сейчас он пробует свои силы в мобильной разработке. Он страстно любит писать чистый и лаконичный код, и его интересуют методы, которые помогут вам улучшить работоспособность приложений, такие как проверка кода, автоматическое тестирование и непрерывная сборка.
Что такое SQL-инъекция и как она работает?
Независимо от пользовательского ввода, переменные времени выполнения имя и проход не могут повлиять на поведение запроса.Обратите внимание, что использование только объекта PreparedStatement не является хорошей защитой. Он должен использоваться вместе с функцией параметризации («?») Для всех элементов среды выполнения. Без функции параметризации конкатенация строк приводит к SQL-инъекции, даже при наличии объекта PreparedStatement .
Хранимые процедуры . Хранимые процедуры - это операторы SQL, определенные и сохраненные в самой базе данных, а затем вызываемые из приложения.От разработчиков обычно требуется только строить операторы SQL с параметрами, которые автоматически параметризуются. Однако разработчик может генерировать динамические SQL-запросы внутри хранимых процедур. Безопасно реализуйте хранимые процедуры, избегая динамической генерации SQL внутри.
Проверка ввода . Распространенным источником SQL-инъекций является злонамеренно созданный внешний ввод. Таким образом, всегда рекомендуется принимать только одобренные входные данные - подход, известный как проверка входных данных.Для защиты от него существует два варианта проверки ввода: проверка черного списка и проверка белого списка.
Проверка черного списка проверяет внешний вход на набор известных вредоносных входов. Приложение составляет список всех вредоносных входных данных, а затем проверяет внешние входные данные на соответствие скомпилированному списку. Следовательно, злоумышленнику легко обойти проверку черного списка, поскольку он может предложить несколько вариантов злонамеренного ввода, которые могут не входить в состав черного списка.
Внесение
в белый список - гораздо лучший подход к снижению риска. Проверка белого списка проверяет внешние входные данные по набору известных утвержденных входных данных. При проверке входных данных в белом списке приложение точно знает, что требуется, и отклоняет другие входные значения, которые не прошли проверку на известные одобренные входные данные.
Принцип минимальных привилегий . Это стандартный контроль безопасности, который помогает минимизировать потенциальный ущерб от успешной атаки. Учетные записи приложений не должны назначать доступ типа DBA или администратора к серверу базы данных.Кроме того, в зависимости от требований доступа, они должны быть ограничены доступом с минимальными привилегиями. Например, учетным записям, которым требуется только доступ для чтения, предоставляется доступ только для чтения к таблице, к которой они должны получить доступ. Это гарантирует, что в случае взлома приложения злоумышленник не получит прав на базу данных через скомпрометированное приложение.
Что такое SQL-инъекция? Как работают эти атаки и как их предотвратить
Увековеченный «Маленькими таблицами Бобби» в XKCD 327, SQL-инъекция (SQLi) была впервые обнаружена в 1998 году, но продолжает преследовать веб-приложения по всему Интернету.Даже в первой десятке OWASP инъекция названа угрозой номер один для безопасности веб-приложений.
Определение SQL-инъекции
SQL-инъекция - это тип атаки, который может дать злоумышленнику полный контроль над базой данных вашего веб-приложения путем вставки произвольного кода SQL в запрос базы данных.
Хорошие новости? SQL-инъекция - это самый низкий фрукт как для злоумышленников, так и для защитников. Это не какой-то передовой комплект NSA Shadow Brokers, это настолько просто, что это может сделать трехлетний ребенок.Это детские скрипты, и исправить ваше веб-приложение так, чтобы снизить риск SQL-инъекции, настолько просто, что отказ от этого все больше и больше похож на грубую халатность.
Атаки с использованием SQL-инъекций
Существует несколько типов SQL-инъекций, но все они включают в себя злоумышленник, вставляющий произвольный SQL-код в запрос базы данных веб-приложения. Самая простая форма SQL-инъекции - ввод данных пользователем. Веб-приложения обычно принимают вводимые пользователем данные через форму, а интерфейсная часть передает вводимые пользователем данные в серверную базу данных для обработки.Если веб-приложению не удается очистить ввод пользователя, злоумышленник может ввести SQL по своему выбору в серверную базу данных и удалить, скопировать или изменить содержимое базы данных.
Злоумышленник также может изменить файлы cookie, чтобы отравить запрос к базе данных веб-приложения. Файлы cookie хранят информацию о состоянии клиента локально, а веб-приложения обычно загружают файлы cookie и обрабатывают эту информацию. Злоумышленник или вредоносная программа могут изменять файлы cookie, чтобы внедрить SQL в серверную базу данных.
Переменные сервера, такие как заголовки HTTP, также могут использоваться в качестве вектора атаки SQL-инъекции.Подделанные заголовки, содержащие произвольный SQL, могут внедрить этот код в базу данных, если веб-приложение также не может очистить эти входные данные.
Атаки с использованием SQL-инъекций второго порядка - самые хитрые из всех, потому что они предназначены не для немедленного запуска, а для выполнения гораздо позже. Разработчик, который правильно дезинфицирует все свои входные данные от немедленной атаки, может по-прежнему быть уязвим для SQLi второго порядка, когда зараженные данные используются в другом контексте.
Инструменты SQL-инъекции
SQL-инъекция как метод старше, чем многие злоумышленники, использующие их сегодня; атаки рудиментарны и давно автоматизированы.Такие инструменты, как SQLninja, SQLmap и Havij, упрощают тестирование ваших собственных веб-приложений, но также упрощают задачу для злоумышленников.
Десять лет назад в Интернете бушевал червь SQL-инъекций. К настоящему моменту: мало что изменилось. Несмотря на широкое признание проблемы внедрения SQL-кода, большой процент веб-приложений остается уязвимым.
Инструменты автоматического тестирования помогут вам быть на шаг впереди злоумышленников, ищущих легкого заработка. Пентестирование ваших веб-приложений с помощью такого инструмента, как SQLmap, - это быстрый способ увидеть, адекватны ли ваши меры по снижению рисков.SQLmap поддерживает практически все основные базы данных, которые используются сегодня, и может обнаруживать и использовать наиболее известные уязвимости SQL-инъекций.
Очистите входные данные, но протестируйте их, чтобы убедиться, что меры по снижению рисков успешны. Полезное напоминание: синяя и красная команды - две стороны одной медали.
Пример SQL-инъекции
Давайте посмотрим на базовую атаку SQL-инъекции. Предположим, вы создали веб-приложение, которое позволяет клиентам вводить свои идентификаторы клиентов и получать их профили клиентов.Внешний интерфейс веб-приложения передает введенный пользователем идентификатор клиента в серверную базу данных. База данных выполняет SQL-запрос и возвращает результаты в веб-приложение, которое отображает результаты для конечного пользователя.
Запрос к внутренней базе данных может выглядеть примерно так:
SELECT *
FROM customers
WHERE customer_id = '1234567'
Предположим, пользователь ввел следующий идентификатор клиента в поле веб-формы:
1234567; УДАЛИТЬ * клиентов WHERE '1' = '1
Затем внутренняя база данных послушно выполнит следующий SQL:
SELECT *
FROM customers
WHERE customer_id =' 1234567 ';
УДАЛИТЬ *
ОТ клиентов
WHERE 'x' = 'x'
Помните, базы данных с радостью выполнят несколько операторов SQL подряд, если они разделены точкой с запятой.Неспособность очистить ввод пользователя для символа одиночной кавычки «'» позволяет злоумышленнику удалить всю таблицу. Надеюсь, у вас были хорошие резервные копии. Верно? Верно...?
Это был нарочито простой пример, и существует множество различных векторов атак с использованием SQL-инъекций, но все они работают по одному и тому же принципу: неспособность веб-приложения очистить вводимые данные приводит к удаленному выполнению кода SQL.
Как обнаруживать атаки SQL-инъекций
Устранить атаки SQL-инъекций несложно, но даже самые умные разработчики с лучшими намерениями все равно совершают ошибки.Таким образом, обнаружение является важным компонентом снижения риска атаки с использованием SQL-инъекции. Брандмауэр веб-приложений (WAF) может обнаруживать и блокировать базовые атаки SQL-инъекций, но вы не должны полагаться на него как на единственную превентивную меру.
Системы обнаружения вторжений (IDS), как сетевые, так и основанные на хосте, могут быть настроены для обнаружения атак с использованием SQL-инъекций. Сетевые IDS могут отслеживать все подключения к серверу базы данных и отмечать подозрительную активность. IDS на основе хоста может отслеживать журналы веб-сервера и предупреждать, когда происходит что-то странное.
В конечном счете, однако, атаки с использованием SQL-инъекций хорошо понятны и легко предотвратимы, и приоритетом для снижения риска должно быть, в первую очередь, предотвращение атак с использованием SQL-инъекций.
Как предотвратить атаки SQL-инъекций
Слушайте Little Bobby Tables и очищайте входные данные вашей базы данных. Любой ввод в базу данных вашего веб-приложения следует считать ненадежным и обращаться с ним соответствующим образом. И послушайте хороших людей из OWASP, когда они скажут вам: «Несколько стыдно, что происходит так много успешных атак с использованием SQL-инъекций, потому что ЧРЕЗВЫЧАЙНО просто избежать уязвимостей SQL-инъекций в вашем коде."[их акцент]
Шпаргалка по OWASP SQL-инъекциям углубляется глубже, чем мы когда-либо могли бы здесь, но для предотвращения атак с SQL-инъекциями, OWASP сообщает нам, разработчики должны занести в белый список проверку ввода (а не в черный список), чтобы использовать подготовленные операторы с параметризованными запросами , и чтобы избежать всех вводимых пользователем данных.
Также ограничьте привилегии учетной записи. Предположите нарушение. Что делать, если разработчику не удается очистить одно поле ввода пользователя? Эй, это случается. Разработчики - всего лишь люди. Очистите ввод, но предположите, что что-то собираюсь проскользнуть мимо вас.Ограничьте права учетной записи пользователя базы данных. Например, ваше веб-приложение доступно только для чтения? Нужны ли ему привилегии DROP TABLES? Возможно нет. Здесь действует принцип наименьших привилегий. Предоставьте веб-приложению минимальные права, необходимые для его запуска.
Хранимые процедуры также могут значительно усложнить SQLi, хотя и не невозможно. Если вашему веб-приложению необходимо выполнить только несколько SQL-запросов, создайте хранимые процедуры для выполнения этих запросов. Обычно только администратор базы данных имеет права на создание или изменение хранимых процедур.Однако имейте в виду, что многие базы данных поставляются с хранимыми процедурами по умолчанию из коробки, и злоумышленники это знают.