Вопрос или проблема
Я делаю инъекцию:
-35' и updatexml(null,concat(0x3a,(0x0a,(select database()))),null)-- -
и получаю:
Ошибка 1 - Операнд должен содержать 1 столбец(а)
Есть идеи, как это исправить?
Я пытаюсь получить тип базы данных.
Ссылки:
Ваша инъекция предполагает, что точка инъекции находится в условии where, но ошибка подразумевает, что точка инъекции находится в условии select. Вам следует попробовать некоторые строки, которые работают с входными данными, чтобы определить точку инъекции.
Например, вы можете попробовать:
-35' from dual-- -
посмотреть, приведет ли это к корректному запросу.
Ответ или решение
Ошибка "Error 1 – Operand should contain 1 column(s)" свидетельствует о том, что ваш SQL-запрос ожидает одно значение в качестве операнда, но получает больше одного. Это может быть связано с тем, что подзапрос, который вы используете в вашем запросе, возвращает несколько колонок, что недопустимо в данном контексте.
Ваше начальное выражение:
-35' and updatexml(null,concat(0x3a,(0x0a,(select database()))),null)-- -
предполагает, что вы пытаетесь извлечь название базы данных с помощью функции updatexml
. Однако, как вы заметили, у вас возникла ошибка, указывающая на то, что выражение подразумевает, что вы используете его в SELECT
, где ожидается только один столбец.
Возможное решение
-
Проверка структуры таблицы: Перед тем как формировать запрос, убедитесь, что вы знаете структуру таблицы, включая количество и типы колонок. Это поможет вам лучше конструировать запросы и подзапросы.
-
Использование корректной функции: Попробуйте изменить запрос так, чтобы он возвращал только одно значение, например:
-35' AND (SELECT database()) = database()-- -
Здесь вы используете конструкцию
SELECT
, чтобы проверить, соответствует ли запрашиваемая база данных текущей. Это должно работать, если ваше инжектируемое место поддерживает условные выражения. -
Отладка с помощью других конструкций: Попробуйте провести дополнительные тесты, чтобы определить, в каком именно месте можно осуществлять инъекцию. Использование выражения
FROM DUAL
может оказаться полезным в этом контексте:-35' FROM dual/* comment */;-- -
Такой запрос должен помочь узнать, поддерживает ли целевой запрос выполнение
SELECT
с несколькими источниками данных. -
Использование других методов: Если вы по-прежнему сталкиваетесь с проблемами, можно рассмотреть использование других методов инъекции, которые могут помочь извлечь информацию о базе данных без возникновения подобных ошибок. Например, комбинация с
UNION
может помочь, если в целевом запросе доступно несколько столбцов.
Итог
Проблема, с которой вы столкнулись, связана с ожиданием одного результата в определенном контексте SQL-запроса. Постарайтесь адаптировать ваши запросы, основываясь на структуре таблиц и доступных колонках, чтобы избежать конфликтов в количестве возвращаемых данных. Также стоит проводить тесты с разными подходами, чтобы увидеть, какие запросы работают.
Если у вас есть дополнительные вопросы или требуется дальнейшая помощь, не стесняйтесь обращаться.