初见codeql

安装CodeQL

CodeQL本身包含两部分解析引擎+SDK

  1. 下载已经编译好的 CodeQL 执行程序

    https://github.com/github/codeql-cli-binaries/releases

    下载之后配置环境变量

  2. 安装 SDK

    CMD 进入 CodeQL 安装目录,使用 Git 安装 SDK

    1
    git clone https://github.com/Semmle/ql
  3. 安装 VS Code 插件,在应用商店搜索 CodeQL,安装第一个

    image-20231204104312841

  4. 安装之后配置 CodeQL 目录

    点击插件右侧齿轮按钮,填入 CodeQL 的安装目录,路径中需要到 codeql.exe(下图没有会有bug)

    image-20231204104429485

  5. 因为审计 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

image-20231204143940460

导入 Database

在 vscode 中导入解析完成的数据库

image-20231204143925694

数据库加载成功

image-20231204144132690

编写测试 QL 查询,在 vscode 中打开 SDK 所在文件夹,如图所示目录新建 ql 文件,右击 run query 进行查询

image-20231204144926981

基础语法

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[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/
  1. 生成数据库初始化

    1
    2
    3
    // -c 选项不加默认扫描java文件,加上即扫描class文件
    // -t参数表示目标源码的路径,支持的源码类型是文件夹,jar包和war包
    python3 main.py -t 指向要审计的项目

    运行之后,会在最后提示下一步要执行的命令

    image-20231204174207054

  2. 生成数据库

    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

    image-20231204174521388

    运行之后生成数据库,如果有错请忽略,最终只要看到 Successfully created database 就可以

  3. 最后查询漏洞

    1
    python main.py -d out/database/micro_service_seclab-main

    运行之后程序会使用自带的查询 ql 语句进行漏洞扫描,完成之后会自动生成 csv 文件

    image-20231205100612615

开源项目

参考文章

  1. CodeQL从入门到放弃
  2. CodeQL与XRay联动实现黑白盒双重校验