Tester la sécurité d'un JWT
JWTop propose deux outils complémentaires pour tester la sécurité des JWT : jwtop crack sonde automatiquement un serveur en direct, tandis que jwtop exploit génère des tokens modifiés pour une inspection manuelle ou des tests ciblés.
Scan automatisé du serveur
Section titled “Scan automatisé du serveur”jwtop crack envoie une sonde pour chaque technique d’exploitation connue et rapporte celles que le serveur accepte.
jwtop crack $TOKEN --url https://api.example.com/protectedExemple de sortie :
[+] algnone (none) 200 VULNERABLE[ ] algnone (NONE) 401[ ] algnone (None) 401[ ] algnone (nOnE) 401[ ] blanksecret 401[ ] nullsig 401[-] hmacconfusion skipped (no public key provided)[-] psychicsig skipped (ECDSA-only exploit)[ ] kidinjection (sql) 401[ ] kidinjection (path) 401[-] jwkinjection skipped (jwk injection not applicable for HS256)[-] secret skipped (not found in dictionary)Une ligne [+] signifie que le serveur a accepté l’exploit. Le code de sortie 0 signifie qu’au moins un exploit a réussi ; 1 signifie qu’aucun n’a réussi.
Fournir une clé publique pour activer la sonde hmacconfusion :
jwtop crack $TOKEN --url https://api.example.com/protected \ --key /path/to/public.pem
jwtop crack $TOKEN --url https://api.example.com/protected \ --key https://example.com/public.pemAjouter une wordlist de secrets personnalisée :
jwtop crack $TOKEN --url https://api.example.com/protected \ --wordlist /path/to/secrets.txtLa cible attend le JWT ailleurs que dans le header Authorization :
# Cookiejwtop crack $TOKEN --url https://api.example.com/protected --token-in cookie --token-name session
# Paramètre de requêtejwtop crack $TOKEN --url https://api.example.com/protected --token-in query --token-name access_token
# Corps POST encodé en formulairejwtop crack $TOKEN --url https://api.example.com/protected --token-in body --token-name jwtVoir la référence de crack pour toutes les options --token-in.
Tokens d’exploitation manuelle
Section titled “Tokens d’exploitation manuelle”Utilisez jwtop exploit lorsque vous avez besoin d’un token modifié précis pour un test ciblé, un rapport, ou un cas où le serveur exige un format de requête non standard.
Contournement alg=none :
# Une seule variantejwtop exploit algnone $TOKEN
# Les quatre variantes de casse (une par ligne)jwtop exploit algnone --all $TOKENSecret HMAC vide :
jwtop exploit blanksecret $TOKENSignature nulle (alg inchangé) :
jwtop exploit nullsig $TOKENConfusion HMAC (clé publique comme secret) :
jwtop exploit hmacconfusion $TOKEN --key /path/to/public.pemjwtop exploit hmacconfusion $TOKEN --key https://example.com/public.pemSignature psychique (signature ECDSA à zéro, CVE-2022-21449) :
jwtop exploit psychicsig $TOKENInjection dans le header kid :
# Variante injection SQLjwtop exploit kidinjection --mode sql $TOKEN
# Variante path traversaljwtop exploit kidinjection --mode path $TOKEN
# Variante injection de commande (cible les serveurs qui délèguent au shell via kid)jwtop exploit kidinjection --mode command $TOKENjwtop exploit kidinjection --mode command --all $TOKEN # toutes les variantes de payload shell
# Variante injection LDAP (cible les serveurs qui utilisent kid dans une recherche LDAP)jwtop exploit kidinjection --mode ldap $TOKENjwtop exploit kidinjection --mode ldap --all $TOKEN # toutes les variantes de payload LDAPInjection de header JWK (clé auto-signée, CVE-2018-0114) :
jwtop exploit jwkinjection $TOKENjwtop exploit jwkinjection $TOKEN --alg ES256Force brute sur le secret HMAC :
jwtop exploit weaksecret $TOKENjwtop exploit weaksecret $TOKEN --wordlist /path/to/secrets.txtUtiliser des tokens d’exploitation dans des scripts
Section titled “Utiliser des tokens d’exploitation dans des scripts”Capturez la sortie et envoyez-la comme token Bearer :
EXPLOITED=$(jwtop exploit algnone $TOKEN)curl -si -H "Authorization: Bearer $EXPLOITED" https://api.example.com/protected \ | head -1Dans GitHub Actions
Section titled “Dans GitHub Actions”Exécutez un scan de vulnérabilités automatiquement sur chaque pull request :
name: JWT security scanon: pull_request:
jobs: scan: runs-on: ubuntu-latest steps: - uses: cerberauth/jwtop-action@v1 with: args: crack ${{ secrets.TEST_TOKEN }} --url ${{ vars.API_URL }}/protectedname: JWT security scanon: pull_request:
jobs: scan: runs-on: ubuntu-latest steps: - name: Install jwtop run: go install github.com/cerberauth/jwtop@latest
- name: Scan JWT vulnerabilities run: | if jwtop crack "$TOKEN" --url "$API_URL/protected"; then echo "::error::JWT vulnerability detected" exit 1 fi env: TOKEN: ${{ secrets.TEST_TOKEN }} API_URL: ${{ vars.API_URL }}