#42 Bug Bounty. SQL-инъекция (SQLI).
Здравствуйте, дорогие друзья.
Введение
SQL Injection (SQL) — это классическая уязвимость, которая, похоже, не исчезнет. Эта уязвимость может быть использована для создания дампа содержимого БД приложений. Базы данных обычно содержат конфиденциальную информацию, такую как имена пользователей и пароли. Самой популярной базой данных является MySQL, но Вы столкнетесь с другими, такими как MSSQL, PostgreSQL, Oracle и другие. Хорошая шпаргалка может быть найдена на payloadallthethings:
•https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/SQL%20Injection
SQLI
Кажется, я сталкиваюсь с MySQL чаще, чем с любой другой базой данных, но это не значит, что Вы другие не увидите. Обычно MySQL можно найти ниже:
Если Вы когда-нибудь увидите эту ошибку, знайте, что это SQL-инъекция. Однако я буду демонстрировать, как использовать сервер PostgreSQL. Сообщение об ошибке было немного менее заметным, и могло легко остаться незамеченным.
Если Вы подозреваете, что есть SQL-инъекция, Вы должны перейти к поиску количества столбцов, возвращаемых в приложение. Это можно сделать с помощью команды «order by».
По сути, Вы спрашиваете базу данных «есть ли у вас 1 столбец?», тогда сервер отвечает и говорит да. Затем Вы спрашиваете: «У вас есть 2 столбца?» и сервер снова отвечает да. Затем Вы спрашиваете: «У вас есть 3 столбца?» и происходит ошибка базы данных. Итак, Вы знаете, что таблица базы данных содержит только 2 столбца.
‘ order by <Number here>—
Как видите, сервер отвечает без ошибок. В основном, сообщая нам, что сервер имеет 2 столбца. В приведенном ниже запросе показано, что происходит, когда сервер выдает ошибку, указывающую, что количество столбцов не существует.
Зная, что есть только 2 столбца, нам нужно выяснить, какие столбцы используются для отображения текста в приложении. Это делается, с помощью команды ‘ union select NULL,NULL— Команда union select может использоваться для извлечения данных из бэкэнда базы данных. Некоторые базы данных выдадут ошибку, если тип данных столбца неверен. По этой причине мы используем слово «NULL», которое в большинстве случаев, по умолчанию, будет передавать любой тип данных, который ожидает база данных. Мы обнаружили, что существуют только два столбца, поэтому Вы видите только два выбранных столбца NULL. Нам нужно выяснить, какой столбец используется для отображения текста на экране. Мы можем заменить каждый выбранный столбец строкой и посмотреть, появится ли она на странице. ‘ union select NULL,’VULNERABLE’—
Как видите, наш текст был выведен на экран. Это означает, что второй параметр — это тот, который мы хотим использовать при извлечении данных из серверной части базы данных. Первое, что нам нужно получить, — это имена таблиц в текущей базе данных. «information_schema» — это база данных по умолчанию, которая содержит информацию об именах таблиц, именах столбцов и всем остальном в базе данных. В этой базе данных есть таблица под названием «table», и она содержит столбец с именем «table_name». Мы можем использовать эту информацию для перечисления каждой таблицы в базу данных. ‘ union select NULL, table_name from information_schema.tables—
Как видите, есть таблица с именем «users». Следующим шагом является определение имен столбцов таблиц. Опять же, мы можем использовать базу данных «information_schema» для этого.
‘ union select NULL, column_name from information_schema.columns
where table_name = ‘<Table Name Here>’—
Как видите, есть два столбца с именами: пароль и имя пользователя. Финальный шаг — эксфильтрация данных. Чтобы вернуть пароль и имя пользователя в том же столбце, мне придется использовать функцию «concat()».
‘ union select NULL, concat(<Column Name>,’:’,<Column Name 2>) from
<Table Name>—
Стоит научиться использовать SQL-инъекцию вручную. Подавляющее большинство людей используют инструменты, которые они не полностью понимают, что ограничивает их возможности. Однако в реальном мире, если Вы обнаружите уязвимую конечную точку, вероятно, лучше всего использовать инструмент SQLmap, так как это проще и быстрее.
• https://github.com/sqlmapproject/sqlmap
Вывод
Внедрение SQL с самого начала входит в топ-10 OWASP и не собирается уходить. Существует много различных типов баз данных и использование каждой из них немного отличается. Если Вы делаете это в реальном мире, вероятно, лучше использовать такой инструмент, как SQLmap, но Вы должны знать, как сделать это вручную, так как Ваши инструменты не всегда могут работать.
На этом все. Всем хорошего дня!
#1 Bug Bounty. Подготовка к Bug Bounty. Введение.
#2 Bug Bounty. Организация. Введение.
#3 Bug Bounty. Заметки. Введение.
#4 Bug Bounty. Подготовка к охоте. База знаний.
#6 Bug Bounty 101. Выбор платформы.
#7 Bug Bounty. Выбор правильной цели.
#8 Bug Bounty. Методология — рабочие процессы.
#9 Bug Bounty. Рабочий процесс GitHub.
#10 Bug Bounty. Гугл Дорки Рабочий процесс.
#11 Bug Bounty. Эксплойты — Рабочий процесс.
#12 Bug Bounty. CMS — Рабочий процесс.
#13 Bug Bounty. Брутфорс — Рабочий процесс.
#14 Bug Bounty. Раздел 2. Разведка.
#15 Bug Bounty. Reverse Whois.
#17 Bug Bounty. Разведка — Фаза 2. Словарь.
#18 Bug Bounty. Перечисление поддоменов.
#19 Bug Bounty. Поисковый движок.
#20 Bug Bounty. Перестановка поддоменов.
#21 Bug Bounty. Разрешения DNS.
#22 Bug Bounty. Wayback Machine crawl data.
#23 Bug Bounty. Проверка файлов JavaScript.
#25 Bug Bounty. Часть 8: Фаза fingerprint.
#26 Bug Bounty. Censys. Nmap. Masscan.
#27 Bug Bounty. Веб-приложение.
#28 Bug Bounty. Этап эксплуатации.
#30 Bug Bounty. Неправильно настроенные сегменты облачного хранилища.
#31 Bug Bounty. Облачное хранилище Google.
#32 Bug Bounty. Elastic Search DB.
#34 Bug Bounty. Kubernetes API.
#36 Bug Bounty. Эксплуатация CMS. WordPress.
#37 Bug Bounty. Joomla. Drupal. Adobe AEM.
#38 Bug Bounty. Эксплуатация OWASP. XML External Entity (XXE).
#39 Bug Bounty. Межсайтовый скриптинг (XSS).