Название: Документальный архив
Категория: Web
Уровень: Средний
Ссылка на задание: https://hackerlab.pro/en/categories/web/5703df5b-b34c-4cb9-9fb3-d5aef18c1640
Баллы: 500
Reconnaissance
Нас встречает обычная страничка с приглашением. Давайте попробуем что-нибдуь найти в этом архиве.Получаем сообщение, что введён неверный формат JSON... Так, хорошо, значит у него есть какие-то поля и значения для них. Так как нам на главный экран сразу же вывелось несколько документов, давайте отправим запрос в Burp и посмотрим как он их выводит и с какими полями.
Ага, теперь мы видим поля которые используются - _id, title, summary. Если внимательно посмотреть, то можно обнаружить, что пропущен документ с _id равным 3. Кажется, там что-то интересненькое. Давайте попробуем напрямую попросить этот документ.
JSON:
{
"_id":3
}
Хорошо, я думаю, что защита здесь строится на ролях, т.е если условное поле
role=admin, то он выведет нам содержимое. Чтобы не гадать, какое там имя пользователя и поле role ли там вообще, воспользуемся $or.
JSON:
{"$or": [{"_id":3}, {"_id": 999999}]}
Exploitation
Вполне справедливо, что администратор мог скрыть поле, в котором и есть флаг, давайте попробуем найти скрытое поле.
JSON:
{
"$or":[
{
"_id":3,
"flag":{
"$exists":true
}
},
{
"_id":999999
}
]
}
JSON:
{
"$or":[
{
"_id":3,
"flag":{
"$regex":"^CODEBY{"
}
},
{
"_id":999999
}
]
}
Чтобы заниматься не таким жёстким мазахизмом, оптимизируем эту рутину в Burp Suite. Отправляем запрос в Intruder и в нём добавляем Position "Add $" после "^CODEBY{". У вас должно выглядеть как на скрине ниже.В этом коде я заранее ввёл фразу "^CODEBY{", чтобы проверить, если она в начале строки, сервер вывел документ, значит это 100% флаг. $regex - это поле для регулярных выражений. Теперь я посимвольно добавляю в конец строки буквы и смотрю на рекцию сервера.
Так же, как вы заметили, я добавил словарь в котором все латинские буквы (в том числе и заглавные) и спец. символ "_" в качестве пробела. Далее мы запускаем атаку, и сортируем вывод по длине ответа.
599 - самый длинный ответ. Смотрим на какую букву он среагировал и сохраняем её. Далее закрываем атакующее окно и дописываем флаг, тем самым собирая его как лего.
Вот тут добавил букву и снова начал атаку. Надеюсь, я понятно до вас донёс свою методологию.
Поздравляю с добытым флагом!Важно: Забыл напомнить, чтобы вы добавили "}" как спец. символ, чтобы точно понять где конец флага.