Чем работал
katana - краулинг с
--js-crawl. Собрал все 10 JS-чанков и показал структуру бандлов.grep/jq - парсинг минифицированного JS. Искал
https://, fetch(, baseURL, endpoint, apiKey.## Почему сразу в JS
SPA отдаёт 200 на любой путь - фаззинг директорий бесполезен. Серверных эндпоинтов не видно. Классическая разведка (краулинг, брутфорс путей) ничего не даёт.
Но Web3-проект не может спрятать логику на клиенте - это архитектурное ограничение. Значит единственный путь — читать бандлы. Source maps попробовал первым делом -
.js.map отдавали HTML (SPA catch-all). Пришлось вручную.Почему сразу к
/wertИз 17 эндпоинтов большинство - информационные GET. Интересны те, которые что-то делают: принимают POST и меняют состояние.
/wert сразу выделился, потому что принимает параметры платежа - возвращает криптографическую подпись - подпись идёт в платёжный шлюз. Первый вопрос: "а что он подпишет, если подменить адрес контракта?". Подписал всё без единой проверки.Что не сработало
- Фаззинг путей - SPA отдаёт 200 на всё, бессмысленно
- SQLi - MongoDB на бэкенде, нет точек ввода в SQL
- XSS - формы отключены, комментарии закрыты, поиск HTML-энкодит
- Source maps - все
.js.map отдают SPA catch-allПолучается что подтверждение того, что стандартные вектора закрыты, сужает фокус на логические баги - где и нашлась главная находка.