初见CodeQL

安装CodeQL

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

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

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

    下载之后配置环境变量

  2. 安装 SDK

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

    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

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 目录下,安装依赖库

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/
  1. 生成数据库初始化

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

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

    image-20231204174207054

  2. 生成数据库

    # 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. 最后查询漏洞

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

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

    image-20231205100612615

开源项目

  • 项目监控工具 以及 Codeql 自动运行
  • CodeQLpy

参考文章

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/652749.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vulnhub-dc6

信息收集 # nmap -sn 192.168.1.0/24 -oN live.port Starting Nmap 7.94 ( https://nmap.org ) at 2024-01-25 14:39 CST Nmap scan report for 192.168.1.1 Host is up (0.00075s latency). MAC Address: 00:50:56:C0:00:08 (VMware) Nmap scan report for 192.168.1.2…

JAVA多线程并发学习记录

基础知识 1.进程和线程 线程是最小的调度单位,进程是最小的资源分配单位 进程:当程序从磁盘加载到内存中这时就开启了一个进程,进程可视为程序的一个实例。大部分程序可以同时运行多个实例。 线程:线程是进程的一个子集&#…

机器学习第一个项目-----鸢尾花数据集加载及报错解决

项目步骤 如刚开始做,从 “项目开始” 看; 如遇到问题从 “问题” 开始看; 问题 报错如下 ModuleNotFoundError: No module named sklearn解决过程 查看官网,感觉可能是python版本和skilearn版本不匹配,更新一下p…

Spring MVC 请求流程

SpringMVC 请求流程 一、DispatcherServlet 是一个 Servlet二、Spring MVC 的完整请求流程 Spring MVC 框架是基于 Servlet 技术的。以请求为驱动,围绕 Servlet 设计的。Spring MVC 处理用户请求与访问一个 Servlet 是类似的,请求发送给 Servlet&#xf…

【vue3】Vue3 + Vite 项目搭建

Vue3 Vite 项目搭建 创建项目添加Vue Router 4路由配置添加Vant UI 组件库移动端rem适配添加iconfont字体图标库二次封装Axios请求库添加CSS预处理器Less添加全局状态管理插件Vuex 1.创建项目 Vite方式 1.1 进入开发目录, 执行指令创建新项目 更行node版本18 npm 7.x版本 su…

ThinkPhp3.2(qidian)部署文档

宝塔环境部署 申请域名以及域名解析 具体配置,可百度之 在宝塔面板中创建网站 上传代码导入数据配置运行目录 注意:(如果版本:thinkphp3.2 )配置 运行目录要特别注意:运行目录要选择根目录“/”&#xff…

什么是数据库的三级模式两级映象?

三级模式两级映象结构图 概念 三级模式 内模式:也称为存储模式,是数据物理结构和存储方式的描述,是数据在数据库内部的表示方式。定义所有的内部记录类型、索引和文件组织方式,以及数据控制方面的细节。模式:又称概念…

计算机今年炸了,究竟炸到什么程度呢❓

小兄弟,计算机哪年不爆炸啊! 尤其是19年,20年,21年,可以说是计算机最卷的几年,这几年也刚好是互联网企业风头正盛的几年 从这里大家可以看出来,任何一个行业都有他的周期,任何一个专…

中等题 ------ 数组以及字符串

以前刷的都是一些简单题,从一些基本的数据结构到算法,得有400多道了,简单题就先这样吧,从今天以后就开始着手中等题和困难题了。 做了一些中等题,感觉确实和简单题没法比,简单题有些直接模拟,暴…

vue3框架基本使用

一、安装包管理工具 vite和vue-cli一样,都是脚手架。 1.node版本 PS E:\vuecode\vite1> node -v v18.12.12.安装yarn工具 2.1 yarn简单介绍 yarn是一个包管理工具,也是一个构建、打包工具 yarn需要借助npm进行安装:执行的命令行npm i…

linux安装docker-compose

前言 如果你的docker版本是23,请移步到linux安装新版docker(23)和docker-compose这篇博客 查看docker版本命令: docker --version今天安装docker-compose的时候,找了很多教程,但是本地一直报错&#xff0…

c++学习第十三讲---STL常用容器---string容器

string容器: 一、string的本质: string和char*的区别: char*是一个指针 string是一个类,封装了char*,管理这个字符串,是char*的容器。 二、string构造函数: string() ; …

C#常见内存泄漏

背景 在开发中由于对语言特性不了解或经验不足或疏忽,往往会造成一些低级bug。而内存泄漏就是最常见的一个,这个问题在测试过程中,因为操作频次低,而不能完全被暴露出来;而在正式使用时,由于使用次数增加&…

STM32之IIC总线控制ATC24C04

一、存储器介绍 1、电子密码存储概述 单片机的电子密码存储是一种将密码信息以电子形式存储在单片机内部的技术。它通常用于需要保护敏感信息或限制访问权限的应用程序,如安全系统、门禁系统、电子锁等。 电子密码存储可以通过多种方式实现,以下是其中…

Linux内核进程管理

什么是进程 进程的概念 进程是处于执行期的程序和他所占用资源的总称。进程就是运行的代码,进程的声明从代码开始运行那一刻开始;单纯的程序并非是是一个进程,一个程序也可能不只包含一个进程。 进程和线程的区别,与联系 线程…

Redis常用数据类型--String

String 常用命令SETGETMGETMSETSETNXINCR/DECRINCRBY/DECRBYINCRBYFLOATAPPENDGETRANGESETRANGESTRLEN 内部编码典型应用场景 常用命令 SET 将 string 类型的 value 设置到 key 中。如果 key 之前存在,则覆盖,⽆论原来的数据类型是什么。之 前关于此 k…

mysql8安装基础操作(一)

一、下载mysql8.0 1.查看系统glibc版本 这里可以看到glibc版本为2.17,所以下载mysql8.0的版本时候尽量和glibc版本对应 [rootnode2 ~]# rpm -qa |grep -w glibc glibc-2.17-222.el7.x86_64 glibc-devel-2.17-222.el7.x86_64 glibc-common-2.17-222.el7.x86_64 gl…

.NET高级面试指南专题三【线程和进程】

在C#中,线程(Thread)和进程(Process)是多任务编程中的重要概念,它们用于实现并发执行和多任务处理。 进程(Process): 定义: 进程是正在运行的程序的实例&…

C#,数据检索算法之插值搜索(Interpolation Search)的源代码

数据检索算法是指从数据集合(数组、表、哈希表等)中检索指定的数据项。 数据检索算法是所有算法的基础算法之一。 本文提供插值搜索(Interpolation Search)的源代码。 1 文本格式 using System; namespace Legalsoft.Truffer.…

CSS color探索

CSS 颜色探索 在 CSS 的世界里,颜色为网页元素赋予了丰富的视觉效果。通过预定义的颜色名称、RGB、HEX、HSL,以及支持透明度的 RGBA 和 HSLA,我们可以创造出各种吸引人的设计。接下来,我们将通过示例代码来深入了解这些颜色应用。…