CodeQL学习笔记(一、初入CodeQL)

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。该仓库中包含了如下内容:
    • 一系列名为codeql-custom-queries-<language>的文件夹。你可以在文件夹中创建你自定义的Codeql查询或调用标准库。文件夹中包含了一些样例查询来帮助你开始自定义查询。

2.ql开发环境配置

  1. 下载CodeQL CLI。codeql-cli-binaries中选择适合当前操作系统的CodeQL CLI下载解压。这里我安装的是windows版本的。

  2. 安装Visual Studio Code。 在visualstudio的官网下载对应操作系统的vscode进行安装。

  3. 配置CodeQL的VSCode插件。 主要就是配置一下CodeQL CLI可执行文件的路径,指定为第一步下载的CLI的可执行文件路径。

  4. 配置环境变量。 为了方便后面在命令行里使用codeql命令,在系统环境变量Path里配置一下codeql路径

  5. 克隆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/