Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
CVE-2026-75431_PowerJob_jwt_key_predictable — Демонстрирует критическую уязвимость предсказуемости ключа подписи JWT в PowerJob Server, позволяющую офлайн-вывод ключа и подделку токена для захвата администратора и обхода аутентификации OpenAPI. | Kitploit
Инструменты/GitHubGitHub/unpredictable21/cve-2026-75431_powerjob_jwt_key_predictable
Анализ уязвимостейЭксплуатацияВеб-безопасностьТестирование на ПроникновениеАутентификация
GitHubunpredictable21/cve-2026-75431_powerjob_jwt_key_predictable

CVE-2026-75431_PowerJob_jwt_key_predictable

Демонстрирует критическую уязвимость предсказуемости ключа подписи JWT в PowerJob Server, позволяющую офлайн-вывод ключа и подделку токена для захвата администратора и обхода аутентификации OpenAPI.

Репозиторий
24 дней назадЕщё не проверено

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

Предсказуемый ключ подписи JWT в PowerJob (ключ, производный от URL JDBC по умолчанию) → подделка токена

1. Краткое описание

Ключ подписи JWT (HS256) сервера PowerJob формируется путем BASE64-декодирования жестко заданной константы, объединенной с MD5-хешем URL JDBC по умолчанию (DefaultSecretProvider / JwtServiceImpl). URL JDBC является общедоступным в конфигурации развертывания по умолчанию (docker-compose / application-daily.properties), поэтому злоумышленник может полностью автономно вычислить ключ и подделать действительный JWT для любого пользователя (включая администратора); токен приложения OpenAPI также может быть подделан для обхода аутентификации OpenAPI.

2. Затронутый продукт

  • Продукт: PowerJob Server (веб-консоль 7700 + OpenAPI)
  • Затронутые версии: 5.1.2
  • Развертывание по умолчанию: application-daily.properties раскрывает в открытом виде
jdbc:mysql://powerjob-mysql:3306/powerjob-daily?...

3. Местоположение уязвимости

  • 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.hmacShaKeyFor
  • Ключ находится в одном репозитории/базе данных с бизнес-данными; URL JDBC указан открытым текстом в конфигурации/docker-compose.

4. Первопричина

  • Используется предсказуемый / выводимый ключ вместо случайного и сохраняемого: ключ зависит только от публичной константы + MD5-хеша публичного URL по умолчанию.
  • Полезная нагрузка JWT (username/encryptedToken) имеет вторичную проверку для учетных записей PWJB (DigestUtils.rePassword(password, username)), но:
    • при пароле по умолчанию это значение можно вычислить автономно → полный захват учетной записи администратора;
    • токен приложения OpenAPI (claims appId/password/encryptType) может быть подделан напрямую для обхода аутентификации (OpenApiSecurityServiceImpl:87-105);
    • другие учетные записи сторонних систем входа могут не иметь вторичной проверки.

5. Воспроизведение (подтверждено — полный сквозной сценарий)

Окружение: локальный сервер PowerJob (127.0.0.1:7700, URL JDBC jdbc:mysql://127.0.0.1:3307/powerjob_daily?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&allowMultiQueries=true). Злоумышленник вычисляет все автономно, только на основе общедоступной информации:

root@kitploit:~
# ① Вычисление 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-байтовый ключ

# ③ Подделка веб-JWT администратора (claims: username=PWJB_ADMIN, encryptedToken=результат ①, sub=PowerJob)

Фактический результат (подделанный токен проходит аутентификацию):

root@kitploit:~
[*] /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 совпадает со значением, хранящимся в БД, побайтово (ADMIN_b82a450701f6a71723fb99931fe35e18_b).
  • Ключ полностью определяется публичной константой BASE_SECURITY + MD5-хешем публичного URL JDBC по умолчанию → вычислим автономно без каких-либо учетных данных.
  • PWJB encryptedToken можно пересчитать автономно при пароле по умолчанию (powerjob_admin, находка PJ-02) → полный захват учетной записи администратора.
  • Если администратор изменил пароль, подделка веб-токена блокируется несовпадением encryptedToken, но путь токена приложения OpenAPI (claims appId/password/encryptType, OpenApiSecurityServiceImpl:87-105) все равно может быть подделан независимо для обхода аутентификации OpenAPI.

Даже если пароль по умолчанию изменен, уязвимость сохраняется через другие векторы атаки:

  • Злоумышленник, получивший encryptedToken любого действительного пользователя другими способами (например, SQL-инъекция, раскрытие резервной копии БД, утечка журналов или раскрытие информации через другие конечные точки), может объединить этот токен с предсказуемым ключом подписи для подделки JWT для этого конкретного пользователя.
  • Это полностью обходит проблему несовпадения encryptedToken, поскольку подделанный токен теперь содержит легитимный encryptedToken, полученный из фактической записи базы данных.
  • В результате злоумышленнику вообще не нужно знать открытый пароль пользователя, и подделанный JWT остается действительным даже после смены пароля пользователем (до истечения срока действия токена).

PoC: powerjob_jwt_key.py 192.168.49.128:7700

image
image

6. Воздействие

  • Обход аутентификации / подделка токена произвольного пользователя → поверхности администрирования веб-консоли / OpenAPI.

7. Рекомендуемое исправление

  • Генерировать ключ случайным образом и сохранять его (файл/переменная окружения), никогда не выводить его из URL JDBC или константы.
  • Использовать отдельные ключи для токенов приложений OpenAPI и веб-JWT.
  • Применять вторичную проверку encryptedToken для всех учетных записей.

8. CWE / CVSS

  • CWE: CWE-321 (использование жестко заданного криптографического ключа) / CWE-798
  • CVSS: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N = 9.1 Критический (в сочетании с паролем по умолчанию / OpenAPI)
Скачать инструмент