Обход панели администратора только с помощью JS-файла
Этичный Хакер
Данная статья является переводом и ведётся со слов автора, оригинал тут.
Во-первых, я хочу рассказать вам о веб-сайте. Это было важной проверкой проекта Курдской компании, поскольку они создают профессиональные веб-сайты для бизнеса/людей/компаний/правительства.
Позвольте мне рассказать вам, как нам был брошен вызов! Для нас это был не просто обычный обход админки. Менеджер компании сказал, что это профессиональный сайт, созданный командой экспертов, и практически невозможно найти здесь даже одну ошибку (они думали, что язык программы, который они используют, очень защищен, но это не было чем-то важным для нас).
Давайте без лишних слов перейдём к теме и посмотрим, где был этот баг.
Итак, команда предоставила мобильное приложение, написанное на Flutter, и домен веб-сайта. Во время работы над проектом (21 декабря 2021 г.) было очень сложно собирать запросы приложений, созданных Flutter. Поэтому мы не стали тратить время на мобильное приложение и решили поработать над веб-сайтом, так как это была серверная часть мобильного приложения.
Мы просто пытались найти панель администратора, потому что основной домен был всего лишь одной страницей для загрузки приложения.
После перебора поддоменов мы обнаружили, что на веб-сайте есть такой поддомен [( admin.project.com) — мы используем project.com в качестве доменного имени проекта в этой статье]. Как всегда, сначала мы посетили поддомен, который показался нам чувствительным.

И когда мы посетили поддомен, мы просто получили этот портал входа.

Первым полем ввода был номер мобильного телефона (чтобы администратор мог войти в систему по своему номеру телефона), а вторым полем был пароль. Портал был очень хорош, как казалось, но есть ли что-то ещё?
- Брутфорс паролей был невозможен (выскакивал код
301 Too Many Requests). - Фаззинг каталогов не дал результатов.
- Не было никакой регистрационной формы, чтобы попробовать обходные пути.
- Веб-сайт был новым, поэтому на нем не было никаких связанных URL-адресов или другой информации.
Итак, можем ли мы что-то сделать ещё?
Конечно и как всегда! Взглянуть на исходный код — это хорошая часть поиска ошибок! И когда мы взглянули на страницу, там была только одна строка кода, на которой нужно было сосредоточиться, и это был файл Javascript.

Это было началом, а также сложной и самой приятной частью поиска недостатков безопасности, потому что вы должны читать JS-файл построчно, чтобы понять код и узнать, как работает веб-сайт. Это доаольно сложно, но все же очень приятно!
Открыв файл JS, мы взглянули на него, пытаясь заметить чувствительные слова, такие как (admin, config, password, token, email, .conf), и, к счастью, когда мы попробовали token , мы нашли этот сочный фрагмент кода:

([“TOKEN”,”hxcdjskhck643782bcdshcdsjk231cbdns”,”fullname”,a,”phone”,b,”city”,c,”superadmin”,d,”permisions”,e,”password”,f],t.N,p)) s=3 return A.U(A.ck(null).cc(“https://project.app/RedactedAppBackend/dashboard/addAdmin.php",c,n),$async$uH)
Мы видим тут POST-запрос, а также у нас есть параметры тела запроса:
TOKEN=hxcdjskhck643782bcdshcdsjk231cbdnsfullname phone superadmin permissions password
Но что мы можем с этим сделать? Сначала мы должны были узнать, что произойдет, если мы отправим эти данные в запросе? Подумав о конечной части URL, которая называется addAdmin.php, мы знали, что она создаст еще одну учетную запись администратора:
Redacted/AppBackend/dashboard/addAdmin.php
Итак, мы просто отправили POST-запрос с данными, которые получили из JS-файла.

Как вы можете видеть, ответ okk, что означает, что мы успешно создали другую учетную запись администратора, и когда мы попробовали введённый номер телефона и пароль, то подучили полный доступ к панели.

Мы успешно взломали ее и получили за это награду в $$$.
Что важно для охотников за ошибками:
- Сосредоточьтесь на файлах JS.
- Всегда начинайте искать уязвимости так, как будто вы первый человек, который нашел эту страницу или конечную точку.
- Нет ничего невозможного.
Что важно для разработчиков:
Не помещайте конфиденциальные данные, такие как токены, в исходные коды на стороне клиента.