Разработчики любят интерфейсы программирования приложений (API), потому что они позволяют им пользоваться услугами без необходимости их создавать. Но чувствуют ли разработчики, которые создают API так же, учитывая, что API подвергает их услуги потенциальному хаосу с точки зрения безопасности?
Я работал со многими поставщиками за эти годы и воспользовался их API, чтобы интегрировать свои услуги в мои проекты. Некоторые легко интегрировать, а другие не так. В конце концов, интеграция обеспечивает большую ценность для моего проекта. Кроме того, мои навыки и знания увеличились благодаря испытаниям интеграции.
В этом случае я описываю урок, который был подтвержден и подкреплен на протяжении конкретной интеграции. OWASP Top Defe Risks Chiefete документирует десять самых важных рисков применения. Разработчики и проекты должны серьезно относиться к этому риску. Реализация этих рисков может привести к значительному повреждению.
В этом тематическом исследовании рассматривается один конкретный риск OWASP Top Deven.
OWASP A1 Инъекция
Риск инъекции считается самым высоким по OWASP. Инъекция позволяет злоумышленнику идти на компромисс, уничтожить или контролировать систему. Входная проверка и дезинфекция – это один из способов предотвратить его. OWASP рекомендует: «Предпочтительным вариантом является использование безопасного API, который полностью избегает использования интерпретатора или предоставляет параметризованный интерфейс» [ Топ 10-2017 A1-инъекция-OWASP ]
Кажется здравым смыслом.
Почему это все еще самый высокий риск, если разработчикам должно быть очевидно защищать от него? График и стоимость, вероятно, являются наиболее заметными противниками решения этого риска. Ваш менеджер программного обеспечения может сообщить разработчику: «Просто заставьте его работать, потому что нам нужно выпустить продукт в ближайшее время» или «Мы запускаем бюджет. Сделайте заметку и закрепите его позже. «Разработчик может подумать», это достаточно безопасно. Кроме того, у нас есть брандмауэры и антивирус, чтобы защитить от вторжения. «Какими бы ни были причины, это простое решение часто упускается из виду.
Как я использовал API поставщика
Я работал над сценарием, чтобы продвигать данные наших поставщиков с одного этапа на другой этап в процессе. Трубопровод – это набор сред, настроенные для продвижения кода разработки для использования производства. В нашем трубопроводе у нас была среда разработки, обстановка тестирования и производственная среда. Сценарии соединились с данными о среде разработки и создали их в среде тестирования. Когда все тесты прошли, сценарии создали данные в производственной среде.
API предоставил интерфейсы для входа в систему, входа в систему, извлечения объектов данных, создания объектов данных и удаления объектов данных. Рабочий процесс скрипта работал следующим образом: войдите в одну среду, извлеките основные объекты данных, извлеките детские объекты, выходите из системы, войдите в другую среду, используйте полученные данные для создания первичных и дочерних объектов и выходите из системы. Ниже приведен пример того, как это сработало.
#!/usr/bin/python import vendor_api import json # log into the deveplopment environment try: vendor_api.login('username', 'password', 'development') except: exit(1) # get primary object # retrieves JSON structure # { # "uuid": "primary uuid value", # "attribute1": "value1", # "attribute2": "value2", # "children": ["uuid1", "uuid2"] # } primary_object = json.loads(vendor_api.get(vendor_api.PRIMARY)) # get child objects one at a time # retrieves JSON structure # { # "uuid": "child uuid value", # "attribute1": "value1", # "attribute2": "value2" # } child_objects = [] for x in range(0, len(primary_object['children']): uuid = primary_object['children'][x] child_object = json.loads(vendor_api.get(vendor_api.CHILD, uuid)) if "uuid" in child_object: child_objects.append(child_object) # log out vendor_api.logout() # log into the testing environment try: vendor_api.login('username', 'password', 'testing') except: exit(2) # create primary object # API documentation states the following required structure: # { # "attribute1": "value1", # "attribute2": "value2" # } try: vendor_api.post(vendor_api.PRIMARY, json.dumps(primary_object)) except: exit(3) # create child objects # API documentation states the following required structure: # { # "attribute1": "value1", # "attribute2": "value2" # } for x in range(0, len(child_objects)): try: vendor_api.post(vendor_api.CHILD, json.dumps(child_objects[x])) except: print("Failed to created child object {}".format(child_objects[x]['uuid'])) # log out vendor_api.logout() exit(0)
Проблемы с использованием API
Вы замечаете что -то не так? (Игнорируйте мое отсутствие превосходства кодирования.) Вы заметили, что я не удалил uuid
атрибут из primary_object
объект и child_objects
Объекты, или я не удалил Дети
атрибут из primary_object
? Почему эти проблемы?
Давайте предположим, что у продавца был строгий API. Когда я прошел uuid
и Дети
к vendor_api.post
для vendor_api. Первичный
Тип объекта, API поставщика должен был вернуть Неверные атрибуты
отклик. Более слабый API просто проигнорировал бы их без ответа на ошибку. Чрезвычайно свободный API принял бы их. Чрезвычайно свободный API может принять инъекцию, такую как rm -rf/
командование
Как я испортил базу данных с случайной атакой инъекции
Я глубоко провел тестирование, и мои тестовые сценарии продолжали проваливаться. Я не мог понять, почему они терпят неудачу. Я был уверен, что делал должным образом в среде разработки; Там все работало нормально. Те же сценарии терпят неудачу в среде тестирования. В конце концов я связался с поставщиком, чтобы выяснить, в чем может быть проблема. Мне нужна была помощь поставщика, так как они предоставили ограниченную отладку и нуждались в отладке в своей инфраструктуре.
Их первый диагноз: вы злоупотребляете API. Я объяснил свою логику сценария по телефону и отправил им по электронной почте мой сценарий. Они признались, что мой сценарий казался хорошим.
Их второй диагноз: ваши тестовые сценарии неверны. Я объяснил свои тестовые сценарии по телефону и отправил им по электронной почте мои сценарии. Они признали, что мои тестовые сценарии были приемлемы.
Какой был источник проблемы?
Они продолжали исследовать некоторое время и возвращались со своим выводом: мне удалось создать дублирующиеся UUID в нескольких средах в системе, которая требовала уникальных UUID во всем мире. Я спросил, как это было возможно. Они признали, что их API принял все атрибуты и входные данные для детей -объектов. Они считали свои основные объекты наиболее важной информацией и предприняли значительные усилия по обеспечению этой части API. Учитывая стоимость и график, они чувствовали, что было менее важно обеспечить часть API дочернего объекта. К счастью, я был партнером в обнаружении этой уязвимости до того, как их API был широко принят, или злонамеренный агент попытался использовать этот вывод. Потребовалось несколько дней, чтобы обеспечить API и исправить все среды.
Такая ситуация показывает, почему инъекция A1 по -прежнему является самым высоким риском безопасности OWASP.
Перед тем, как ты уйдешь
Присоединяйтесь к моему списку рассылки, чтобы получить обновления о моем письме.
Посетите miguelacallesmba.com/subscribe и зарегистрироваться.
Оставайся в безопасности, Мигель
об авторе
Мигель является основным инженером по безопасности и является автором книги « без сервера безопасности ». Он работал над несколькими без серверных проектов в качестве разработчика и инженера по безопасности, внес свой вклад в проекты без сервера с открытым исходным кодом и работал над крупными военными системами в различных инженерных должностях.
Первоначально опубликовано на Secjuice.com
Изображение по Сгоревший тост на Dribbble
Оригинал: “https://dev.to/miguelacallesmba/case-study-wreaking-havoc-via-an-api-with-python-code-1afi”