
Человеко- и машинно-читаемый формат тестирования веб-уязвимостей

explo — это простой инструмент для описания проблем веб-безопасности в формате, понятном человеку и машине.
Определяя рабочий процесс из запросов и условий, explo позволяет эксплуатировать уязвимости без
необходимости писать скрипты. Это даёт возможность делиться сложными уязвимостями в простом читаемом и исполняемом формате.
Пример извлечения csrf-токена и его использования в форме:
name: get_csrf
description: извлечь csrf-токен
module: http
parameter:
url: http://example.com/contact
method: GET
header:
user-agent: Mozilla/5.0
extract:
csrf: [CSS, "#csrf"]
---
name: exploit
description: эксплуатирует уязвимость SQL-инъекции с валидным csrf-токеном
module: http
parameter:
url: http://example.com/contact
method: POST
body:
csrf: "{{get_csrf.extracted.csrf}}"
username: "' SQL INJECTION"
find: You have an error in your SQL syntax
В этом примере файла определения проблема безопасности проверяется путём выполнения двух шагов, которые выполняются сверху вниз. Последний шаг возвращает успех или неудачу в зависимости от того, найдена ли строка 'You have an error in your SQL syntax'.
pip install explo
git clone https://github.com/dtag-dev-sec/explo
cd explo
python setup.py install
explo [--verbose|-v] testcase.yaml
explo [--verbose|-v] examples/*.yaml
В папке examples/ есть несколько примеров тестовых сценариев.
$ explo examples/SQLI_simple_testphp.vulnweb.com.yaml
Вы также можете использовать explo как библиотеку Python:
from explo.core import from_content as explo_from_content
from explo.core import ExploException, ProxyException
def save_log(msg):
print(msg)
try:
result = explo_from_content(explo_yaml_file, save_log)
except ExploException as err:
print(err)
HTTP/HTTPS прокси и таймаут для запросов можно задать через переменные окружения. Таймаут по умолчанию — 15 секунд.
$ export http_proxy=http://proxy:8089
$ export https_proxy=https://proxy:8090
$ export timeout=10
$ explo ...
Модули могут быть добавлены для расширения функциональности и классов уязвимостей.
Модуль http позволяет выполнить HTTP-запрос, извлечь содержимое и выполнить поиск/проверку содержимого.
Следующие данные становятся доступны для следующих шагов:
stepname.response.contentstepname.response.cookiesresponse.extracted.variable_nameЕсли задан параметр find_regex, выполняется поиск по регулярному выражению в теле ответа. Если он не срабатывает, модуль возвращает неудачу и останавливает выполнение текущего рабочего процесса (и всех шагов).
При извлечении с помощью регулярных выражений используйте группу захвата extract, чтобы пометить извлекаемое значение (см. пример ниже).
Для ссылки на cookies укажите имя предыдущего шага, из которого нужно взять cookies (cookies: the_other_step.response.cookies).
Примеры параметров:
parameter:
url: http://example.com
method: GET
allow_redirects: True
headers:
User-Agent: explo
Content-Type: abc
cookies: stepname.response.cookies
body:
key: value
find: искать строку
find_regex: искать (reg|ular)expression
find_in_headers: искать строку в заголовках
expect_response_code: 200
extract:
variable1: [CSS, '#csrf']
variable2: [REGEX, '<input(.*?)value="(?P<extract>.*?)"']
Модуль http_header позволяет проверить, отсутствует ли в ответе определённый набор заголовков (и значений). Все остальные параметры идентичны модулю http.
Следующие данные становятся доступны для других модулей:
stepname.response.contentstepname.response.cookiesПримеры параметров:
parameter:
url: http://example.com
method: GET
allow_redirects: True
headers:
User-Agent: explo
Content-Type: abc
body:
key: value
headers_required:
X-XSS-Protection: 1
Server: . # все значения допустимы
Модуль sqli_blind способен обнаруживать слепые SQL-инъекции на основе временных задержек.
Следующие данные становятся доступны для других модулей:
stepname.response.contentstepname.response.cookiesПримеры параметров:
parameter:
url: http://example.com/vulnerable.php?id=1' waitfor delay '00:00:5'--
method: GET
delay_seconds: 5
Если порог в 5 секунд (delay_seconds) превышен, проверка возвращает true (и, следовательно, успех).
Блок metadata — это специальный блок, который может быть добавлен как первый блок в .yaml файл для добавления метаданных к уязвимости для дальнейшей обработки. Это полезно, когда explo используется как библиотека, а метаданные для каждого описания уязвимости могут быть прочитаны с помощью meta_from_content(content). Этот модуль не требует имени или описания.
Примеры:
module: metadata
parameter:
cvss: 8.9
author: Robin Verton
---
name: login
description: вход с тестовыми учётными данными
module: http
parameter:
url: http://testphp.vulnweb.com/userinfo.php
method: POST
body:
uname: test
pass: test