Как найти небезопасные строки подключения MongoDB в общедоступных репозиториях GitHub

Как найти небезопасные строки подключения 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)*


Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE