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. 环境配置步骤

  1. 解压下载的CodeQL CLI压缩包
  2. 将解压后的目录添加到系统环境变量PATH中
  3. 在VSCode中安装CodeQL插件
  4. 在插件设置中配置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反序列化

  1. 漏洞背景

    • 调用类的toString方法
    • 依赖中存在fastjson
    • Hessian版本较高,黑名单限制多
  2. 攻击链分析

    • 存在H2数据库依赖
    • 需要绕过被ban的jdbc getter方法
    • 寻找新的getter或setter方法
  3. CodeQL分析过程

    • 创建CodeQL数据库(耗时14分钟)
    • 编写规则查找可能的getter方法
    • 发现Oracle JDBC getter方法
  4. 解决方案

    • JDBC会触发JNDI注入
    • 查找lookup调用点
    • 找到两条可用路径:
      • 常规使用路径
      • 依赖JavaEE组件的路径(需要相关依赖)

案例2:aliyunctf chain17

  1. 适配不同环境

    • 根据JDK版本调整依赖
    • 高版本JDK8可注释lookup
    • 无JDBC依赖时注释getConnection
  2. 简化攻击链

    • 保留lookup和newInstance关键调用
    • 确保最小依赖条件下攻击链可用

五、高级技巧

  1. 依赖分析

    • 当遇到复杂依赖关系时,优先分析关键依赖
    • 使用CodeQL的依赖图功能可视化调用关系
  2. 规则编写

    • 从官方规则库学习标准模式
    • 针对特定漏洞模式定制查询
  3. 性能优化

    • 对大项目分模块分析
    • 合理设置查询超时时间

六、常见问题解决

  1. 编译问题

    • 遇到编译错误时尝试不构建方式创建数据库
    • 处理特殊工具(如Lombok)带来的问题
  2. 数据库创建失败

    • 检查语言类型是否正确
    • 确保源代码路径设置正确
  3. 查询效率低

    • 优化查询语句
    • 限制分析范围

通过以上步骤和技巧,您可以系统地学习和应用CodeQL进行代码安全分析,从环境搭建到实战漏洞挖掘,逐步掌握这一强大的静态分析工具。

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进行代码安全分析,从环境搭建到实战漏洞挖掘,逐步掌握这一强大的静态分析工具。