Codeql全新版本从0到1
字数 1771 2025-08-29 08:30:36
CodeQL全新版本从0到1实战指南
一、CodeQL环境搭建
1. 下载必要组件
-
CodeQL CLI二进制文件:
- 下载地址:https://github.com/github/codeql-cli-binaries/releases
- 选择适合您操作系统的版本下载
-
QL规则库:
- 下载地址:https://github.com/github/codeql
- 包含官方提供的各种语言的查询规则
2. 文档资源
-
CodeQL CLI文档:
- https://githubdocs.cn/en/code-security/codeql-cli/getting-started-with-the-codeql-cli/about-the-codeql-cli
-
CodeQL完整文档:
- https://codeql.githubdocs.cn/docs/contents/
3. 环境配置步骤
- 解压下载的CodeQL CLI压缩包
- 将解压后的目录添加到系统环境变量PATH中
- 在VSCode中安装CodeQL插件
- 在插件设置中配置CodeQL CLI二进制文件路径
二、创建测试环境
1. 推荐测试靶场
-
micro_service_seclab:
- GitHub地址:https://github.com/l4yn3/micro_service_seclab/
注意:该靶场使用了Lombok,编译时可能会出现问题。解决方案是:
- 移除Lombok依赖
- 手动修改所有Model类,实现Lombok自动生成的代码
2. 常见CTF/漏洞挖掘环境处理
- 对于需要分析依赖链的情况:
- 需要将依赖一起打包生成数据库
- 使用jadx工具将jar文件反编译
- 保存为resources和sources目录结构
三、数据库创建方法
1. 不构建代码直接生成数据库
- 适用于无法成功构建的项目
- 执行命令:
codeql database create <database-name> --language=<language> --source-root=<path> - 缺点:速度较慢(示例中一个项目耗时14分钟)
2. 处理单独依赖
- 将依赖jar文件用jadx反编译
- 保存为source目录结构
- 使用与主项目相同的方法创建数据库
3. 下载预建数据库
- 通过GitHub API可以列出公共项目的CodeQL数据库
- 示例:下载Apache Kylin的CodeQL数据库
- 限制:无法指定特定历史版本
四、实战案例分析
案例1:SUCTF-ezsolon Hessian2反序列化
-
漏洞背景:
- 调用类的toString方法
- 依赖中存在fastjson
- Hessian版本较高,黑名单限制多
-
攻击链分析:
- 存在H2数据库依赖
- 需要绕过被ban的jdbc getter方法
- 寻找新的getter或setter方法
-
CodeQL分析过程:
- 创建CodeQL数据库(耗时14分钟)
- 编写规则查找可能的getter方法
- 发现Oracle JDBC getter方法
-
解决方案:
- JDBC会触发JNDI注入
- 查找lookup调用点
- 找到两条可用路径:
- 常规使用路径
- 依赖JavaEE组件的路径(需要相关依赖)
案例2:aliyunctf chain17
-
适配不同环境:
- 根据JDK版本调整依赖
- 高版本JDK8可注释lookup
- 无JDBC依赖时注释getConnection
-
简化攻击链:
- 保留lookup和newInstance关键调用
- 确保最小依赖条件下攻击链可用
五、高级技巧
-
依赖分析:
- 当遇到复杂依赖关系时,优先分析关键依赖
- 使用CodeQL的依赖图功能可视化调用关系
-
规则编写:
- 从官方规则库学习标准模式
- 针对特定漏洞模式定制查询
-
性能优化:
- 对大项目分模块分析
- 合理设置查询超时时间
六、常见问题解决
-
编译问题:
- 遇到编译错误时尝试不构建方式创建数据库
- 处理特殊工具(如Lombok)带来的问题
-
数据库创建失败:
- 检查语言类型是否正确
- 确保源代码路径设置正确
-
查询效率低:
- 优化查询语句
- 限制分析范围
通过以上步骤和技巧,您可以系统地学习和应用CodeQL进行代码安全分析,从环境搭建到实战漏洞挖掘,逐步掌握这一强大的静态分析工具。