Есть ли какой-нибудь способ внедрить SQL, даже если символ ' удален?

StackOverflow https://stackoverflow.com/questions/71756

  •  09-06-2019
  •  | 
  •  

Вопрос

Если из SQL-запроса я удаляю все символы ', есть ли какой-нибудь другой способ выполнить атаку SQL-инъекцией на базу данных?

Как это можно сделать?Кто-нибудь может привести мне примеры?

Это было полезно?

Решение

Да, это так.Отрывок из Википедия

"SELECT * FROM data WHERE id = " + a_variable + ";"

Из этого утверждения ясно, что автор предполагал, что a_variable - это число, соответствующее полю "id".Однако, если это на самом деле строка, то конечный пользователь может манипулировать оператором по своему усмотрению, тем самым обходя необходимость в escape-символах.Например, установив значение a_variable равным

1;DROP TABLE users

удалит таблицу "users" из базы данных, поскольку SQL будет отображаться следующим образом:

SELECT * FROM DATA WHERE id=1;DROP TABLE users;

SQL-инъекция - это нет простая атака для борьбы.На вашем месте я бы провел очень тщательное исследование.

Другие советы

Да, в зависимости от используемого вами оператора.Вам лучше защитить себя либо с помощью Хранимых процедур, либо, по крайней мере, параметризованных запросов.

Видишь ВикиПедия для профилактических проб.

Да, это определенно возможно.

Если у вас есть форма, в которой вы ожидаете, что целое число войдет в ваш следующий оператор SELECT, то вы можете ввести что-нибудь подобное:

ВЫБЕРИТЕ * ИЗ thingy ГДЕ AttributeID=

  • 5 (хороший ответ, никаких проблем)
  • 5;ВЫПАДАЮЩИЙ стол users;(плохо, плохо, плохо...)

На следующем веб-сайте подробно описываются дополнительные классические методы SQL-инъекции: Шпаргалка по SQL-инъекции.

Использование параметризованных запросов или хранимых процедур ничуть не лучше.Это всего лишь готовые запросы, использующие переданные параметры, которые с таким же успехом могут быть источником внедрения.Это также описано на этой странице: Атака на хранимые процедуры в SQL.

Теперь, если вы подавите простую цитату, вы предотвратите только заданный набор атак.Но не все из них.

Как всегда, не доверяйте данным, поступающим извне.Отфильтруйте их на этих 3 уровнях:

  • Уровень интерфейса для очевидных вещей (выпадающий список выбора лучше, чем свободное текстовое поле)
  • Логический уровень для проверок, связанных с характером данных (int, string, длина), разрешениями (может ли этот тип данных использоваться этим пользователем на этой странице)...
  • Уровень доступа к базе данных (экранируйте простой кавычкой ...).

Получайте удовольствие и не забудьте проверить ВикиПедия в поисках ответов.

/Вей

Я предлагаю вам передавать переменные в качестве параметров, а не создавать свой собственный SQL.В противном случае всегда найдется способ выполнить SQL-инъекцию способами, о которых мы в настоящее время не знаем.

Затем код, который вы создаете, выглядит примерно так:

' Not Tested
var sql = "SELECT * FROM data WHERE id = @id";
var cmd = new SqlCommand(sql, myConnection);
cmd.Parameters.AddWithValue("@id", request.getParameter("id"));

Если у тебя есть имя, как у меня, с буквой "а" в нем.Очень раздражает, что все '-символы удалены или помечены как недопустимые.

Возможно, вы также захотите взглянуть на это Вопрос Stackoverflow о SQL-инъекциях.

Параметризованный встроенный SQL или параметризованные хранимые процедуры - лучший способ защитить себя.Как указывали другие, простого удаления символа одинарной кавычки недостаточно.

Вы заметите, что я специально говорю о "параметризованных" хранимых процедурах.Простого использования хранимой процедуры также недостаточно, если вы вернетесь к объединению переданных параметров процедуры вместе.Другими словами, перенос точно такой же уязвимой инструкции SQL в хранимую процедуру не делает ее более безопасной.Вам нужно использовать параметры в вашей хранимой процедуре точно так же, как вы бы использовали встроенный SQL.

Кроме того, даже если вы просто ищете апостроф, вы не хотите его удалять.Ты хочешь побег IT.Вы делаете это, заменяя каждый апостроф двумя апостроф-ами.

Но параметризованные запросы / хранимые процедуры намного лучше.

Поскольку это относительно старый вопрос, я не буду утруждать себя написанием полного и исчерпывающего ответа, поскольку большинство аспектов этого ответа были упомянуты здесь тем или иным постером.
Однако я считаю необходимым затронуть еще один вопрос, который здесь никем не затрагивался, - контрабанду SQL.В определенных ситуациях можно "контрабандой" вставить символ кавычки ' в ваш запрос даже если вы попытаетесь удалить его.На самом деле, это может быть возможно, даже если вы использовали соответствующие команды, параметры, хранимые процедуры и т.д.

Ознакомьтесь с полным текстом исследовательской работы по адресу http://www.comsecglobal.com/FrameWork/Upload/SQL_Smuggling.pdf (раскрытие информации, я был основным исследователем этого вопроса) или просто погуглите "Контрабанду SQL".

...э-э, около 50000000 других способов

может быть, что-то вроде 5; drop table employees; --

результирующий sql может быть чем-то вроде:select * from somewhere where number = 5; drop table employees; -- and sadfsf

(-- запускает комментарий)

Да, безусловно:в зависимости от вашего диалекта SQL и тому подобного, существует много способов добиться внедрения, которые не используют апостроф.

Единственной надежной защитой от атак с использованием SQL-инъекций является использование параметризованной поддержки инструкций SQL, предлагаемой вашим интерфейсом базы данных.

Вместо того, чтобы пытаться выяснить, какие символы отфильтровывать, я бы вместо этого придерживался параметризованных запросов и полностью устранил проблему.

Это зависит от того, как вы составите запрос, но по сути да.

Например, в Java, если бы вы должны были сделать это (намеренно вопиющий пример):

 String query = "SELECT name_ from Customer WHERE ID = " + request.getParameter("id");

тогда есть большая вероятность, что вы открываете себя для инъекционной атаки.

В Java есть несколько полезных инструментов для защиты от них, таких как PreparedStatements (где вы передаете строку типа "SELECT name_ from Customer WHERE ID = ?", а уровень JDBC обрабатывает экранирование при замене ?токены для вас), но некоторые другие языки не так полезны для этого.

Дело в том, что апостроф, возможно, является подлинным вводом, и вам нужно избежать их путем удвоения, когда вы используете встроенный SQL в своем коде.То, что вы ищете, - это шаблон регулярного выражения, подобный:

\;.*--\

Точка с запятой используется для преждевременного завершения подлинного оператора, некоторые вводимые SQL, за которыми следует двойной дефис, чтобы закомментировать завершающий SQL из исходного подлинного оператора.Дефисы в атаке могут быть опущены.

Следовательно, ответ таков:Нет, простое удаление апостроф не гарантирует вам безопасность от SQL-инъекции.

Я могу только повторить то, что говорили другие.Правильный путь - параметризованный SQL.Конечно, это своего рода заноза в заднице при написании кода - но как только вы сделаете это один раз, вам не составит труда вырезать и вставить этот код и внести необходимые изменения.У нас их очень много .Сетевые приложения, которые позволяют посетителям веб-сайта указывать целый ряд критериев поиска, и код создает инструкцию SQL Select "на лету", но все, что могло быть введено пользователем, переходит в параметр.

Когда вы ожидаете ввести числовой параметр, вы всегда должны проверять входные данные, чтобы убедиться, что они являются числовыми.Помимо защиты от внедрения, этап проверки сделает приложение более удобным для пользователя.

Если вы когда-нибудь получите id = "hello", когда ожидали id = 1044, всегда лучше вернуть полезную ошибку пользователю, а не позволять базе данных возвращать ошибку.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top