安装CodeQL
CodeQL本身包含两部分解析引擎+SDK
-
下载已经编译好的 CodeQL 执行程序
https://github.com/github/codeql-cli-binaries/releases
下载之后配置环境变量
-
安装 SDK
CMD 进入 CodeQL 安装目录,使用 Git 安装 SDK
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
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 目录下,安装依赖库
pip3 install -r requirements.txt
然后需要进入config目录下修改ini配置,有空格需要加上引号
[codeql]
qlpath = D:\_Tools\My_Safe_Tools\codeql\ql\java\ql\test
jdk8 = "C:\Program Files\Java\jdk1.8.0_152\bin\java.exe"
jdk11 = "C:\Program Files\Java\jdk-11\bin\java.exe"
idea_decode_tool = lib/java-decompiler.jar
jd_decode_tool = lib/jd-cli.jar
jsp_decode_tool = lib/jsp2class.jar
ecj_tool = lib/ecj-4.6.1.jar
tomcat_jar = lib/tomcat_lib
spring_boot_jar = lib/spring_boot_lib
decode_savedir = out/decode/
general_dbpath = out/database/
maven_savedir = out/mvn/
decompile_type = jd
debug = on
model = fast
thread_num = 10[log]
path = out/log/
-
生成数据库初始化
// -c 选项不加默认扫描java文件,加上即扫描class文件 // -t参数表示目标源码的路径,支持的源码类型是文件夹,jar包和war包 python3 main.py -t 指向要审计的项目
运行之后,会在最后提示下一步要执行的命令
-
生成数据库
# 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 就可以
-
最后查询漏洞
python main.py -d out/database/micro_service_seclab-main
运行之后程序会使用自带的查询 ql 语句进行漏洞扫描,完成之后会自动生成 csv 文件
开源项目
- 项目监控工具 以及 Codeql 自动运行
- CodeQLpy
参考文章
- CodeQL从入门到放弃
- CodeQL与XRay联动实现黑白盒双重校验