Введение

Как этичный хакер, я искал уязвимости в веб-приложении известной компании. Я сканировал код несколько раз, но что-то мне казалось неправильным. Именно тогда я решил поближе взглянуть на 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! Это показывает, насколько важно, чтобы этичные хакеры работали над повышением безопасности цифровых платформ.