Bug Bounty, Bug Hunting, SQL-Injection

#17 Bug Bounty v.2 — Error Based SQL-Injection

Здравствуйте, дорогие друзья.

При использовании SQL-инъекции на основе union приложение отображает выходные данные. Error Based SQL-Injection немного отличается, поскольку выходные данные отображаются в виде сообщения об ошибке. Это полезно, когда нет никаких выходных данных, кроме ошибки SQL.

Xpath

Если версия сервиса MySQL 5.1 или более поздняя, мы можем использовать функцию ”extractvalue()» для извлечения данных из базы данных. Функция extractValue() генерирует ошибку SQL, когда ей не удается проанализировать переданные ей XML-данные. Помните, что при внедрении Error Based SQL-Injection мы должны извлекать наши данные с помощью сообщений об ошибках SQL. Сначала вам нужно понять, как работает функция extractValue(), как только вы поймете, как работает эта функция, вы сможете использовать ее для SQL-инъекции.

Как вы можете видеть на рисунке выше, функция extractValue() используется для извлечения значения из XML-документа. Здесь мы вводим строку XML “<id>1</id><name>ghostlulz</name> <email>ghostlulz@offensiveai.com</email>” и мы получаем значение тегов имен со вторым аргументом. Итак, первый аргумент — это XML-документ , а второй аргумент — это тег, значение которого мы хотим получить.

mysql

Как показано выше, если второй аргумент начинается с “;”, это приведет к появлению сообщения об ошибке MySQL вместе со строкой, которая вызвала ошибку. Злоумышленники могут воспользоваться этим, чтобы извлечь данные с помощью сообщений об ошибках. Глядя на приведенный выше пример, вы можете видеть, что я смог извлечь версию базы данных с помощью сообщения об ошибке. Вооружившись этими знаниями, вы теперь можете использовать этот метод для выполнения sql-инъекции на основе ошибок.

AND extractvalue(«blahh»,concat(«;»,@@version))

Как вы можете видеть выше, мы смогли извлечь версию базы данных MySQL с помощью сообщения об ошибке. Следующий шаг — получить список имен таблиц. Как и в случае с sql-инъекцией на основе union, для достижения этой цели мы будем использовать таблицу information_schema.tables.

AND extractvalue(«blahh»,(select concat(«;»,table_name) from information_schema.tables where table_schema = database() limit 0,1))

Обратите внимание на команду “ограничить 0,1” в конце запроса. Она используется для получения первой строки в таблицу, с помощью sql-инъекции, основанной на ошибках, мы должны запрашивать по одной таблице за раз. Чтобы получить вторую таблицу, вы должны использовать “limit 1,1”.

Как вы можете видеть выше, мы будем ориентироваться на таблицу “пользователи”. Как только у вас будет ваша целевая таблица, вам нужно запросить имена столбцов, принадлежащих этой таблице.

AND extractvalue(«blahh»,(select concat(«;»,column_name) from information_schema.columns where table_name = «users» limit 0,1))

Имя первого столбца — “uname”, теперь мы должны получить имя второго столбца, как показано ниже:

Как вы можете видеть выше, второй столбец называется “pass”. Заключительный шаг — извлечение данных из этих столбцов.

AND extractvalue(«blahh»,(select concat(«;»,uname,»:»,pass) from users limit 0,1))

Как вы можете видеть выше, мы смогли извлечь имя пользователя и пароль первого пользователя “test: test”. Чтобы получить следующего пользователя, просто измените “limit 0,1” на “limit 1,1”.

PostgreSQL

Если вы знаете, как выполнить sql-инъекцию на сервере mysql, то использование postgre будет очень похоже. Как и в случае с mysql, я обычно заключаю все в одинарные и двойные кавычки, пока не увижу знаменитое сообщение об ошибке:

Как вы можете видеть выше, отображается сообщение об ошибке. Имя “psycopg2” — это библиотека python для postgres, поэтому, если вы видите это имя, значит, вы работаете с сервером баз данных postgres.

На этом все. Всем хорошего дня!

Цикл статей по Bug Bounty.