Как найти небезопасные строки подключения MongoDB в общедоступных репозиториях GitHub
9 марта 2022 г.Я попытался посмотреть, смогу ли я получить строки подключения к базе данных Mongo других людей, просто выполнив поиск в GitHub. Да, я нашел несколько.
Я попытался подключиться к нескольким, и да, это сработало!
Перед тем, как позвать на меня копов, выслушай мою предысторию. 🤗
Я работал над приложением NodeJS/Express для практики и вспомнил, что отправил файл .env
в свой удаленный репозиторий.
Работая над исправлением этой ошибки, я думал о том, сколько людей сделали бы эту ошибку и как она останется где-то в истории коммитов, даже если секреты в конечном итоге станут неустановленными.
Поэтому я клюнул на приманку и сделал этот [поиск на GitHub] (https://github.com/search?p=1&q=mongodb%2Bsrv%3A&type=Code). Хотя большинство результатов не являются реальной строкой подключения, многие из них все еще живы и функционируют.
:::Информация
Отказ от ответственности: этот контент написан для того, чтобы помочь людям с безопасностью. Не в корыстных целях.
Как я просканировал 1000 репозиториев
На самом деле, GitHub Search API ограничивает 1000 результатов для каждого поиска.
Используя приведенные ниже сценарии, я смог сгенерировать репозитории, код которых включал mongodb+srv:
```tsx
// index.ts
импортировать dotenv из "dotenv"
dotenv.config()
импортировать аксиомы из «аксиос»;
импортировать fs из "fs/promises";
импортировать cliProgress из "cli-progress";
const jsonpath = "list_of_repo.json";
const makeSearch = async (страница: номер) => {
константная конфигурация = {
заголовки: {
Авторизация: Токен ${process.env.GITHUB_API_TOKEN}
,
const url = https://api.github.com/search/code?q=mongodb%2Bsrv+in:file&page=${page}&per_page=100
;
постоянный результат: {
элементы: { html_url: строка; репозиторий: {html_url: строка} }[];
} = ожидание axios.get(url, config);
// сделать объект из результата
пусть объект = {};
result.data.items.forEach((item) => {
obj[item.repository.html_url] = item.html_url;
ожидание addToJson (jsonpath, obj);
асинхронная функция addToJson (jsonpath: строка, данные?: объект) {
const oldJson = (ожидание fs.readFile(jsonpath)).toString();
пусть jsonData = JSON.stringify (данные, ноль, 2);
если (старый_сон) {
jsonData = JSON.stringify(
{ ...JSON.parse(oldJson), ...JSON.parse(jsonData) },
нулевой,
2
ожидание fs.writeFile (jsonpath, jsonData);
асинхронная функция main() {
// Я включил загрузчик прогресса CLI, потому что кому не нравятся загрузчики.
const bar1 = новый cliProgress.SingleBar(
cliProgress.Presets.shades_classic
// номер итерации 10
бар1.старт(10, 0);
для (пусть я = 1; я <= 10; я ++) {
ожидание makeSearch(i);
бар1.обновление(1);
бар1.стоп();
основной();
Предоставленные результаты не означают, что существует фактическая строка подключения к MongoDB, они только подразумевают, что репозитории в результате имеют код в файле, соответствующий mongodb+srv:
Я мог бы пойти дальше и создать скрипт для запуска поиска по каждому URL-адресу кода и запустить регулярное выражение для дальнейшего поиска фактической строки подключения, но в этом нет необходимости, поскольку моя цель — привлечь внимание общественности и как защитить себя.
Что я обнаружил и как мы можем защитить себя
Вот некоторые из моих открытий:
- Некоторые результаты включают в себя старые коммиты в истории коммитов: Как и моя ошибка, которая привела к этой статье, иногда мы забываем создать файл
.gitignore
в начале проекта и где-то размещаем некоторые секреты. в истории коммитов.
- Мы можем использовать такие инструменты, как GitGuardian, чтобы постоянно сканировать наш репозиторий на наличие секретов в исходном коде.
- Некоторые результаты включали сообщения из разных файлов журналов и файлов среды: Вероятно, это произошло из-за того, что не был включен
.gitignore.
GitHub предоставляет [репозиторий] (https://github.com/github/gitignore) с многочисленными типами шаблонов .gitignore
для разных языков, фреймворков, инструментов, IDE и т. д.
И я создал простой интерактивный интерфейс командной строки для создания шаблонов .gitignore
на основе списков GitHub.
Вы можете найти инструмент Interactive CLI для создания шаблонов .gitignore
здесь: https://www.npmjs.com/package/gittyignore
Спасибо, что прочитали! 🤗
- Ранее опубликовано [здесь] (https://blog.zt4ff.dev/i-tried-to-find-mongodb-connection-strings-over-1000-public-github-repositories)*
Оригинал