Введение
Как этичный хакер, я искал уязвимости в веб-приложении известной компании. Я сканировал код несколько раз, но что-то мне казалось неправильным. Именно тогда я решил поближе взглянуть на JavaScript, который работал во внешнем интерфейсе приложения.
Копнув глубже, я наткнулся на золотую жилу конфиденциальных данных: жестко запрограммированные секреты, которые использовались для обработки платежей через Stripe. Секреты, о которых идет речь, были не чем иным, как публикуемым ключом Stripe API и самим секретным ключом. Эти ключи хранились во внешнем интерфейсе приложения, что делало их легко доступными для любого, у кого есть злой умысел.
Что меня больше всего удивило, так это то, что у этих секретов не было общего имени, которое можно было бы легко подобрать сканером или инструментом. Они были искусно спрятаны в JavaScript, что затрудняло их обнаружение. Однако, благодаря своему опыту и знаниям, я смог их обнаружить и сразу же уведомил об этом компанию.
Сопоставление источника JavaScript
Сопоставление исходного кода JavaScript сопоставляет код в уменьшенном файле JavaScript с исходным исходным кодом, что полезно для отладки, позволяя разработчикам легко найти источник ошибки. Минификация удаляет такую информацию, как комментарии, имена функций и имена переменных, что усложняет отладку. Исходная карта создается вместе с уменьшенным файлом, сопоставляя скомпилированный код с исходным кодом, помогая браузеру отображать более полезное сообщение об ошибке при обнаружении ошибки в скомпилированном коде.
Хотя карты исходного кода полезны для разработки и отладки, они также могут представлять угрозу безопасности, если в исходный исходный код включены такие секреты, как ключи API или пароли. Эта информация может быть раскрыта через исходную карту, что позволит получить несанкционированный доступ к конфиденциальным ресурсам. В результате важно избегать включения секретов в код JavaScript и вместо этого использовать безопасное хранилище или переменные среды, а также следить за тем, чтобы в процессе сборки удалялись любые комментарии или данные, которые могут раскрыть конфиденциальную информацию в исходной карте.
Поиск ошибки
С помощью инструмента SourceMapper мне удалось преобразовать минифицированный JavaScript в более удобочитаемую версию. Пример использования этого инструмента показан ниже:
doi@asov:~$ ./sourcemapper -output dhubsrc -url https://hub.docker.com/public/js/client.356c14916fb23f85707f.js.map [+] Retriving Sourcemap from https://hub.docker.com/public/js/client.356c14916fb23f85707f.js.map [+] Read 23045027 bytes, parsing JSON [+] Retrieved Sourcemap with version 3, containing 1828 entries [+] Writing 9076765 bytes to dhubsrc/webpack:/js/client.356c14916fb23f85707f.js [+] Writing 1014 bytes to dhubsrc/webpack:/webpack/bootstrap 356c14916fb23f85707f [+] Writing 3174 bytes to dhubsrc/webpack:/app/scripts/client.js [+] Writing 281 bytes to dhubsrc/webpack:/~/babel-runtime/helpers/interop-require-default.js [+] Writing 151 bytes to dhubsrc/webpack:/~/babel-core/polyfill.js {snip}
Как только код был в читаемом формате, потребовалось несколько минут поиска в JavaScript, чтобы найти это:
export const S0 = 'pk_live_[REDACTED]es33'; export const S1 = 'sk_live_[REDACTED]du8d'; export const STRIPE_HEADER_NAME = 'REDACTED'; export const CURRENCY = 'USD'; export const STRIPE_PAY_BUTTON = 'Pay for REDACTED';
Ты видишь это? Да! Это секретный ключ API!! Stripe имеет очень удобный API, с помощью которого можно проверить баланс этой учетной записи или перевести деньги на другую учетную запись. Привет биткойн! (шутя)
❯ curl https://api.stripe.com/v1/balance -u sk_live_REDACTEDdu8d {"object": "balance", "available": [ { "amount": 1761520.76, "currency": "usd", "source_types": { "card": 0 } } ] }
Заключение
Как вы можете себе представить, я был в восторге, получив вознаграждение в размере 25 000 долларов от службы безопасности компании. Было невероятно приятно осознавать, что мои усилия помогли обезопасить платформу и предотвратить использование злоумышленниками этой критической уязвимости.
Что еще более удивило, так это реакция компании на мое открытие. Они так оценили мой этический подход, что даже пошутили, что счастливы, что я не снял деньги со счета Stripe! Это показывает, насколько важно, чтобы этичные хакеры работали над повышением безопасности цифровых платформ.