Zurück zu den Updates
New releaseSep 13, 2026

sj v2.8.2

Ein Tool zur Überprüfung von Endpunkten, die in offengelegten (Swagger/OpenAPI) Definitionsdateien definiert sind.

Teilen

sj (Swagger Jacker)

sj ist ein Kommandozeilen-Tool, das bei der Prüfung exponierter Swagger/OpenAPI-Definitionsdateien unterstützt, indem es die zugehörigen API-Endpunkte auf schwache Authentifizierung überprüft. Es stellt außerdem Befehlvorlagen für manuelle Schwachstellentests bereit.

Dazu parst es die Definitionsdatei nach Pfaden, Parametern und akzeptierten Methoden, bevor es die Ergebnisse mit einem von fünf Unterbefehlen verwendet:

  • automate - Erstellt eine Reihe von Anfragen und analysiert den Statuscode der Antwort.
  • prepare - Generiert eine Liste von Befehlen für manuelle Tests.
  • endpoints - Generiert eine Liste roher API-Routen. Pfadwerte werden nicht durch Testdaten ersetzt.
  • brute - Sendet eine Reihe von Anfragen an ein Ziel, um Operationsdefinitionen anhand häufig verwendeter Dateipfade zu finden.
  • convert - Konvertiert eine Definitionsdatei von v2 nach v3.

Build

Um aus dem Quellcode zu kompilieren, stelle sicher, dass Go in Version >= 1.22.5 installiert ist, und führe go build innerhalb des Repositorys aus:

$ git clone https://github.com/BishopFox/sj.git
$ cd sj/
$ go build .

Installation

Um die neueste Version des Tools zu installieren, führe aus:

$ go install github.com/BishopFox/sj@latest

# Note: you may also need to place the path to your Go binaries within your PATH environment variable:
$ export PATH=$PATH:~/go/bin

Verwendung

Verwende den Befehl automate, um eine Reihe von Anfragen an jeden definierten Endpunkt zu senden und den Statuscode jeder Antwort zu analysieren.

$ sj automate -u https://petstore.swagger.io/v2/swagger.json -qi -p http://127.0.0.1:8080               

Gathering API details.
⚠  POST     500  /v2/pet
⚠  PUT      500  /v2/pet
✓  GET      200  /v2/pet/findByStatus
✓  GET      200  /v2/pet/findByTags
✓  GET      200  /v2/pet/1
✓  POST     200  /v2/pet/1
⚠  POST     N/A  /v2/pet/1/uploadImage
✓  GET      200  /v2/store/inventory
⚠  POST     N/A  /v2/store/order
⚠  GET      N/A  /v2/store/order/1
✓  POST     200  /v2/user
⚠  POST     N/A  /v2/user/createWithArray
⚠  POST     N/A  /v2/user/createWithList
✓  GET      200  /v2/user/login
✓  GET      200  /v2/user/logout
✓  GET      200  /v2/user/bishopfox
✓  PUT      200  /v2/user/bishopfox

Du kannst das Flag --replay-proxy verwenden, um übereinstimmende Anfragen über einen separaten Proxy (z. B. Burp Suite) erneut abzuspielen. Dadurch kannst du den gesamten Datenverkehr über einen Proxy (oder direkt) leiten und nur die interessanten Ergebnisse an deinen Interception-Proxy senden:

$ sj automate -u https://petstore.swagger.io/v2/swagger.json -qi --replay-proxy http://127.0.0.1:8080

Du kannst es auch mit --proxy kombinieren, um den Scan-Datenverkehr über einen anderen Proxy zu leiten, während Treffer an Burp weitergeleitet werden:

$ sj automate -u https://petstore.swagger.io/v2/swagger.json -qi -p http://proxy:9090 --replay-proxy http://127.0.0.1:8080

Du kannst auch eine ausführliche Ausgabe anfordern, um die partielle (oder vollständige) Antwort zu sehen:

$ sj automate -u https://petstore.swagger.io/v2/swagger.json -qi -p http://127.0.0.1:8080 -v           

Gathering API details.
⚠  POST     500  /v2/pet
   {"code":500,"type":"unknown","message":"something 
⚠  PUT      500  /v2/pet
   {"code":500,"type":"unknown","message":"something 
✓  GET      200  /v2/pet/findByStatus
   []
✓  GET      200  /v2/pet/findByTags
   []
✓  GET      200  /v2/pet/1
   {"id":1,"category":{"id":1,"name":"cat"},"name":"d
✓  POST     200  /v2/pet/1
   {"code":200,"type":"unknown","message":"1"}
⚠  POST     N/A  /v2/pet/1/uploadImage
✓  GET      200  /v2/store/inventory
   {"sold":115,"bishopfox":1,"SOLD":1,"string":224,"d
⚠  POST     N/A  /v2/store/order
⚠  GET      N/A  /v2/store/order/1
✓  POST     200  /v2/user
   {"code":200,"type":"unknown","message":"1"}
⚠  POST     N/A  /v2/user/createWithArray
⚠  POST     N/A  /v2/user/createWithList
✓  GET      200  /v2/user/login
   {"code":200,"type":"unknown","message":"logged in 
✓  GET      200  /v2/user/logout
   {"code":200,"type":"unknown","message":"ok"}
✓  GET      200  /v2/user/bishopfox
   {"id":1,"username":"bishopfox","firstName":"bishop
✓  PUT      200  /v2/user/bishopfox
   {"code":200,"type":"unknown","message":"1"}

Verwende den Befehl prepare, um eine Liste von Befehlen für manuelle Tests vorzubereiten. Unterstützt derzeit sowohl curl als auch sqlmap. Du wirst diese wahrscheinlich leicht anpassen müssen.

$ sj prepare -u https://petstore.swagger.io/v2/swagger.json -qi -p http://127.0.0.1:8080

$ curl -X POST "https://petstore.swagger.io/v2/pet" -H 'Content-Type: application/json' -d '{"category":{"id":1,"name":"bishopfox"},"id":1,"name":"doggie","photoUrls":"https://bishopfox.com","status":"available","tags":[{"id":1,"name":"bishopfox"}]}'
$ curl -X PUT "https://petstore.swagger.io/v2/pet" -H 'Content-Type: application/json' -d '{"category":{"id":1,"name":"bishopfox"},"id":1,"name":"doggie","photoUrls":"https://bishopfox.com","status":"available","tags":[{"id":1,"name":"bishopfox"}]}'
$ curl -X GET "https://petstore.swagger.io/v2/pet/findByStatus?status=1"
$ curl -X GET "https://petstore.swagger.io/v2/pet/findByTags?tags=1"
$ curl -X GET "https://petstore.swagger.io/v2/pet/1"
$ curl -X POST "https://petstore.swagger.io/v2/pet/1" -H 'Content-Type: application/x-www-form-urlencoded' -d 'name=bishopfox&status=bishopfox'
$ curl -X POST "https://petstore.swagger.io/v2/pet/1/uploadImage" -H 'Content-Type: application/x-www-form-urlencoded' -d 'additionalMetadata=bishopfox&file=1'
$ curl -X GET "https://petstore.swagger.io/v2/store/inventory"
$ curl -X POST "https://petstore.swagger.io/v2/store/order" -H 'Content-Type: application/json' -d '{"complete":true,"id":1,"petId":1,"quantity":1,"shipDate":"1990-01-01","status":"placed"}'
$ curl -X GET "https://petstore.swagger.io/v2/store/order/1"
$ curl -X POST "https://petstore.swagger.io/v2/user" -H 'Content-Type: application/json' -d '{"email":"[email protected]","firstName":"bishopfox","id":1,"lastName":"bishopfox","password":"bishopfox","phone":"bishopfox","userStatus":1,"username":"bishopfox"}'
$ curl -X POST "https://petstore.swagger.io/v2/user/createWithArray" -H 'Content-Type: application/json' -d '[{"email":"[email protected]","firstName":"bishopfox","id":1,"lastName":"bishopfox","password":"bishopfox","phone":"bishopfox","userStatus":1,"username":"bishopfox"}]'
$ curl -X POST "https://petstore.swagger.io/v2/user/createWithList" -H 'Content-Type: application/json' -d '[{"email":"[email protected]","firstName":"bishopfox","id":1,"lastName":"bishopfox","password":"bishopfox","phone":"bishopfox","userStatus":1,"username":"bishopfox"}]'
$ curl -X GET "https://petstore.swagger.io/v2/user/login?username=bishopfox&password=bishopfox"
$ curl -X GET "https://petstore.swagger.io/v2/user/logout"
$ curl -X GET "https://petstore.swagger.io/v2/user/bishopfox"
$ curl -X PUT "https://petstore.swagger.io/v2/user/bishopfox" -H 'Content-Type: application/json' -d '{"email":"[email protected]","firstName":"bishopfox","id":1,"lastName":"bishopfox","password":"bishopfox","phone":"bishopfox","userStatus":1,"username":"bishopfox"}'

Mehrere Content-Types für Request-Bodies

Eine Operation deklariert häufig denselben Body unter mehreren Content-Types. Standardmäßig sendet sj denjenigen, der am wahrscheinlichsten akzeptiert wird, mit Präferenz für application/json, dann application/x-www-form-urlencoded, dann multipart/form-data, dann XML. Die Auswahl ist deterministisch, sodass wiederholte Ausführungen identische Befehle erzeugen.

Kategorien