
PyJFuzz - Python JSON Fuzzer

PyJFuzz ist ein kleines, erweiterbares und sofort einsatzbereites Framework zum Fuzzing von JSON-Eingaben, wie z.B. mobile REST-API-Endpoints, JSON-Implementierungen, Browser, CLI-Anwendungen und vieles mehr.
| Version | 1.1.0 |
|---|---|
| Startseite | http://www.mseclab.com/ |
| GitHub | https://github.com/mseclab/PyJFuzz |
| Autor | Daniele Linguaglossa (@dzonerzy) |
| Lizenz | MIT - (siehe LICENSE-Datei) |
Abhängigkeiten
Damit PyJFuzz funktioniert, benötigt es einige Abhängigkeiten: bottle, netifaces, GitPython und gramfuzz. Diese können über die automatische setup.py-Installation installiert werden.
Installation
Sie können PyJFuzz mit folgendem Befehl installieren:
git clone https://github.com/mseclab/PyJFuzz.git && cd PyJFuzz && sudo python setup.py install
CLI-Tool
Nach der Installation erstellt PyJFuzz sowohl eine Python-Bibliothek als auch ein Befehlszeilenprogramm namens pjf (siehe Screenshot unten)
Bibliothek
PyJFuzz kann auch als Bibliothek arbeiten. Sie können sie wie folgt in Ihr Projekt importieren:
from pyjfuzz.lib import *
Klassen
Die verfügbaren Objekte/Klassen sind die folgenden:
Beispiele
Im Folgenden finden Sie einige triviale Beispiele für die Implementierung eines PyJFuzz-gestützten Programms.
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()
Manchmal müssen Sie standardmäßige, nicht anpassbare Einstellungen wie HTTPS- oder HTTP-Server-Port ändern. Dies kann auf folgende Weise erfolgen:
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
Denken Sie daran: Beim Ändern der Standard-Ports sollten Sie immer Ausnahmen behandeln, da Berechtigungen erforderlich sind!
Nachfolgend finden Sie eine umfassende Liste aller verfügbaren Einstellungen/Anpassungen des PJFConfiguration-Objekts:
Konfigurationstabelle
Techniken-Tabelle
Im Folgenden finden Sie einige Screenshots, die zeigen, was Sie von PyJFuzz erwarten können.
PyJFuzz wird mit einem integrierten Werkzeug namens PyJFuzz Web Fuzzer ausgeliefert. Dieses Werkzeug bietet eine automatische Fuzzing-Konsole über HTTP- und HTTPS-Server und kann verwendet werden, um fast jeden Webbrowser einfach zu fuzzen, selbst wenn Sie den Prozesszustand nicht kontrollieren können!
Es gibt zwei Schalter, um dieses Werkzeug zu starten (--browser-auto und --fuzz-web). Der erste führt einen automatischen Browser-Neustart durch, wenn ein Absturz auftritt, der andere versucht zu erkennen, wann ein Browser keine Anfragen mehr stellt. Beide speichern immer die Testfälle. Nachfolgend einige Screenshots.
ProblemBitte senden Sie Probleme hier über GitHub, ich werde so schnell wie möglich einen Fix bereitstellen.
Nachfolgend eine Liste bekannter, von PyJFuzz gefundener Probleme. Die Liste wird wöchentlich aktualisiert.
Vielen Dank, dass Sie PyJFuzz verwenden!
Happy Fuzzing von mseclab
| Name | Typ | Beschreibung |
|---|---|---|
| json | dict | Zu fuzzendes JSON-Objekt |
| json_file | str | Pfad zu einer JSON-Datei |
| parameters | list<str> | Liste der zu fuzzenden Parameter (aus dem JSON-Objekt übernommen) |
| techniques | str<int> | Zeichenfolge der aktivierten Angriffe, verwendet zum Generieren von gefuzzten JSON, z.B. XSS, LFI usw. z.B. "CHPTRSX" (Siehe Techniken-Tabelle) |
| level | int | Fuzzing-Level im Bereich 0-6 |
| utf8 | bool | Wenn wahr, wechselt von Unicode-Codierung zu reiner Byte-Darstellung |
| indent | bool | Legt fest, ob das Ergebnisobjekt eingerückt werden soll |
| url_encode | bool | Legt fest, ob das Ergebnisobjekt URL-codiert werden soll |
| strong_fuzz | bool | Legt fest, ob starkes Fuzzing verwendet werden soll (starkes Fuzzing behält die JSON-Struktur nicht bei, nützlich für Parser-Fuzzing) |
| debug | bool | Legt fest, ob Debug-Ausgaben aktiviert werden sollen |
| exclude | bool | Von Fuzzing ausschließen: Parameter, die durch die Option 'parameters' ausgewählt wurden |
| notify | bool | Legt fest, ob der Prozessmonitor benachrichtigt werden soll, wenn ein Absturz auftritt, nur in Verbindung mit PJFServer verwendet |
| html | str | Pfad zu einem HTML-Verzeichnis, das über PJFServer bereitgestellt werden soll |
| ext_fuzz | bool | Legt fest, ob die Binärdatei aus "command" als externer Fuzzer verwendet werden soll |
| cmd_fuzz | bool | Legt fest, ob die Binärdatei aus "command" als Fuzzing-Ziel verwendet werden soll |
| content_type | str | Legt den Content-Type des Ergebnisses von PJFServer fest (Standard application/json) |
| command | list<str> | Befehl zur Ausführung: Jeder Parameter ist ein Listenelement. Sie können shlex.split aus Python verwenden. |
| Index | Beschreibung |
|---|---|
| 0 | XSS-Injection (Polyglot) |
| 1 | SQL-Injection (Polyglot) |
| 2 | LFI-Angriff |
| 3 | SQL-Injection Polyglot (2) |
| 4 | XSS-Injection (Polyglot) (2) |
| 5 | RCE-Injection (Polyglot) |
| 6 | LFI-Angriff (2) |
| 7 | Data-URI-Angriff |
| 8 | LFI- und HREF-Angriff |
| 9 | Header-Injection |
| 10 | RCE-Injection (Polyglot) (2) |
| 11 | Generische Template-Injection |
| 12 | Flask-Template-Injection |
| 13 | Zufallszeichen-Angriff |