Что это за строка?
Строка вида AND EXTRACTVALUE(6889,CONCAT(0x7e,((SELECT (ELT(6889=6889,1)))),0x7e))-- - — это классический пример SQL-инъекции (SQL injection), нацеленной на базу данных MySQL. Подобные конструкции часто встречаются в логах веб-сервера или в полях ввода на сайтах. Они не являются обычным пользовательским запросом, а представляют собой попытку злоумышленника получить информацию из базы данных или обойти аутентификацию.
В основе лежит использование функции EXTRACTVALUE вместе с CONCAT и ELT. Цель — вызвать ошибку, которая выведет на экран или в лог нужные данные. Это так называемая «error-based SQL injection» (инъекция, основанная на ошибках).
Как работает эта инъекция?
Разберем по частям:
AND EXTRACTVALUE(6889, CONCAT(0x7e, ((SELECT (ELT(6889=6889,1)))), 0x7e))— добавляется к легитимному SQL-запросу, чтобы изменить его логику.- EXTRACTVALUE(XML_document, XPath_expression) — функция MySQL, которая извлекает значение из XML-документа по XPath-выражению. Если XPath-выражение некорректно, MySQL генерирует ошибку, содержащую это выражение.
- CONCAT(0x7e, ..., 0x7e) — объединяет строки.
0x7e— это шестнадцатеричный код символа «~» (тильда). Тильда используется как разделитель, чтобы облегчить чтение результата в сообщении об ошибке. - (SELECT (ELT(6889=6889,1))) — подзапрос, который возвращает значение. ELT(N, str1, str2, ...) возвращает строку по номеру. Если
6889=6889истинно (1), то ELT(1, 1) вернёт «1». Если бы условие было ложным, вернулось бы NULL. Это простейшая проверка, часто используемая для тестирования уязвимости. -- -— комментарий, который обрезает оставшуюся часть исходного запроса, чтобы синтаксис оставался корректным.
В результате выполнениz такого запроса MySQL попытается извлечь значение из несуществующего XML, что вызовет ошибку вида: «XPATH syntax error: '~1~'». В сообщении об ошибке злоумышленник увидит результат подзапроса — в данном случае «1». Меняя подзапрос, можно извлекать имена таблиц, логины, пароли и другие данные.
Зачем это нужно злоумышленнику?
Основные цели SQL-инъекций:
- Обход аутентификации (вход без пароля).
- Извлечение конфиденциальных данных (учетные записи, персональные данные, номера карт).
- Изменение или удаление информации в базе.
- Выполнение административных операций (например, создание новых пользователей).
Конструкция с EXTRACTVALUE часто используется на этапе разведки, чтобы определить, уязвим ли сайт, и получить базовую информацию о СУБД. Если сайт уязвим, злоумышленник может перейти к более сложным атакам.
Пример работы (теоретический)
Предположим, на сайте есть форма входа, и код формирует запрос:
SELECT * FROM users WHERE login = '$login' AND password = '$password';
Если в поле login ввести ' AND EXTRACTVALUE(6889,CONCAT(0x7e,((SELECT (ELT(6889=6889,1)))),0x7e))-- -, то запрос станет:
SELECT * FROM users WHERE login = '' AND EXTRACTVALUE(6889,CONCAT(0x7e,((SELECT (ELT(6889=6889,1)))),0x7e))-- -' AND password = '...';
MySQL выполнит подзапрос, попытается извлечь XML и выдаст ошибку с результатом. Если сайт отображает ошибки БД, злоумышленник увидит «~1~» и поймет, что инъекция работает.
Как защититься?
Лучшая защита от SQL-инъекций — использование параметризованных запросов (prepared statements) и хранимых процедур. Никогда не подставляйте пользовательский ввод напрямую в SQL-запрос. Также рекомендуется:
- Экранировать специальные символы (хотя это не панацея).
- Использовать ORM с безопасным построением запросов.
- Ограничить права пользователя БД (не давать прав на чтение системных таблиц).
- Отключить вывод ошибок БД на продакшене.
- Регулярно обновлять СУБД и фреймворки.
Если вы встретили такую строку в логах, это повод проверить код на уязвимости и убедиться, что все запросы к базе данных безопасны.
Вывод
Строка AND EXTRACTVALUE(6889,CONCAT(0x7e,((SELECT (ELT(6889=6889,1)))),0x7e))-- - — это не случайный набор символов, а целенаправленная попытка SQL-инъекции. Понимание механизма помогает администраторам и разработчикам вовремя обнаруживать атаки и закрывать уязвимости.
Комментарии
—Войдите, чтобы оставить комментарий