CodeQL 学习笔记【1】环境搭建

CodeQL 是什么

CodeQL 是一个强大的代码分析引擎,在 CodeQL 中,代码被视为数据,可以被转换成一个可查询的数据库形式。这个数据库包含了源代码的抽象语法树(AST)、语义信息、控制流和数据流等关键信息。利用 CodeQL,用户可以编写查询来检测代码中的安全漏洞、Bug 以及其他潜在的问题。

CodeQL 的核心是一个不开源的解析引擎,它帮助将代码转换成 CodeQL 可以识别的数据库。同时,CodeQL 提供了一个完全开源的 SDK,其中包含了大部分现成的漏洞规则,用户也可以利用它来参考编写自定义规则。

CodeQL 引擎地址:github.com/github/code...

CodeQL SDK 地址:github.com/github/code...

CodeQL 的使用包括创建 CodeQL 数据库、运行查询以及解析查询结果几个步骤。它支持多种编程语言:

此外,CodeQL 还提供了一套自己的查询语言(QL),用户可以通过编写 QL 规则来获取想要的数据。CodeQL 的处理对象并不是源码本身,而是中间生成的 AST 结构数据库。因此,在使用 CodeQL 之前,需要将项目源码转换成 CodeQL 能够识别的 CodeDatabase。

下载安装

下载 CodeQL 的 CLI 引擎和 SDK 模版:

CodeQL CLI 引擎地址:github.com/github/code...

CodeQL SDK 地址:github.com/github/code...

然后放到你的工具文件夹目录里去,然后解压,添加 Code CLI 引擎的 PATH 环境变量:

bash 复制代码
% vim ~/.zshrc # 编辑内容,添加下面的内容
% cat ~/.zshrc
# CodeQL 工具
export PATH="$PATH:/Users/{你的用户名}/Code_Space/CodeQL/codeql/codeql"  # 你的路径

简单实验一下是否安装成功:

bash 复制代码
% codeql --version
CodeQL command-line toolchain release 2.17.1.
Copyright (C) 2019-2024 GitHub, Inc.
Unpacked in: /Users/sanqiushu/Code_Space/CodeQL/codeql
   Analysis results depend critically on separately distributed query and
   extractor modules. To list modules that are visible to the toolchain,
   use 'codeql resolve qlpacks' and 'codeql resolve languages'.

% codeql pack ls
Running on packs: codeql/csharp-all, codeql/threat-models, codeql/csharp-queries, codeql/mad, codeql/swift-queries, codeql/cpp-examples, codeql/ruby-queries, codeql/ssa, codeql/xml, codeql/controlflow, codeql/ruby-examples, codeql/java-queries, codeql/regex, codeql/yaml, codeql/csharp-examples, codeql/go-queries, codeql/swift-all, codeql/python-queries, codeql/go-all, codeql/javascript-all, codeql/typos, codeql/suite-helpers, codeql/tutorial, codeql/typeflow, codeql/rangeanalysis, codeql/go-examples, codeql/python-all, codeql/java-examples, codeql/cpp-queries, codeql/python-examples, codeql/javascript-examples, legacy-upgrades, codeql/javascript-queries, codeql/cpp-all, codeql/util, codeql/dataflow, codeql/typetracking, codeql/java-all, codeql/ruby-all.
Found legacy-upgrades@0.0.0
Found codeql/controlflow@0.1.14
Found codeql/cpp-all@0.12.11
Found codeql/cpp-examples@0.0.0
Found codeql/cpp-queries@0.9.10
Found codeql/csharp-all@0.9.1
Found codeql/csharp-examples@0.0.0
Found codeql/csharp-queries@0.8.14
Found codeql/dataflow@0.2.5
Found codeql/go-all@0.7.14
Found codeql/go-examples@0.0.0
Found codeql/go-queries@0.7.14
Found codeql/java-all@0.9.1
Found codeql/java-examples@0.0.0
Found codeql/java-queries@0.8.14
Found codeql/javascript-all@0.8.14
Found codeql/javascript-examples@0.0.0
Found codeql/javascript-queries@0.8.14
Found codeql/mad@0.2.14
Found codeql/python-all@0.11.14
Found codeql/python-examples@0.0.0
Found codeql/python-queries@0.9.14
Found codeql/rangeanalysis@0.0.13
Found codeql/regex@0.2.14
Found codeql/ruby-all@0.8.14
Found codeql/ruby-examples@0.0.0
Found codeql/ruby-queries@0.8.14
Found codeql/ssa@0.2.14
Found codeql/suite-helpers@0.7.14
Found codeql/swift-all@0.3.14
Found codeql/swift-queries@0.3.14
Found codeql/threat-models@0.0.13
Found codeql/tutorial@0.2.14
Found codeql/typeflow@0.0.1
Found codeql/typetracking@0.2.14
Found codeql/typos@0.2.14
Found codeql/util@0.2.14
Found codeql/xml@0.0.1
Found codeql/yaml@0.2.14

这样基本上就可以了

然后我们还需要准备一下需要审计的代码,我这里直接就用漏洞靶场代替了

bash 复制代码
% cd /Users/{你的用户名}/Code_Space/IntelliJ_IEDA_CE_Space
% git clone https://github.com/WebGoat/WebGoat.git
% cd WebGoat 
% ls
CODE_OF_CONDUCT.md		Dockerfile_desktop		README_I18N.md			mvnw
CONTRIBUTING.md			FAQ.md				RELEASE_NOTES.md		mvnw.cmd
COPYRIGHT.txt			LICENSE.txt			config				pom.xml
CREATE_RELEASE.md		PULL_REQUEST_TEMPLATE.md	docs				robot
Dockerfile			README.md			mvn-debug			src

然后我们还需要准备一下代码编辑器环境,这里使用 VSCode,直接插件市场搜索 CodeQL 安装即可

然后把我们安装的 CodeQL 引擎路径放入 CodeQL 插件的设置中去(直接放可执行文件的路径)

简单使用

好的,环境基本准备完毕了,接下来就可以开始进行学习了。 首先我们需要为这个项目构建 CodeQL 数据库,只有这样 CodeQL 才能在数据库的基础上进行查询。

请注意,WebGoat 默认 JAVA 版本是 JDK 17,请注意修改自己的 JAVA_HOME 环境变量。

bash 复制代码
% cd /Users/{你的用户名}/Code_Space/IntelliJ_IEDA_CE_Space/CMS/WebGoat
% codeql database create WebGoat_CodeQL_database -l java  # 只需要指定数据库名字和语言就行了

运行之后 CodeQL 会运行 mvn 进行下载依赖、编译程序,然后使用 CodeQL 引擎生成数据库等等操作。

这就是生成的数据库文件夹。

然后点击 CodeQL 插件,在界面中完成语言选择、数据库选择

我们使用 VSCODE 打开 CodeQL 的 SDK 模板的路径,然后我们来到编辑器页面,新建一个查询,路径如下 /codeql-codeql-cli-v2.17.1 15.09.14/java/ql/src/myWebgoat.ql 编写查询代码

sql 复制代码
import java

from Method m
select m

直接右键运行

右侧即可查询到内容

我们再编写一个查询对 executeQuery 方法调用的例子:

sql 复制代码
import java

from MethodCall mm
where mm.getMethod().getName() = "executeQuery"
select mm

点击右侧的结果,还可以直接看到源码。

下一篇我们将介绍如何实战查找漏洞。


文中如果有任何错误欢迎随时沟通和指出。

如果觉得有用,请点赞支持一下吧。

相关推荐
用户962377954481 天前
VulnHub DC-3 靶机渗透测试笔记
安全
叶落阁主2 天前
Tailscale 完全指南:从入门到私有 DERP 部署
运维·安全·远程工作
合天网安实验室3 天前
H2O-3反序列化漏洞分析(CVE-2025-6507&CVE-2025-6544)
前端·黑客
用户962377954484 天前
DVWA 靶场实验报告 (High Level)
安全
数据智能老司机4 天前
用于进攻性网络安全的智能体 AI——在 n8n 中构建你的第一个 AI 工作流
人工智能·安全·agent
数据智能老司机4 天前
用于进攻性网络安全的智能体 AI——智能体 AI 入门
人工智能·安全·agent
用户962377954484 天前
DVWA 靶场实验报告 (Medium Level)
安全
red1giant_star4 天前
S2-067 漏洞复现:Struts2 S2-067 文件上传路径穿越漏洞
安全
用户962377954484 天前
DVWA Weak Session IDs High 的 Cookie dvwaSession 为什么刷新不出来?
安全
cipher6 天前
ERC-4626 通胀攻击:DeFi 金库的"捐款陷阱"
前端·后端·安全