За что готовы платить владельцы крупных сайтов ИЛИ SQL инъекции
Уязвимость, которая позволяет злоумышленнику обращаться к базе данных (БД) сайта и атаковать ее с помощью языка структурированных запросов (structured query language, или SQL), называется внедрением SQL (SQL injection, или SQLi). Обнаружение атак SQLi часто существенно вознаграждается, так как они могут иметь разрушительные последствия: злоумышленник получает возможность изменить или извлечь информацию или даже создать в БД собственную учетную запись администратора
БД имеют вид таблиц, которые могут содержать произвольное число столбцов и строк (записей). Для создания, чтения, обновления и удаления записей в реляционной БД используется SQL. Пользователь отправляет БД SQL-команды (инструкции или запросы), а та их интерпретирует (если они корректны) и выполняет действия. Среди популярных реляционных БД можно выделить MySQL, PostgreSQL и MSSQL. Примеры в этой главе относятся к MySQL, но их концепция применима ко всем БД с поддержкой SQL.
Команды SQL состоят из ключевых слов и функций. Например, следующее выражение заставляет БД выбрать информацию из столбца name в таблице users для записей, идентификаторы которых равны 1.
SELECT name FROM users WHERE id = 1;
Многие веб-сайты хранят в БД информацию для динамической генерации содержимого. Например, если сайт https://www..com/ хранит в БД предыдущие заказы клиента, при входе в его учетную запись его браузер запросит их и сгенерирует HTML на основе полученной информации.
Ниже показан гипотетический пример серверного PHP-кода для генерации команды MySQL при посещении пользователем страницы https://www.. com?name=peter:
$name =
1$_GET['name']; $query = "SELECT * FROM users WHERE name =2$name' ";
3mysql_query($query);
Здесь в квадратных скобках $_GET[ ] 1 указано имя параметра URL-адреса, который нужно извлечь, и сохранено его значение в переменной $name. Этот параметр передается переменной $query 2 без фильтрации. Переменная $query описывает запрос, который нужно выполнить, и извлекает из таблицы users все записи, значение в столбце name которых совпадает с одноименным параметром в URL-адресе. Для выполнения этого запроса $query передается PHP-функции mysql_query 3
Сайт ожидает, что name содержит обычный текст. Но если пользователь передаст вредоносный код test' OR 1='1 в параметре URL-адреса, такого как https://www.example.com?name=test' OR 1='1, БД выполнит следующий запрос:
$query = "SELECT * FROM users WHERE name = 'test
1' OR 1='12' ";
Вредоносный код закрывает открывающую одинарную кавычку (') после значения test 1 и добавляет в конец запроса SQL-код OR 1='1. Висящая одинарная кавычка открывает закрывающую одинарную кавычку, заданную самим сайтом 2, обеспечивая корректный для выполнения синтаксис.
SQL поддерживает условные операторы AND и OR. В данном случае SQLi изменяет инструкцию WHERE для поиска записей, в которых выполняется одно из условий: столбец name совпадает с test или выражение 1='1' возвращает true. MySQL интерпретирует '1' как целое число, и поскольку 1 всегда равно 1, это выражение всегда истинно, в результате чего запрос возвращает все записи в таблице users. Но если другие части запроса фильтруются, внедрение test' OR 1='1 не работает. Представьте такой запрос:
$name = $_GET['name']; $password =
1mysql_real_escape_string($_GET['password']); $query = "SELECT * FROM users WHERE name = '$name' AND password = '$password' ";
Параметр password находится под контролем пользователя, но как следует обрабатывается 1. Если внедрить в качестве имени код test' OR 1='1 и указать пароль 12345, выражение будет выглядеть так:
$query = "SELECT * FROM users WHERE name = 'test' OR 1='1' AND password = '12345' ";
Этот запрос ищет все записи, в которых столбец name равен test или 1='1', а password содержит 12345 (проигнорируем, что эта БД хранит пароли в открытом виде, что является еще одной уязвимостью). Поскольку при проверке пароля используется оператор AND, запрос вернет данные только для записей, пароль которых равен 12345. Это помешает попытке SQLi, но может пригодиться в другой атаке.
P.S. В следующих постах если вам будет интересно, приведу примеры найденных уязвимостей и опубликованных на HackerOne за некоторые из них например Uber заплатила 4000 долларов.
К данной статье рекомендую ранее мной созданную, там рассматривается довольно популярный инструмент для проведения подобных атак + там есть возможность использования автоматизированных атак. Атака на веб-приложения при помощи Burp Suite и SQL инъекции
