====== SQL injection. Описание ======
----
===== Описание =====
Отличное описание приведено в [[ https://habrahabr.ru/post/148151/ | статье на habrahabr.ru ]] : \\
SQL инъекция - это атака на базу данных, которая позволит выполнить некоторое действие, которое не планировалось создателем скрипта. Пример из жизни: \\
Отец, написал в записке маме, чтобы она дала Васе 100 рублей и положил её на стол. Переработав это в шуточный SQL язык, мы получим:
ДОСТАНЬ ИЗ кошелька 100 РУБЛЕЙ И ДАЙ ИХ Васе
Так-как отец плохо написал записку (Корявый почерк), и оставил её на столе, её увидел брат Васи — Петя. Петя, будучи хакер, дописал там «ИЛИ Пете» и получился такой запрос:
ДОСТАНЬ ИЗ кошелька 100 РУБЛЕЙ И ДАЙ ИХ Васе ИЛИ Пете
Мама прочитав записку, решила, что Васе она давала деньги вчера и дала 100 рублей Пете. Вот простой пример SQL инъекции из жизни :) Не фильтруя данные (Мама еле разобрала почерк), Петя добился профита.
----
А теперь рассмотрим реальный пример, взятый с [[ https://ru.wikipedia.org/wiki/Внедрение_SQL-кода | ru.wikipedia.org ]].
Допустим, серверное ПО, получив входной параметр id, использует его для создания SQL-запроса. Рассмотрим следующий PHP-скрипт:
# Предыдущий код скрипта...
$id = $_REQUEST['id'];
$res = mysql_query("SELECT * FROM news WHERE id_news =".$id);
# Следующий код скрипта...
Если на сервер передан параметр **id**, равный **5** ( например так: //%%http://example.org/script.php%%**%%?id=5%%**// ), то выполнится следующий SQL-запрос:
SELECT * FROM news WHERE id_news = 5
Но если злоумышленник передаст в качестве параметра **id** строку ''-1 OR 1=1'' (например, так: //%%http://example.org/script.php%%**%%?id=-1+OR+1=1%%**// ), то выполнится запрос:
SELECT * FROM news WHERE id_news = -1 OR 1=1
Таким образом, изменение входных параметров путём добавления в них конструкций языка SQL вызывает изменение в логике выполнения SQL-запроса (в данном примере вместо новости с заданным идентификатором будут выбраны все имеющиеся в базе новости, поскольку выражение 1=1 всегда истинно — вычисления происходят по кратчайшему контуру в схеме
----
===== Классификация SQL-инъекций =====
В этом параграфе я сделал попытку классифицировать данный тип уязвимости:
* Классическая SQLI
* Строковой входящий параметр
* Цифровой входящий параметр
* Слепая SQL инъекция
* Специфическая для конкретной системы управления базами данных SQLI
* Составные SQLI
* SQL инъекция + недостаточная аутентификация
* SQL инъекция + DDoS атаки
* SQL инъекция + взлом DNS
* SQL инъекция + XSS
----
===== Признаки =====
* Приложение получает данные для составления SQL запроса от пользователя;
* Приложение не проверяет введенные данные на корректность;
* Для построения SQL запроса или команды SQL exec (или её аналога) используется конкатенация или строковая замена.
* Подключение к базе осуществляется с данными административной или привилегированной учётной записи;
* Встраивание авторизационных данных в программный код;
----
===== Способы обнаружения =====
* Тестирование функций (black/white-box)
* Фаззинг (fuzzing)
* Cтатический/динамический/ручной анализ исходного кода
----
==== Методы для работы с БД ====
^ Язык ^ Ключевое слово ^
| VB.NET | Sql SqlClient, OracleClient, Sql Data Adapter |
| C# | Sql, SqlClient, OracleClient, Sql Data Adapter |
| РНР | mysql_connect |
| Perl | DBI, Oracle, SQL |
| Ruby | ActiveRecord |
| Python (MySQL) | MySQLdb |
| Python (Oracle) | DCOracle2 |
| Python (SQL Server) | pymssql |
| Java (cJDBC) | java.sql, sql |
| Active Server Pages | ADODB |
| C++ (Microsoft Foundation Classes) | СDatabase |
| C/C++ (MySQL) | #include \\ #include |
| C/C++ (ODBC) | #include |
| C/C++ (ADO) | ADODB, #import «msadol5.dll» |
| SQL | exec, execute, sp_executesql |
| ColdFusion | cfquery |
----
==== Дополнительная информация ====
^ Конструкция ^ Комментирование остатка строки ^ Получение версии ^ Конкатенация строк ^
^ MySQL | **%%--%%** \\ **%%/*%%** | version() | concat (string1, string2) |
^ MS SQL | **%%---%%** | @@version | string1 + string2 |
^ Oracle | **%%---%%** \\ **%%/*%%** | select banner from v$version | %%string1 || string2%% \\ concat (string1, string2) |
^ MS Access | Внедрение в запрос NULL‑байта: **%%%00%%** | | |
^ PostgreSQL | **%%---%%** | version() | %%string1 || string2%% |
^ Sybase | **%%---%%** | @@version | string1 + string2 |
^ IBM DB2 | **%%---%%** | select versionnumber from sysibm.sysversions | %%string1 || string2%% \\ string1 concat string2 |
^ Ingres | **%%---%%** | dbmsinfo('_version') | %%string1 || string2%% |
===== Источники =====
* [[ https://webware.biz/?p=4576 | SQL-инъекции: простое объяснение для начинающих (часть 1)]]
* [[ https://webware.biz/?p=5597 | SQL инъекции — промежуточный уровень ]]
* [[ https://www.ibm.com/developerworks/ru/library/se-bindvariables/ | Использование переменных связывания в SQL для повышения производительности приложений и обеспечения их безопасности ]]
* [[ http://www.ozon.ru/context/detail/id/5238324/ | 24 смертных греха компьютерной безопасности ]]