codeQL入门

本文主要记录自己在Windows平台上搭建codeQL环境的过程、QL语法的入门,并以分析java应用程序为例

[TOC]

0x00环境搭建

下载分析程序:https://github.com/github/codeql-cli-binaries/releases/latest/download/codeql.zip

下载相关库文件:https://github.com/Semmle/ql

目录如下

image-20211217223630575

将codeql命令所在目录添加到环境变量,命令行中输入codeql验证

image-20211217223846223
image-20211224192605918

VScode中安装codeQL扩展,并配置codeql路径(注意此处为可执行文件路径)

image-20211224192724881

0x01构建数据库

以java-sec-code项目为例

在执行codeql命令前,需确保java、mvn命令可以在当前目录执行,否则会报错退出

git clone https://github.com/JoyChou93/java-sec-code.git
cd java-sec-code
codeql database create qldb-test -l java

因为java-sec-code是通过maven进行依赖管理,需要我们事先安装好maven,codeql识别出是个maven项目之后会自动对项目文件进行编译(用到mvn命令),通过编译得到的文件创建数据库。

最后得到的qldb-test即是数据库文件夹,分析时只对数据库文件夹进行分析,如果项目代码有变动,数据库需要重新构建

image-20211217225109686

0x02编写查询语句

vscode中导入数据库

image-20211217225553777

打开第一步下载的ql库文件夹

image-20211224193201566

在java/ql/src目录下(该目录下已包含java库依赖)新建test.ql,编写最基本的查询语句,右键Run Query

image-20211224193253736
image-20211224202016824

使用现成的xss规则库:https://github.com/github/codeql/blob/main/java/ql/src/Security/CWE/CWE-079/XSS.ql

查询,即可看到所有符合要求的数据流

image-20211224202602823

并且可以清晰的查看数据流的路径

image-20211224202636693

0x03QL语法入门

ql语法的关键字和sql比较类似,但是大结构有区别

ql程序的大结构如下:

from  /* ... 变量声明... */
where  /* ... 逻辑公式 ... */
select  /* ... 表达式 ... */

from和where是可选的,简单的例子如下

image-20211225193305975

此外,ql语言内置了多种基本数据类型和内建函数,简单例子如下

image-20211225193916044

再看官方入门的基础查询语句就很明白了:定义两个变量 -> 若是if语句的block并且该block为空 -> 则返回if语句位置

image-20211225194736132

更官方的解释如下:

image-20211225195056044

运行结果如下,可以轻松定位到满足条件的if语句代码行

image-20211225195442943
image-20211225195451266

官方文档:https://codeql.github.com/docs/codeql-language-guides/basic-query-for-java-code/

LGTM在线console:https://lgtm.com/query/8843828481633973084/