【CodeQL 教程】第一篇:开始 0day 带门的钥匙!

admin 2024年1月23日14:41:03评论31 views字数 3927阅读13分5秒阅读模式

前言

在正式进入本篇文章之前,请允许我为大家献上两个小福利。

福利一:

现在 Freebuf 帮会补贴,仅需 149 元即可获得【炼石计划@赛博代审之旅】永久。但名额有限,时间有限,截止到本月底。目前已更新一百五十余篇代码审计干货文章,现在加入就能回本,以后全白嫖呀!点击下方链接赶快获取!

代码审计入门与进阶的小小尛建议,希望能对你有帮助!

福利二:

《Java代码审计零基础到实战》线上培训课程第二期开始招生了,本期还剩少量名额。如果你想系统化学习 Java代码审计,并且希望有人手把手带着。欢迎点击下方链接,报名参加,仅需中三位数!本套课程,六大阶段,55 节课程,90天学习计划,中班教学。【在线直播 + 加密视频 + 学习文档 + 内部群聊 + 在线答疑 + 线上考核】多维度保障学习结果。更有 Ysoserial,ColdeQL 实战教程!目前已有不少朋友加入了哟!第二期还有十个左右名额,赶紧冲!偷偷内卷,一鸣惊人!

《Java代码审计零基础到实战》第二期在线招生,还有少量名额,这套课程为何如此火爆?

进入正题

本章节内容如下

CodeQL简介
什么是CodeQL
为什么要使用CodeQL
如何使用CodeQL
CodeQL 工作流程
创建数据库
执行QL查询
分析查询结果
下载CodeQL Cli 和 QL规则库
安装VScode ,安装VSCode CodeQL插件
小demo,测试是否能运行(使用靶场WebGoat来测试)

一、CodeQL简介

1.什么是CodeQL

CodeQL 是一种强大的静态代码分析工具,可以帮助开发者发现代码中的潜在问题和漏洞;
CodeQL会提取源码中的相关信息以及数据之间的相互关系,并根据这些信息生成CodeQL数据
库;
这样CodeQL就将代码分析过程转化成了数据库查询过程,可以执行CodeQL查询(简称QL)来查询代
码库;
GitHub 研究人员和社区贡献者提供了大量的标准CodeQL查询供我们使用,我们也可以自己编写
QL来进行自定义分析。

2.为什么要使用CodeQL

在进行漏洞挖掘时,我们通常会使用如下的两种方式:

  • 拿到源码之后,根据自己的经验和直觉直接硬刚;

  • 参考已知的漏洞,在我们的目标代码中进行变体分析;

显然第一种方法更适合技术大牛,虽然其更可能挖到高价值的0day,但是对研究人员的要求较高并且太
耗时间。第二种方式上手难度低并且效率高,而且使用 CodeQL 查询代码是执行变体分析的最有效方
法。我们先对已知漏洞进行变体,然后通过编写自己的自定义 CodeQL 查询来查找新漏洞。

何为变体分析?以下是CodeQL官方文档给出的解释:
Variant analysis is the process of using a known security vulnerability as a seed to find
similar problems in your code. It’s a technique that security engineers use to identify
potential vulnerabilities, and ensure these threats are properly fixed across multiple
codebases.
变体分析是使用已知安全漏洞作为种子来查找代码中类似问题的过程。安全工程师使用这种技术来
识别潜在的漏洞,并确保这些威胁在多个代码库中得到正确修复。

3.如何使用CodeQL

这么强大的静态代码分析工具我们应该如何使用呢?

第一次使用的话,需要以下几个步骤:

  • 搭建环境

    • 下载CodeQL的二进制可执行文件CodeQL Cli

    • 下载QL标准规则库

    • 安装VSCode CodeQL扩展

  • 生成数据库

    • 使用命令codeql database create xxx生成基于目标代码的数据库

    • 编写QL规则并运行查询

  • 根据标准QL规则编写自己的QL规则

    • 使用命令或在VSCode右键运行QL查询

  • 分析查询结果

    • 查询结果会根据我们编写的规则显示出代码中的潜在问题,并且在安装了CodeQL的插件的 VSCode中,查询结果会自动显示在源代码中。

具体的使用方式和演示例子我会在下面仔细讲解

二、CodeQL 工作流程

在安装和使用CodeQL之前,我们先来简单了解一下CodeQL 的工作流程,方便后续的学习

CodeQL 的整体工作流程如下图所示:

【CodeQL 教程】第一篇:开始 0day 带门的钥匙!

整体 工作流程 分为四个模块:

提取数据库 (Extraction):对源代码工程进行关键信息分析提取,构成一个关系型数据库CodeQL
database。
编译QL规则 (Query Compilation):将QL规则结合QL标准库编译,生成查询的执行计划。
执行QL查询 (Query Evaluation):在生成的CodeQL数据库上运行QL查询。
展示查询结果 (Query results):最终将查询结果展示给用户,方便用户进行进一步的人工审计分
析。

三、下载CodeQL Cli 和 QL规则库

1.下载CodeQL Cli

下载链接:https://github.com/github/codeql-cli-binaries

下载最近的版本:

【CodeQL 教程】第一篇:开始 0day 带门的钥匙!

我这里放到了 E:SafeToolscodeql

【CodeQL 教程】第一篇:开始 0day 带门的钥匙!

配置环境变量

【CodeQL 教程】第一篇:开始 0day 带门的钥匙!

命令行输入codeql,成功

【CodeQL 教程】第一篇:开始 0day 带门的钥匙!

2.下载QL标准规则库

下载链接:https://github.com/github/codeql

解压并放到目录:E:SafeToolscodeql

【CodeQL 教程】第一篇:开始 0day 带门的钥匙!

可以看到里面是一些写好的QL规则

【CodeQL 教程】第一篇:开始 0day 带门的钥匙!

四、安装VScode及插件

1.安装VScode

VScode大多数人应该都有,这里就不介绍安装了

下载地址:https://code.visualstudio.com/

要想使用中文,可以应用商店搜索Chinese安装中文插件

【CodeQL 教程】第一篇:开始 0day 带门的钥匙!

2.安装CodeQL插件

VSCode应用商店搜索安装CodeQL扩展

【CodeQL 教程】第一篇:开始 0day 带门的钥匙!

安装完左侧会多一个QL小图标

然后在扩展设置中设置CodeQL引擎的路径

【CodeQL 教程】第一篇:开始 0day 带门的钥匙!

现在所有准备工作已经完成,开搞开搞

五、实例演示(使用靶场WebGoat测试)

1.环境搭建

下载链接:https://github.com/WebGoat/WebGoat

我们可以在E:SafeToolscodeql目录下创建一个source文件夹,专门放我们要检测的源码

【CodeQL 教程】第一篇:开始 0day 带门的钥匙!

编译项目:

mvnw.cmd clean install

【CodeQL 教程】第一篇:开始 0day 带门的钥匙!

运行项目:

mvnw.cmd spring-boot:run

【CodeQL 教程】第一篇:开始 0day 带门的钥匙!

运行成功:

【CodeQL 教程】第一篇:开始 0day 带门的钥匙!

正常来说使用CodeQL静态审计代码是不需要运行代码的,我们这里提前编译一下是为了防止待会儿构
建数据库时出现问题不好定位问题。

2.构建CodeQL数据库

我们可以在E:SafeToolscodeql目录下创建一个databases文件夹,专门放CodeQL生产的数据库

【CodeQL 教程】第一篇:开始 0day 带门的钥匙!

使用下面命令来构建数据库:

codeql database create databases/WebGoat-db --language=java --command='mvn clean
install -DskipTests' --source-root=E:SafeToolscodeqlsourceWebGoat --
overwrite

【CodeQL 教程】第一篇:开始 0day 带门的钥匙!

构建成功

有时候构建数据库会出现如下的代码格式化问题

【CodeQL 教程】第一篇:开始 0day 带门的钥匙!

解决方法:

在 E:SafeToolscodeqlsourceWebGoat 目录下执行

.mvnw.cmd spotless:apply

3.创建QL Pack

我们可以在E:SafeToolscodeql目录下创建一个test-query文件夹,,用来存放后续编写的 CodeQL规则

【CodeQL 教程】第一篇:开始 0day 带门的钥匙!

进入到test-query,创建配置文件qlpack.yml,创建我们要编写的第一个QL规则test1.ql

使用VSCode打开文件夹test-query

配置文件qlpack.yml内容为:

name: test-query
version: 0.0.
libraryPathDependencies: codeql-java

【CodeQL 教程】第一篇:开始 0day 带门的钥匙!

4.访问标准库

为了后面编写QL规则时可以访问标准规则库,这里需要把规则库加入到VSCode工作区

【CodeQL 教程】第一篇:开始 0day 带门的钥匙!

文件 --> 将文件夹添加到工作区

添加文件E:SafeToolscodeqlcodeql到VSCode工作区

5.添加CodeQL数据库

将我们刚才创建的CodeQL数据库添加到VSCode的CodeQL插件中

【CodeQL 教程】第一篇:开始 0day 带门的钥匙!

点左边的QL图标,然后选择From a folder, 添加

E:SafeToolscodeqldatabasesWebGoat-db

【CodeQL 教程】第一篇:开始 0day 带门的钥匙!

要是有多个数据库记得点击右边的selected勾选它

6.编写QL规则并查看结果

打开test1.ql,编写一下内容,这里仅做测试,具体语法会在后面讲解

import java
from Call c
select c,"This is a method call!"

右键选择 CodeQL: Run Query on Selected Database 运行查询

【CodeQL 教程】第一篇:开始 0day 带门的钥匙!

查看运行结果,结果中显示了所有的方法调用

【CodeQL 教程】第一篇:开始 0day 带门的钥匙!

点击结果可以查看其在源代码中的相应位置

参考链接

https://github.com/github/codeql

https://www.freebuf.com/sectool/269924.html

https://l3yx.github.io/2022/03/05/CodeQL%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/

https://www.bilibili.com/video/BV1fU4y1277f?vd_source=08ec27c446c7fe3ce7235d101b3cbf

https://www.secpulse.com/archives/180773.html

https://www.4hou.com/posts/yJOW

原文始发于微信公众号(闪石星曜CyberSecurity):【CodeQL 教程】第一篇:开始 0day 带门的钥匙!

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年1月23日14:41:03
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   【CodeQL 教程】第一篇:开始 0day 带门的钥匙!https://cn-sec.com/archives/2421833.html

发表评论

匿名网友 填写信息