Внедрение кода или инъекция SQL — это уязвимость системы безопасности в Интернете, позволяющая злоумышленнику завладеть доступом к SQL-запросам в базу данных. Так он может получить конфиденциальную информацию о структуре базы данных, таблицах, столбцах или полях вместе со всеми данными, которые там есть.
Вот пример. Предположим, приложение использует следующий запрос на получение чьих-либо учётных данных:
SELECT USERNAME,PASSWORD from USERS where USERNAME='<username>' AND PASSWORD='<password>';Здесь имя пользователя username и пароль password — это данные, вводимые пользователем. Допустим, злоумышленник в оба поля введёт ' OR '1'='1. SQL-запрос будет выглядеть так:
На запрос приходит true, и доступ получен. Это пример самой простой SQL-инъекции.
Инъекция SQL может быть использована где угодно, и с её помощью можно получить любую, даже самую секретную информацию, хранящуюся в базе данных.
Примечание: пример максимально упрощён и приводится здесь исключительно в ознакомительных целях. В реальной жизни таких случаев практически не найти.
Можете заглянуть в эту шпаргалку и узнать, как выполнять запросы в базы данных SQL разных поставщиков.
В большинстве случаев уязвимость обнаруживается введением неверных параметров, например: ', '' a' or 1=1--, "a"" or 1=1--", or a = a, a' waitfor delay '0:0:10'--, 1 waitfor delay '0:0:10'--, %26, ' or username like '% и т.д. После чего проявляются изменения в поведении приложения.
Можно проанализировать длину ответа сервера и время, требующееся для отправки этого ответа. Такая полезная нагрузка, как ', a' or 1=1-- и т.д., может свидетельствовать об изменениях в ответе сервера баз данных. Но в случае отсутствия изменений мы можем попробовать запустить задержки по времени, используя полезную нагрузку a' waitfor delay '0:0:10'--. Так можно задержать отправку ответа сервера на определённое время.
Узнав, подвержен ли сайт SQL-инъекции, мы можем попытаться вытащить из базы данных интересующую нас информацию.
Но прежде надо определить количество столбцов, возвращаемых на SQL-запрос. Это важно, так как при несовпадении количества столбцов, которые мы пытаемся вытащить, с тем, что мы получим в ответе, нам вернётся ошибка.
Количество столбцов можно определить командой order by. Например:
Комментарии в SQL начинаются вот с такой комбинации символов --. Чтобы сохранить пробел после --, просто добавляем любой символ: так пробел не будет игнорироваться в HTTP-запросе. Для комментариев могут использоваться также # или /* */ в зависимости от поставщика базы данных SQL.
Продолжаем этот процесс, пока не появится ошибка. Если ошибка случилась во время использования полезной нагрузки order by 5, а не order by 4, значит, запрос возвращает 4 столбца.
Обнаружив уязвимость приложения и определив количество столбцов, попробуем найти необходимую информацию о базе данных (БД): имя БД, имя пользователя БД, версия БД, имена таблиц, имена столбцов той или иной таблицы и т.д. Загляните в шпаргалку по инъекциям в SQL: там есть соответствующие запросы.
сообщения об ошибке, выбрасываемой сервером базы данных. Такие сообщения могут дать полезную информацию о структуре базы данных.UNION: эта техника задействует оператор SQL UNION для объединения результатов двух запросов SELECT в единую таблицу. Так злоумышленник может получить информацию из других таблиц добавлением результатов к исходному запросу, выполненному в базу данных.SQL-инъекции, но результаты SQL-запроса не возвращаются в HTTP-ответе. В этом случае в базу данных выполняется запрос на любой из операторов true/false, и отслеживаются изменения для условий true и false. Этот тип подразделяется на два подтипа:ответ от сервера анализируется на наличие расхождений при отправке условия true и false.SQL-инъекции, зависит от конкретных характеристик сервера базы данных. Использует способность сервера базы данных выполнять веб-запросы типа HTTP, DNS и ftp для отправки данных злоумышленнику.автоматизирует процесс выявления и использования уязвимостей типа SQL-инъекций.SQL-инъекциям. Здесь можно найти шпаргалки и полезные нагрузки, которые пригодятся в самых разных ситуациях.Перевод статьи Ashwin Goel: A Beginner’s Guide to SQL Injection
Комментарии