CTF Прохождение The Lord of the SQLI : The Fellowship of the SQLI, 2021

Решил рассказать про CTF , которую я проходил. Это не совсем CTF в привычном понимании: нет флагов. Надо пройти таски один за одним с помощью SQL Injection. Мне очень помог курс без него я не смог продвинуться дальше пятого таска. Поэтому всем советую, кто интересуется SQLi. Это первая часть, если будет интересно - напишите коммент, продолжу. Хотел сначала разбить на две части, но лень писать сразу. Поэтому эта 1/3.

fantasy.png
Итак,
The Lord of the SQLi:The Fellowship of the SQLi, 2021
Антураж прикольный, картинки добавил от нейросетей.
Предстоит 48 тасков, каждый назван в честь мифического существа. Правила простые:
- Не атаковать другие БД
- Не эксплуатировать сервер
- Не ДДосить

IMAGE#6d7a5004-b23c-4d1f-8c00-2c20507cfe0f.png


Screenshot from 2023-07-19 18-08-51.png


После прохождения всех монстров победителя добавят в Зал Славы. У каждого или почти каждого таска может быть несколько решений. Поэтому прежде чем открывать спойлер с решением, рекомендую самому попробовать несколько вариантов. Во много таски достаточно простые и сложности начинаются после 17-20 таска.

1. Первый монстр - Gremlin

IMAGE#2159e2ee-f546-49df-9b36-fc42160d99ca.png


Перед нами страница, показывающая запрос БД и код php. Что может быть проще? Проверяются "prob", "_", ".", "(", ")" не зависимо от регистра. Иначе выскакивает сообщение "No Hack ~_~". Так же еще раз напоминают про правила не атаковать другие таблицы.
Нам нужно выбрать любой существующий id из таблицы и тогда пройдем таск.

Screenshot from 2023-07-19 18-45-04.png


Добавляем кавычку и true, не забываем про комментарий. Все ненужное нам отбрасывается из запроса и Gremlin clear!

Screenshot from 2023-07-19 18-45-36.png

2. Далее следует - Cobolt (скорее всего имелся в виду Cobold)

IMAGE#5b894e93-6729-4221-9639-594e85f84fa7.png

Здесь опять же проверяются "prob", "_", ".", "(", ")". Но теперь надо выбрать id админа.

Screenshot from 2023-07-19 18-48-07.png


После первого таска, когда разобрались как все работает - cobolt пролетает за пару секунд Пишем в id=admin, все остальное отбрасываем

3. Goblin

IMAGE#6f1ffcf5-e004-4429-a3f2-249e9de55de9.png

Нам надо пройти с id админа. К проверке добавляются одинарная, двойная и обратная кавычка.

Screenshot from 2023-07-19 18-54-36.png


Но они нам и не понадобятся.

Как мы видим из кода, no={$_GET[no]} без обрамления, поэтому кавычки вообще не нужны для инъекции.
.php?no=0 - нет реакции
.php?no=1 - Hello, Guest. Хорошо, но не то что нужно. Нам нужен админ

Возвращаемся к нулю, добавляем логический оператор or и истинное значение, к примеру, true.
Hello, Guest

Далее у меня был тупик. Я перепробовал много вариантов и случайно попробовал limit... и это сработало!

Сначала проверил с первой строки
.php?on=0%20or%201=1%20limit%200,1
Потом пропустил первую строку
.php?no=0%20or%201=1%20limit%201,1
И получил:

Screenshot from 2023-07-19 18-55-58.png


Идем дальше!


4. Orc

IMAGE#f309fde1-9923-41ba-ab62-e0cf9b7bc6fa.png

"Сфоткай меня как будто я хакер"

Тут добавилась вторая проверка, уже недостаточно для прохода просто указать админа. Нужен также правильный пароль

Screenshot from 2023-07-19 19-02-48.png

Указываем id=admin. Любой очевидно неправильный пароль, добавляем кавычку, чтобы осуществить инъекцию.
Добавляем логический оператор or и истинное значение. Получаем php?id=admin&pw=1' or true--+-
Orc нас приветствует как admin, но дальше не пускает

Тогда добавляем к истинному условию другие утверждения. И отсутствие/наличие приветственной надписи будет сообщать нам о верных шагах.
То есть самая обычная слепая инъекция.

С помощью операторов сравнения и length определяем длину пароля
php?pw=1234' or true and length(pw)=8-- -

Далее самое нудное - перебор. Наверное, следовало автоматизировать процесс и сервер не банит, но я об этом тогда не подумал. Можно через регулярку "and pw regexp '^095[0-9]?' -- -" или через asci "and ascii(substring((pw),2,1))=57", но первый вариант мне ближе.
Перебором выясняем пароль, сообщаем орку и проходим дальше

5. Wolfman

IMAGE#efdc6e51-3016-4120-8840-861610601357.png


К фильтрации "prob", "_", ".", "(", ")" добавляется пробел
Также в запросе уже указан id как guest, а нам надо пройти под id=admin

Screenshot from 2023-07-19 19-34-02.png


Ничего сложного нет в этом таске, нас постепенно подготавливают к грядущим битвам.
Заменить пробел можно множеством способов. Например,

%09 – табуляция
%0A – символ новой строки
%0D – возврат каретки
%0B – вертикальная табуляция
%0C – символ новой страницы

Можно, также, пробел заменить с помощью комментария /**/, но в этом таске не сработало. Я использовал символ новой строки(%0A), так как легко запоминается и не надо гуглить.

Добавляем логический оператор or и истинное значение
.php?pw=3'%0Aor%0A1=1%09--'

Нас приветсвуют как Гостя

Screenshot from 2023-07-19 19-05-51.png


Меняем истинное значение на id=admin
Clear!

6. Darkelf

IMAGE#525cb58d-13a9-4d81-a807-1071389ba210.png


Тут идет проверка на 'prob', '_', '.', '(', ')', 'or', 'and'. Чтобы пройти таск, нам нужно пройти под админом. Все очень просто.

Screenshot from 2023-07-19 19-09-44.png


'or' можно заменить на ||
Если есть необходимость в 'and' => &&
Далее как в предыдущем таске

7. Orge

IMAGE#886d9a1f-81f7-4bd3-8ad3-a446a48028f2.png


Выглядит угрожающе, но этот таск - одна из комбинаций того, что мы уже проходили.

Screenshot from 2023-07-19 19-34-53.png


'and' заменяем на && и перебор с помощью регулярки
query : select id from prob_orge where id='guest' and pw='1' || true && pw regexp '^[0-9]' -- -''

8. Troll

IMAGE#835e89c6-8972-4320-9e73-ce3311579eb5.png


Фильтруются кавычки и 'admin'. И нам как раз надо подставить в id значение admin.

Screenshot from 2023-07-19 19-13-46.png


Решилось за несколько секунд добавлением обратного слэша в середине слова

9. Vampire

IMAGE#32c0af6e-3e05-4909-a66b-9b6922bfa536.png


Фильтруются кавычки и 'admin', все переводится в нижний регистр

Screenshot from 2023-07-19 19-17-06.png


Вставляем админа в другого админа.

Следующие пять противников - комбинация из предыдущих тасков, не представляющие какой-либо сложности и оригинальности. Поэтому пробежимся галопом.

10-15. Skeleton, Golem, DarkKnight, Bugbear, Giant, Assassin

IMAGE#7a1bfb42-7653-4099-a07d-8db750865ded.png


Skeleton
Делаем инъекцию в pw, добавляем логический оператор, id с админом

Golem
Надо выяснить пароль админа, чтобы зайти. Есть фильтры, но их несложно обойти.
pw='lol' || id like 'admin' && pw rlike '^[0-9]'-- -'

DarkKnight
Здесь фильтры также не мешают использовать регулярку. Если пароль кажется очень длинным - вытаскиваете не тот пароль :)

BugBear
Также обходим фильтры, вытаскиваем через регулярку. Пробел обходим символом новой строки как в предыдущих тасках

Giant
Этот таск как передышка, но мы ведь вовсе не устали, верно?
Много фильтров, но один забыли про вертикальную табуляцию :)

Assassin
Просто подобрать пароль, причем достаточно узнать первые три символа
16. Succubus

Screenshot from 2023-07-19 19-44-06.png


Здесь уже поинтересней, много фильтров.

Screenshot from 2023-07-19 19-22-56.png


Здесь поможет фрагментированная инъекция. Экранируем закрывающую кавычку в значении id и добавляем булевое истинное значение в pw.

Screenshot from 2023-07-19 19-24-34.png

Дальше таски намного интересней, честно. Продолжим?
 
Последнее редактирование модератором:
Мы в соцсетях:

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