Writeup Web | Документальный архив | HackerLab

HackerLabDocumentStore.webp

Название: Документальный архив
Категория: Web
Уровень: Средний
Ссылка на задание: https://hackerlab.pro/en/categories/web/5703df5b-b34c-4cb9-9fb3-d5aef18c1640
Баллы: 500


Reconnaissance

Нас встречает обычная страничка с приглашением. Давайте попробуем что-нибдуь найти в этом архиве.
1780773906905.webp

Получаем сообщение, что введён неверный формат JSON... Так, хорошо, значит у него есть какие-то поля и значения для них. Так как нам на главный экран сразу же вывелось несколько документов, давайте отправим запрос в Burp и посмотрим как он их выводит и с какими полями.
1780774038063.webp

Ага, теперь мы видим поля которые используются - _id, title, summary. Если внимательно посмотреть, то можно обнаружить, что пропущен документ с _id равным 3. Кажется, там что-то интересненькое. Давайте попробуем напрямую попросить этот документ.
JSON:
{
    "_id":3
}
Видим что код вернул 200, но ничего не вывел, это означает что такой документ есть, но для нас он не доступен. И кажется я начал догадываться в чём тут дело. Здесь с вероятностью в 90% - NoSQL Injection с использованием Broken Access Control.
1780774198716.webp

Хорошо, я думаю, что защита здесь строится на ролях, т.е если условное поле role=admin, то он выведет нам содержимое. Чтобы не гадать, какое там имя пользователя и поле role ли там вообще, воспользуемся $or.
JSON:
{"$or": [{"_id":3}, {"_id": 999999}]}
Круто, мы увидели, что находится в 3 документе. Однако флага тут нет, и не мудрено, таск-то средней сложности, поэтому думаем дальше.
1780774759779.webp



Exploitation

Вполне справедливо, что администратор мог скрыть поле, в котором и есть флаг, давайте попробуем найти скрытое поле.
JSON:
{
    "$or":[
        {
            "_id":3,
            "flag":{
                "$exists":true
            }
        },
        {
            "_id":999999
        }
    ]
}
Благодаря такому пейлоуду, мы поймём - существет ли поле flag или нет. Сервер вернул документ, это означает что условие истино и такое поле есть. Теперь осталось вывести его содержимое, я использовал такой payload для добычи флага посимвольно, т.к не понял как его вывести.
JSON:
{
    "$or":[
        {
            "_id":3,
            "flag":{
                "$regex":"^CODEBY{"
            }
        },
        {
            "_id":999999
        }
    ]
}
В этом коде я заранее ввёл фразу "^CODEBY{", чтобы проверить, если она в начале строки, сервер вывел документ, значит это 100% флаг. $regex - это поле для регулярных выражений. Теперь я посимвольно добавляю в конец строки буквы и смотрю на рекцию сервера.
Чтобы заниматься не таким жёстким мазахизмом, оптимизируем эту рутину в Burp Suite. Отправляем запрос в Intruder и в нём добавляем Position "Add $" после "^CODEBY{". У вас должно выглядеть как на скрине ниже.
1780775362776.webp

Так же, как вы заметили, я добавил словарь в котором все латинские буквы (в том числе и заглавные) и спец. символ "_" в качестве пробела. Далее мы запускаем атаку, и сортируем вывод по длине ответа.
1780775458454.webp

599 - самый длинный ответ. Смотрим на какую букву он среагировал и сохраняем её. Далее закрываем атакующее окно и дописываем флаг, тем самым собирая его как лего.
1780775541101.webp

Вот тут добавил букву и снова начал атаку. Надеюсь, я понятно до вас донёс свою методологию.
Важно: Забыл напомнить, чтобы вы добавили "}" как спец. символ, чтобы точно понять где конец флага.
Поздравляю с добытым флагом!
 
Мы в соцсетях:

Взломай свой первый сервер и прокачай скилл — Начни игру на HackerLab

Похожие темы

🚀 Первый раз на Codeby?
Гайд для новичков: что делать в первые 15 минут, ключевые разделы, правила
Начать здесь →

Популярный контент

🔴 Свежие CVE, 0-day и инциденты
То, о чём ChatGPT ещё не знает — обсуждаем в реальном времени
Threat Intel →
💼 Вакансии и заказы в ИБ
Pentest, SOC, DevSecOps, bug bounty — работа и проекты от проверенных компаний
Карьера в ИБ →

HackerLab