1.关于CodeQL
1.1 简介
CodeQL是github官方提供的一款代码分析引擎,它可以帮助开发人员自动化进行安全检查,也可以帮助安全人员进行变种分析(使用一直漏洞作为种子去发现代码中相似问题的过程,网传是他们公司为了宣传自己的产品造出来的一个词)。渗透人员可以用来做漏洞挖掘、甲方可以集成到CI/DI中做自动化代码安全(原则上说,github官方禁止企业将CodeQL集成到CI/DI,但只要你脸皮够厚......),总而言之,非常好用。
1.2 CodeQL相关仓库
以下为几个和CodeQL相关,学习CodeQL中可能会用到的相关git仓库和插件:
- CodeQL CLI:CodeQL的核心引擎也是它的命令行工具,github官方只给了可执行文件,也就是说本质上来说CodeQL不是一个开源项目。仓库地址为:codeql-cli-binaries。
- CodeQL VSCode插件:可以让你在VS Code里面编写以
.ql
为后缀的QL(CodeQL建立的用来查询CodeQL数据库的语言)代码,然后调用CodeQL CLI去执行你编写的代码。提供了代码高亮,代码补全提示等功能。 - CodeQL库:里面包含了很多CodeQL官方提供的
.qll
库,在写自己的.ql
查询时,可以调用该仓库中提供的库。其中甚至包含了一些别人写好的查询脚本。例如:XSS查询脚本。库分为两个仓库,一个是java、cpp等等编程语言的CodeQL库,地址为: codeql。还有一个是go语言的库,go语言自己单独一个仓库:codeql-go。 - vscode-codeql-starter:starter workspace是一个帮你快速配置代码环境的git仓库,地址为vscode-codeql-starter。该仓库中包含了如下内容:
-
- C/C++, C#, Java, JavaScript, Python,Ruby的CodeQL标准库和标准查询的git仓库。这些标准库和标准的仓库是以字模块的方式存在的,因此你可以随时在不影响你自定义查询的情况下更新它们。
-
- CodeQL的go语言标准库和查询仓库。也是一个子模块。
-
- 一系列名为
codeql-custom-queries-<language>
的文件夹。你可以在文件夹中创建你自定义的Codeql查询或调用标准库。文件夹中包含了一些样例查询来帮助你开始自定义查询。
- 一系列名为
2.ql开发环境配置
-
下载CodeQL CLI。 在codeql-cli-binaries中选择适合当前操作系统的CodeQL CLI下载解压。这里我安装的是windows版本的。
-
安装Visual Studio Code。 在visualstudio的官网下载对应操作系统的vscode进行安装。
-
配置CodeQL的VSCode插件。 主要就是配置一下CodeQL CLI可执行文件的路径,指定为第一步下载的CLI的可执行文件路径。
-
配置环境变量。 为了方便后面在命令行里使用codeql命令,在系统环境变量
Path
里配置一下codeql路径 -
克隆vscode-codeql-starter项目。 vscode-codeql-starter项目中包含了写ql查询所需的库,只需要下载该项目,然后将其添加到vscode的当前工作空间(在vscode菜单栏中,点击
文件
->从文件打开工作区
选择上一步克隆项目中的vscode-codeql-starter.code-workspace
文件)即可在codeql-custom-queries-<language>
的文件夹编写你的codeql查询。
git clone --recursive https://github.com/github/vscode-codeql-starter/
3.codeql使用初体验
配置好上述开发环境后,就可以在vscode中编写自己的ql代码来查询代码中潜在的漏洞。这里以WebGoat(一个java web漏洞靶场)作为测试对象,进行一下简单的体验。
1.下载webgoat。
git clone https://github.com/WebGoat/WebGoat.git
2.创建CodeQL数据库。
codeql database create --language=java --source-root=D:\code\WebGoat D:\code\codeqlDB\webgoatDB --overwrite
需要注意的是,如果webgoat依赖java17,确保本机能够成功在WebGoat文件夹中运行./mvnw.cmd clean install
再进行数据库创建。
3.在VS Code中加载该数据库。
选择刚刚生成的文件夹即可。
4.编写ql文件。
由于审计的目标是个java项目,因此,可以在codeql-custom-queries-java
中,新建一个hello.ql
文件。写入如下内容,如果一切配置正确,这第一个hello world程序就可以成功运行了。
当然如果觉得这个有点过于简单,也可以尝试一下vscode-codeql-starter/ql/java/ql/src/Security/CWE/CWE-089/SqlTainted.ql
。这是一个sql注入漏洞的检测脚本,测试结果如下图所示:
点击Path中的每个条目,就可以跳转到代码中的对应位置。该查询结果给我们标记出了这个sqli注入从用户传入参数到query执行sql的完整数据传递过程。
参考
- https://codeql.github.com/docs/