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

SQL-инъекция (SQL injection) — это один из самых распространённых и опасных видов атак на веб-приложения. Суть метода заключается во внедрении в пользовательский ввод (например, в поле формы или параметр URL) специально сформированного SQL-кода, который изменяет логику запроса к базе данных. Злоумышленник может получить несанкционированный доступ к данным, изменить их или даже удалить. Выражение ') and (989626813=989626813' — это типичный пример тестовой инъекции, которую используют для проверки защищённости сайта.

Анатомия выражения ') and (989626813=989626813'

Разберём строку по частям:

  • ') — закрывает открытую в исходном запросе скобку и строку, завершая её. Это позволяет злоумышленнику «вырваться» из контекста строкового литерала и добавить свой код.
  • and (989626813=989626813) — логическое условие, которое всегда истинно (число равно самому себе). В сочетании с предыдущей частью оно превращает условие WHERE в конструкцию, которая для каждой строки возвращает true.
  • ' — открывает новую строку, чтобы сохранить синтаксическую корректность запроса для оставшейся части исходного кода.

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

SELECT * FROM users WHERE login = 'admin') and (989626813=989626813' AND password = '...'

Условие and (989626813=989626813) всегда истинно, поэтому запрос вернёт данные первого пользователя (обычно администратора), игнорируя проверку пароля.

Зачем используется именно такое выражение?

Выражение ') and (989626813=989626813' часто применяется в автоматизированных сканерах уязвимостей и ручных тестах по нескольким причинам:

  • Проверка наличия уязвимости. Если сайт отвечает по-разному на запросы с истинным и ложным условием (например, and (1=1) и and (1=2)), значит, он подвержен SQL-инъекциям.
  • Обход фильтров. Некоторые системы фильтруют классические конструкции типа or 1=1, но не учитывают вариант со скобками и числами.
  • Адаптация к разным типам запросов. Символ ) позволяет корректно встроить инъекцию в запросы, где есть вложенные подзапросы или функции.

Как работает атака на практике

Рассмотрим типичный сценарий. На сайте есть форма авторизации. Пользователь вводит логин и пароль, которые подставляются в SQL-запрос:

SELECT * FROM users WHERE login = '$login' AND password = '$password'

Если в поле логина ввести admin') and (989626813=989626813' --, то запрос станет:

SELECT * FROM users WHERE login = 'admin') and (989626813=989626813' --' AND password = '...'

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

Отличия от других видов инъекций

Выражение ') and (989626813=989626813' относится к категории классических логических инъекций, которые основаны на изменении условия WHERE. Существуют и другие типы:

  • Union-based — используют оператор UNION для объединения результатов с данными из других таблиц.
  • Blind SQL-инъекции — не показывают данные напрямую, но позволяют получать информацию посимвольно через логические вопросы (например, and (substring(version(),1,1))='5').
  • Error-based — вызывают ошибки базы данных, которые содержат полезную информацию в тексте ответа.

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

Почему именно число 989626813?

Конкретное число 989626813 не имеет никакого сакрального смысла. Это случайное значение, которое выбирается для того, чтобы условие было заведомо истинным. Важно, что левая и правая части равны. Вместо этого числа может быть любое другое, например, 123=123 или 1=1. Но использование «некруглого» числа иногда помогает обойти наивные сигнатуры защиты, которые ищут точное совпадение с известными паттернами.

Как защититься от SQL-инъекций

Для предотвращения подобных атак необходимо соблюдать несколько правил:

  1. Использовать параметризованные запросы (prepared statements). Это главный и самый надёжный способ. Пользовательский ввод никогда не интерпретируется как SQL-код, а передаётся отдельно.
  2. Экранировать спецсимволы в строках, если параметризация невозможна.
  3. Валидировать входные данные на стороне сервера: проверять типы, длины, допустимые символы.
  4. Ограничивать права доступа к БД для веб-приложения — использовать аккаунт с минимально необходимыми привилегиями.
  5. Регулярно обновлять СУБД и библиотеки доступа к данным.

Практическое значение для веб-мастеров

Если вы владелец сайта, наличие в логах запросов с выражением ') and (989626813=989626813' — это тревожный сигнал. Скорее всего, кто-то (человек или бот) проверяет ваш ресурс на уязвимость. Если сайт написан на PHP, Java, Python или другом языке без использования подготовленных выражений, необходимо срочно провести аудит кода и исправить все места, где пользовательский ввод попадает в SQL-запросы.

Помните: SQL-инъекции — это не миф, а реальная угроза. По данным OWASP, они входят в десятку самых критичных рисков веб-безопасности уже много лет.

Заключение

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

Источники