Skip to content
KitploitKITPLOIT
도구익스플로잇블로그
Log in
제출
도구익스플로잇블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

피드문의개인정보© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
CVE-2026-75431_PowerJob_jwt_key_predictable — PowerJob Server의 심각한 JWT 서명 키 예측 가능성 취약점을 시연하며, 오프라인 키 유도 및 토큰 위조를 통해 관리자 계정 탈취와 OpenAPI 인증 우회를 가능하게 합니다. | Kitploit
도구/GitHubGitHub/unpredictable21/cve-2026-75431_powerjob_jwt_key_predictable
Vulnerability AnalysisExploitationWeb SecurityPenetration TestingAuthentication
GitHubunpredictable21/cve-2026-75431_powerjob_jwt_key_predictable

CVE-2026-75431_PowerJob_jwt_key_predictable

PowerJob Server의 심각한 JWT 서명 키 예측 가능성 취약점을 시연하며, 오프라인 키 유도 및 토큰 위조를 통해 관리자 계정 탈취와 OpenAPI 인증 우회를 가능하게 합니다.

저장소 보기
132개월 전아직 검토되지 않음

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

PowerJob JWT 서명 키 예측 가능(기본 JDBC URL에서 파생된 키) → 토큰 위조

1. 요약

PowerJob Server의 JWT(HS256) 서명 키는 하드코딩된 상수와 기본 JDBC URL의 MD5를 연결한 값을 BASE64 디코딩하여 파생됩니다(DefaultSecretProvider / JwtServiceImpl). JDBC URL은 기본 배포 환경(docker-compose / application-daily.properties)에서 공개되어 있으므로, 공격자는 완전히 오프라인에서 키를 파생하여 모든 사용자(관리자 포함)에 대한 유효한 JWT를 위조할 수 있습니다. OpenAPI App Token 역시 위조하여 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
  • 키는 비즈니스 데이터와 저장소/데이터베이스를 공유하며, JDBC URL은 설정/docker-compose에 평문으로 존재합니다.

4. 근본 원인

  • 무작위의 영구 저장 키 대신 예측 가능한/파생 가능한 키를 사용합니다: 키는 공개 상수 + 공개 기본 URL의 MD5에만 의존합니다.
  • JWT 페이로드(username/encryptedToken)에는 PWJB 계정에 대한 2차 검사(DigestUtils.rePassword(password, username))가 있지만:
    • 기본 비밀번호에서는 이 값을 오프라인에서 계산할 수 있음 → 완전한 관리자 계정 탈취 가능;
    • OpenAPI App Token(클레임 appId/password/encryptType)은 직접 위조하여 인증을 우회할 수 있음(OpenApiSecurityServiceImpl:87-105);
    • 기타 타사 로그인 계정에는 2차 검사가 없을 수 있음.

5. 재현(검증됨 — 전체 종단 간)

환경: 로컬 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에 의해 결정됩니다 → 자격 증명 없이 오프라인에서 파생 가능.
  • PWJB encryptedToken은 기본 비밀번호(powerjob_admin, PJ-02 발견)로 오프라인에서 재계산 가능 → 완전한 관리자 계정 탈취.
  • 관리자가 비밀번호를 변경한 경우 encryptedToken 불일치로 웹 토큰 위조가 차단되지만, OpenAPI App Token 경로(클레임 appId/password/encryptType, OpenApiSecurityServiceImpl:87-105)는 여전히 독립적으로 위조하여 OpenAPI 인증을 우회할 수 있습니다.

기본 비밀번호를 변경하더라도 다른 공격 경로를 통해 취약점이 지속됩니다:

  • 다른 수단(예: SQL 인젝션, 데이터베이스 백업 노출, 로그 유출, 또는 다른 엔드포인트의 정보 공개)을 통해 유효한 사용자의 encryptedToken 을 획득한 공격자는 해당 토큰을 예측 가능한 서명 키와 결합하여 해당 특정 사용자의 JWT를 위조할 수 있습니다.
  • 이는 위조된 토큰에 실제 데이터베이스 레코드에서 파생된 정당한 encryptedToken이 포함되므로 encryptedToken 불일치 문제를 완전히 우회합니다.
  • 결과적으로 공격자는 사용자의 평문 비밀번호를 전혀 알 필요가 없으며, 사용자가 비밀번호를 변경한 후에도 위조된 JWT는 유효하게 유지됩니다(토큰이 만료될 때까지).

PoC: powerjob_jwt_key.py 192.168.49.128:7700

image image

6. 영향

  • 인증 우회 / 임의 사용자 토큰 위조 → 웹 콘솔 / OpenAPI 관리 표면.

7. 권장 수정 사항

  • 키를 무작위로 생성하여 영구 저장(파일/환경 변수)하고, JDBC URL이나 상수에서 절대 파생하지 마십시오.
  • OpenAPI App Token과 웹 JWT에 별도의 키를 사용하십시오.
  • 모든 계정에 encryptedToken 2차 검사를 적용하십시오.

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 Critical(기본 비밀번호 / OpenAPI와 결합 시)
도구 다운로드