
PyJFuzz - фаззер JSON на Python
| Версия | 1.1.0 |
|---|---|
| Домашняя страница | http://www.mseclab.com/ |
| GitHub | https://github.com/mseclab/PyJFuzz |
| Автор | Daniele Linguaglossa (@dzonerzy) |
| Лицензия | MIT — (см. файл LICENSE) |
Зависимости
Для своей работы PyJFuzz требует некоторые зависимости: bottle, netifaces, GitPython и gramfuzz. Вы можете установить их автоматически с помощью setup.py.
Установка
Вы можете установить PyJFuzz следующей командой:
git clone https://github.com/mseclab/PyJFuzz.git && cd PyJFuzz && sudo python setup.py install
CLI-инструмент
После установки PyJFuzz создаст как библиотеку Python, так и утилиту командной строки с именем pjf (скриншот ниже)
Библиотека
PyJFuzz также может работать как библиотека; вы можете импортировать её в свой проект следующим образом:
from pyjfuzz.lib import *
Классы
Доступны следующие объекты/классы:
Примеры
Ниже приведены несколько тривиальных примеров реализации программы на базе PyJFuzz.
simple_fuzzer.py
from argparse import Namespace
from pyjfuzz.lib import *
config = PJFConfiguration(Namespace(json={"test": ["1", 2, True]}, nologo=True, level=6))
fuzzer = PJFFactory(config)
while True:
print fuzzer.fuzzed
custom_techniques.py
from argparse import Namespace
from pyjfuzz.lib import *
# Techniques may be defined by group , or by technique number
# groups are CHTPRSX , to understand what they are , please run pyjfuzz with -h switch or look at the command line screenshot
# This below will initalizate a config object which use only the P group attacks where P stay for Path Traversal
config = PJFConfiguration(Namespace(json={"test": ["1", 2, True]}, nologo=True, level=6, techniques="P"))
# once a config object is defined you can access to config.techniques to view the selected techniques for your group
print("Techniques IDs: {0}".format(str(config.techniques)))
# you can eventually modify them!
config.techniques = [2]
# This way only attack number 2 (LFI Attack) will be performed!
fuzzer = PJFFactory(config)
while True:
print fuzzer.fuzzed
simple_server.py
from argparse import Namespace
from pyjfuzz.lib import *
config = PJFConfiguration(Namespace(json={"test": ["1", 2, True]}, nologo=True, level=6, debug=True, indent=True))
PJFServer(config).run()
Иногда вам может понадобиться изменить стандартные ненастраиваемые параметры, такие как порт HTTPS или HTTP-сервера; это можно сделать следующим образом:
from argparse import Namespace
from pyjfuzz.lib import *
config = PJFConfiguration(Namespace(json={"test": ["1", 2, True]}, nologo=True, level=6, indent=True))
print config.ports["servers"]["HTTP_PORT"] # 8080
print config.ports["servers"]["HTTPS_PORT"] # 8443
print config.ports["servers"]["TCASE_PORT"] # 8888
config.ports["servers"]["HTTPS_PORT"] = 443 # Change HTTPS port to 443
Помните: При изменении портов по умолчанию всегда следует обрабатывать исключения, связанные с необходимыми привилегиями!
Ниже представлен полный список всех доступных настроек/параметров объекта PJFConfiguration:
Таблица конфигурации
| Имя | Тип | Описание |
|---|---|---|
| json | dict | JSON-объект для фаззинга |
| json_file | str | Путь к JSON-файлу |
| parameters | list<str> | Список параметров для фаззинга (взяты из JSON-объекта) |
| techniques | str<int> | Строка включённых атак: XSS, LFI и т.д. Например, "CHPTRSX" (см. таблицу техник) |
| level | int | Уровень фаззинга в диапазоне 0–6 |
| utf8 | bool | Если true, переключает кодировку с Unicode на чистое байтовое представление |
| indent | bool | Указывает, нужно ли делать отступы в результирующем объекте |
| url_encode | bool | Указывает, нужно ли URL-кодировать результирующий объект |
| strong_fuzz | bool | Указывает, использовать ли сильный фаззинг (сильный фаззинг не сохраняет структуру JSON; полезен для фаззинга парсеров) |
| debug | bool | Указывает, нужно ли включать отладочный вывод |
| exclude | bool | Исключает из фаззинга параметры, выбранные параметром parameters |
| notify | bool | Указывает, нужно ли уведомлять монитор процессов о сбое; используется только с PJFServer |
| html | str | Путь к HTML-каталогу для обслуживания в PJFServer |
| ext_fuzz | bool | Указывает, использовать ли бинарный файл из “command” в качестве внешнего фаззера |
| cmd_fuzz | bool | Указывает, использовать ли бинарный файл из “command” как цель фаззинга |
| content_type | str | Устанавливает тип содержимого результата PJFServer (по умолчанию application/json) |
| command | list<str> | Команда для выполнения; каждый параметр — элемент списка; можно использовать shlex.split из Python |
Таблица техник
| Индекс | Описание |
|---|---|
| 0 | XSS-инъекция (Polyglot) |
| 1 | SQL-инъекция (Polyglot) |
| 2 | LFI-атака |
| 3 | SQL-инъекция polyglot (2) |
| 4 | XSS-инъекция (Polyglot) (2) |
| 5 | RCE-инъекция (Polyglot) |
| 6 | LFI-атака (2) |
| 7 | Data URI-атака |
| 8 | LFI и HREF-атака |
| 9 | Header-инъекция |
| 10 | RCE-инъекция (Polyglot) (2) |
| 11 | Общая инъекция шаблонов |
| 12 | Инъекция шаблонов Flask |
| 13 | Атака случайными символами |
Ниже несколько скриншотов, чтобы вы могли представить, чего ожидать от PyJFuzz.
PyJFuzz поставляется со встроенным инструментом под названием PyJFuzz Web Fuzzer. Этот инструмент предоставляет автоматическую консоль фаззинга через HTTP- и HTTPS-серверы и может использоваться для лёгкого фаззинга практически любого веб-браузера, даже если вы не можете контролировать состояние процесса!
Существует два переключателя для запуска этого инструмента (--browser-auto и --fuzz-web). Первый выполняет автоматический перезапуск браузера при сбое, второй пытается определить, когда браузер перестаёт отправлять запросы. Оба сохраняют тестовые случаи. Ниже несколько скриншотов.
Пожалуйста, сообщайте о любых проблемах здесь, через GitHub; я исправлю их как можно скорее.
Ниже приведён список известных проблем, найденных с помощью PyJFuzz. Список будет обновляться еженедельно.
Спасибо за использование PyJFuzz!
Счастливого фаззинга от mseclab