安装CodeQL
CodeQL本身包含两部分解析引擎+SDK
下载已经编译好的 CodeQL 执行程序
https://github.com/github/codeql-cli-binaries/releases
下载之后配置环境变量
安装 SDK
CMD 进入 CodeQL 安装目录,使用 Git 安装 SDK
1
git clone https://github.com/Semmle/ql
安装 VS Code 插件,在应用商店搜索 CodeQL,安装第一个
安装之后配置 CodeQL 目录
点击插件右侧齿轮按钮,填入 CodeQL 的安装目录,路径中需要到 codeql.exe(下图没有会有bug)
因为审计 Java 代码还需要用到 maven,需要安装 MVN
直接在官网下载:https://maven.apache.org/download.cgi,配置好环境变量即可,在 Windows 系统语言为中文的情况下,可能会出现报错中文乱码
简单使用
由于CodeQL
的处理对象并不是源码本身,而是中间生成的AST结构数据库,所以我们先需要把我们的项目源码转换成CodeQL
能够识别的CodeDatabase
1 | codeql database create ../codeqldatabase --language="java" --command="mvn clean install --file pom.xml" --source-root=C:\Users\admin\Downloads\micro_service_seclab-main |
导入 Database
在 vscode 中导入解析完成的数据库
数据库加载成功
编写测试 QL 查询,在 vscode 中打开 SDK 所在文件夹,如图所示目录新建 ql 文件,右击 run query 进行查询
基础语法
CodeQL 的核心引擎是不开源的,这个核心引擎的作用之一是帮助我们把要审计的代码文件转换成CodeQL能识别的中间层 AST 数据库,然后我们需要编写 QL 查询语句来获取我们想要的数据,由于 CodeQL 开源了所有的规则和规则库部分,所以我们能够做的就是编写符合我们业务逻辑的 QL 规则,然后使用 CodeQL 引擎去跑我们的规则,发现靶场的安全漏洞
什么是source和sink
在代码自动化安全审计的理论当中,有一个最核心的三元组概念,就是(source,sink和sanitizer)
- source是指漏洞污染链条的输入点。比如获取http请求的参数部分,就是非常明显的Source
- sink是指漏洞污染链条的执行点,比如SQL注入漏洞,最终执行SQL语句的函数就是sink(这个函数可能叫query或者exeSql,或者其它)
- sanitizer又叫净化函数,是指在整个的漏洞链条当中,如果存在一个方法阻断了整个传递链,那么这个方法就叫sanitizer
只有当 source 和 sink 同时存在,并且从 source 到 sink 的链路是通的,才表示当前漏洞是存在的
具体语法可以学习:CodeQL从入门到放弃
CodeQLpy
CodeQLpy 是一款基于 CodeQL 实现的自动化代码审计工具,目前仅支持java语言,后期会增加对其他语言的支持,支持对多种不同类型的java代码进行代码审计,包括jsp文件、SpringMVC的war包、SpringBoot的jar包、maven源代码
安装 CodeQL 之后,把 python 文件放到 CodeQL 目录下,安装依赖库
1 | pip3 install -r requirements.txt |
然后需要进入config目录下修改ini配置,有空格需要加上引号
1 | [codeql] |
生成数据库初始化
1
2
3// -c 选项不加默认扫描java文件,加上即扫描class文件
// -t参数表示目标源码的路径,支持的源码类型是文件夹,jar包和war包
python3 main.py -t 指向要审计的项目运行之后,会在最后提示下一步要执行的命令
生成数据库
1
2
3
4# windows
codeql database create out/database/micro_service_seclab-main --language=java --source-root="C:\Users\admin\Downloads\micro_service_seclab-main" --command="D:\_Tools\My_Safe_Tools\codeql\CodeQLpy-master\out\decode/run.cmd" --overwrite
# linux
codeql database create out/database/SecExample-main --language=java --command="/bin/bash -c /Users/xxx/CodeQLpy/out/decode/run.sh" --overwrite运行之后生成数据库,如果有错请忽略,最终只要看到 Successfully created database 就可以
最后查询漏洞
1
python main.py -d out/database/micro_service_seclab-main
运行之后程序会使用自带的查询 ql 语句进行漏洞扫描,完成之后会自动生成 csv 文件
开源项目
参考文章