Что это за строка
Строка ' OR EXTRACTVALUE(8110,CONCAT(0x7e,((SELECT (ELT(8110=8110,1)))),0x7e))-- - — это классический пример error-based SQL-инъекции (инъекции на основе ошибок) для СУБД MySQL. Такие конструкции используют для извлечения данных из базы путём намеренного вызова ошибок, текст которых содержит нужную информацию.
Подобные payload'ы часто встречаются в отчётах об уязвимостях, в логах WAF и в учебных материалах по пентесту. Разберём, что здесь к чему.
Как работает EXTRACTVALUE
Функция EXTRACTVALUE(XML, XPath) извлекает значение из XML-документа по заданному XPath-выражению. Если XPath-выражение некорректно, MySQL возвращает ошибку вида:
XPATH syntax error: '...'
Именно в эту ошибку атакующий «прячет» результат подзапроса. СУБД сама выведет его в тексте сообщения об ошибке.
Разбор payload по частям
'— закрывает строковый литерал в исходном запросе, делая дальнейший ввод частью SQL-кода.OR— логический оператор, позволяющий внедрить условие.EXTRACTVALUE(8110, ...)— первый аргумент (8110) здесь не важен, он может быть любым числом или даже ссылкой на колонку. Главное — второй аргумент.CONCAT(0x7e, ((SELECT (ELT(8110=8110,1)))), 0x7e)— склеивает тильду (0x7e), результат подзапроса и ещё одну тильду.ELT(8110=8110, 1)— функция ELT возвращает N-й элемент из списка. Здесь условие8110=8110всегда истинно (1), поэтому возвращается первый элемент — число 1. Это простейший тестовый подзапрос; на практике вместо него ставят вызовы вродеSELECT version()илиSELECT table_name FROM information_schema.tables.-- -— комментарий, отсекающий остаток оригинального SQL-запроса.
Почему это работает
MySQL при вычислении EXTRACTVALUE пытается интерпретировать второй аргумент как XPath. Символ ~ (0x7e) недопустим в начале XPath-выражения, поэтому СУБД выбрасывает ошибку и включает в неё начало строки — то есть наш конкатенированный результат. Атакующий видит данные в сообщении об ошибке.
Именно поэтому метод называется error-based: данные извлекаются не через UNION-запросы и не через слепые булевы условия, а через текст ошибки.
Где встречается
Техника описана в OWASP и в многочисленных пентест-отчётах. В реальных атаках payload модифицируют: вместо ELT(8110=8110,1) подставляют подзапросы к information_schema, чтобы вытащить имена таблиц, колонок и хэши паролей. Ограничение — длина вывода в ошибке (обычно около 32 символов), поэтому данные извлекают посимвольно через SUBSTRING.
Как защититься
- Использовать подготовленные выражения (prepared statements) с параметризацией — самый надёжный способ.
- Не конкатенировать пользовательский ввод в SQL-запросы.
- Применять ORM и строгую валидацию типов.
- Настроить WAF и логировать подозрительные паттерны (EXTRACTVALUE, UPDATEXML, CONCAT с 0x7e).
- Ограничить права пользователя БД: не давать доступ к information_schema без необходимости.
Итог
Строка ' OR EXTRACTVALUE(8110,CONCAT(0x7e,((SELECT (ELT(8110=8110,1)))),0x7e))-- - — это учебный пример error-based SQL-инъекции в MySQL. Она демонстрирует, как через функцию EXTRACTVALUE и намеренную XPath-ошибку можно вывести результат подзапроса в сообщение об ошибке. Понимание таких payload'ов помогает разработчикам и безопасникам распознавать атаки и закрывать уязвимости.
Комментарии
—Войдите, чтобы оставить комментарий