
JWT काल्पनिक कमजोरी की जांच करने के लिए सरल पायथन स्क्रिप्ट।
एक सरल पायथन स्क्रिप्ट जो काल्पनिक JWT भेद्यता के विरुद्ध जाँच करती है।
मान लीजिए कि एक एप्लिकेशन है जो HS256 एल्गोरिदम से हस्ताक्षरित JWT टोकन का उपयोग करता है। एक उदाहरण टोकन इस प्रकार दिखता है:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.zbgd5BNF1cqQ_prCEqIvBTjSxMS8bDLnJAE_wE-0Cxg
उपरोक्त टोकन को निम्नलिखित डेटा में डिकोड किया जा सकता है:
{
"alg": "HS256",
"typ": "JWT"
}
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022
}
हस्ताक्षर की गणना करने के लिए निम्नलिखित गुप्त कुंजी का उपयोग किया जाता है:
supersecret
हस्ताक्षर की गणना के लिए निम्नलिखित स्यूडो कोड का उपयोग किया जाता है:
$alg = "sha256";
$data = "...";
$key = "supersecret";
hmac($alg, $data, $key);
लेकिन क्या होगा यदि हेडर में अप्रत्याशित "kid":0 फ़ील्ड इंजेक्ट कर दी जाए?
{
"alg": "HS256",
"typ": "JWT",
"kid": 0
}
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022
}
kid फ़ील्ड एक कुंजी चुनने का मानक तरीका है। मेरी धारणा यह है कि, यदि kid फ़ील्ड की उम्मीद नहीं है, तो कोई भेद्य कार्यान्वयन हो सकता है जो स्ट्रिंग $key मान को एक सरणी के रूप में मानेगा:
hmac($alg, $data, $key[kid]);
परिणामस्वरूप "s" ($key[0]) मान का उपयोग HMAC गुप्त कुंजी के रूप में किया जाएगा।
injector.py स्क्रिप्ट मूल JWT टोकन लेती है, हेडर में "kid":0 फ़ील्ड इंजेक्ट करती है और एक-अक्षर वाले गुप्त कुंजियों (ASCII कोड: 32 - 126 [{space}, !, ", #, ..., x, y, z, {, |, }, ~]) से हस्ताक्षरित टोकन उत्पन्न करती है:
python3 injector.py eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.zbgd5BNF1cqQ_prCEqIvBTjSxMS8bDLnJAE_wE-0Cxg
परिणामस्वरूप दो फ़ाइलें बनाई जाती हैं - tokens.txt और tokens_meta.txt। tokens.txt में उत्पन्न टोकन होते हैं और इसे Burp Intruder के लिए पेलोड की सूची के रूप में उपयोग किया जा सकता है। यदि कोई टोकन मान्य है (जिसका अर्थ है कि एप्लिकेशन भेद्य है), तो tokens_meta.txt फ़ाइल का उपयोग यह जाँचने के लिए किया जा सकता है कि दिए गए टोकन को उत्पन्न करने के लिए किस एल्गोरिदम और गुप्त कुंजी का उपयोग किया गया था। tokens_meta.txt फ़ाइल में निम्नलिखित डेटा होता है:
token1:algorithm:secret
...
token{n}:algorithm:secret
कृपया CHANGELOG देखें।