
sj v2.8.2
Ein Tool zur Überprüfung von Endpunkten, die in offengelegten (Swagger/OpenAPI) Definitionsdateien definiert sind.
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 sowohlcurlals auchsqlmap. 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.