模糊测试不“模糊”,高效发掘未知漏洞与 0day 攻击

news2024/11/17 17:46:03

近日,在「DevSecOps软件安全开发实践」课程上,极狐(GitLab) 高级测试工程师衡韬、极狐(GitLab) 高级后端开发工程师田鲁,分享了模糊测试的概念、必要性和在极狐GitLab 上的实践。

以下内容整理自本次直播,你也可以点击👉观看视频回放。Enjoy~

随着网络应用的普及,人们越来越关注软件安全性、稳定性和软件质量问题。而软件系统也越来越复杂,即使经过仔细测试的软件也时有 Bug 逃逸。为了解决这一问题,模糊测试作为一种高效测试方法,被广泛关注和研究。

什么是模糊测试?


概念

模糊测试(Fuzzing Test)一种黑盒/灰盒软件测试技术,通过提供随机输入来检测程序中的错误、漏洞等,帮助发现程序中的边界条件错误、内存泄漏、缓冲区溢出等潜在问题,验证软件功能的正确性、稳定性与健壮性,进而提高系统安全性。

API 模糊测试是模糊测试的典型应用。在 API 成为现代软件架构的基础与关键的背景下,作为评估 API 安全性有力手段的 API 模糊测试的重要性不言而喻。

常见测试方法论

这里延展分享软件测试中常用的测试方法论:一般分为有黑盒测试、白盒测试和灰盒测试。它们的区别在于测试人员对系统内部结构的了解程度:

  • 黑盒测试:只依据需求与功能进行测试,测试人员不需要了解内部结构与实现;

  • 白盒测试:依据结构与代码进行测试,测试人员需要完全了解或控制内部结构;

  • 灰盒测试:介于黑白盒测试之间,测试人员对部分内部结构有所了解,测试既考虑输出与功能,也关注测试覆盖率。

而模糊测试的测试用例与数据是随机生成的,不依赖于软件内部结构与实现,测试人员无需完全了解软件内部逻辑。因此,模糊测试属于黑盒或者灰盒测试,且即使不熟悉代码本身的测试人员也可以承担相应工作。

不同角色的人进行模糊测试时有何不同?


不同角色的人进行模糊测试时,视角和关注点也不同,举个例子:

开发同学更关注代码逻辑,通常根据软件内部的实现逻辑及其可能的漏洞与问题点来设计模糊测试方案。如下图,开发同学有可能直接针对代码或接口进行测试,而忽略外部依赖或上下文。

测试同学更关注业务逻辑,通常根据软件的业务逻辑、外部接口与用户场景来设计模糊测试方案。如下图,测试同学会生成真实仓库,设置多个参数值,提交包含文件变更的 commit 等,尽量更贴近实际用户操作。

安全工程师则更关注风险,通常会设计模糊测试方案来发现各种潜在的安全漏洞,更关注危害严重的问题。

理解各个测试角色的优势与局限,通过沟通协作来弥补各自的不足,精心设计全面而有针对性的测试方案,是发挥模糊测试甚至任何测试技术最大效用的要素之一。

模糊测试 VS 传统测试


模糊测试主要可以分为以下 6 个步骤:

  1. 识别目标系统;

  2. 识别输入;

  3. 生成模糊数据;

  4. 使用模糊数据执行测试;

  5. 监控系统行为;

  6. 结果记录与分析。

其中 1-5 步与传统测试工作流程高度相似度,在步骤 6:结果记录与分析上,传统测试和模糊测试是完全不同的

  • 传统测试的结果分析,关注预期结果,确认是否实现需求。例如测试能否正常登录系统,得到的结果是正常登录或不能正常登录。

  • 模糊测试的结果分析,更关注意外结果与异常行为,侧重发现未知漏洞。在上述例子中,模糊测试则是寻找和分析让登录系统崩溃的原因。换句话说,模糊测试更关注被测系统的稳定性和健壮性,不在意系统的业务行为正确性

另外一个不同之处在于,模糊测试难以用人工介入。主要因为:

  • 模糊测试产生海量随机测试用例,使得人工判断与介入每个用例变得不现实;

  • 模糊测试产生的大量测试结果需要判断预期与异常,人工难以完成,需要依靠高度自动化的算法来分析分类。

为什么要做 API 模糊测试?


API 已成为基础架构

现代软件系统基于微服务架构,大量使用 API 进行服务调用与集成。API 的安全性直接决定整体系统的安全性,所以 API 模糊测试是评估系统安全性的关键一环。

快速发布需求提高

很多企业都在使用敏捷开发,要求更短的更新周期和更高的发布频率。这增加了由于疏忽或考虑不周导致安全漏洞的概率。

而敏捷标准下,每一个迭代都是一个可用的产品,必须关注安全性;同时,无论是安全性缺陷抑或可用性缺陷,越早修复,成本越低。

因此,应用 API 模糊测试进行持续监测是一个很好的选择,确保快速迭代不会引入高危漏洞。

人工不能够完全覆盖 API 输入

如前文所言,模糊测试通过提供随机输入来检测程序中的错误、漏洞等。而 API 输入域往往过于庞大,人工很难考虑每一种输入的安全性。

API 模糊测试可以随机产生海量测试数据来尽可能覆盖所有输入场景,检验 API 的健壮性。

API 模糊测试在极狐GitLab 上的实践


在开发过程中应用模糊测试的益处显而易见,可以在 QA同学进行测试之前,极早发现问题并解决问题,减少双方沟通成本和时间。

支持格式

在极狐GitLab上,API 模糊测试目前支持以下几种格式:

  1. OpenAPI 规范(版本 2 和 3):这是 API 文档行业标准,极狐GitLab可以直接导入 OpenAPI 文件并自动生成模糊测试方案。

  2. GraphQL Schema:图查询语言,近年流行的一种查询语句。极狐GitLab 支持导入 GraphQL Schema 来定义 API 接口,并基于此生成模糊测试方案与用例。

  3. HTTP存档(HAR):通 HAR 文件格式用来存储 HTTP 交易的定期快照,包含完整请求和响应数据。极狐GitLab 可以导入 HAR 文件,解析其中的请求与响应详情,并自动生成相应的 API 测试用例与模糊测试方案。

  4. Postman 集合:知名 API 测试工具,其支持以合集格式导出 API 请求与环境等信息,文件可以直接在极狐GitLab 上导入,极狐GitLab 可自动解析其中的API 请求与环境参数详情。

接下来,以 OpenAPI 为例,分享 API 模糊测试在极狐GitLab 上的实践,主要有以下 6 个步骤:

  1. 在极狐GitLab 新建项目,把相关 API 代码和文档填入项目;

  2. 安装极狐GitLab 模糊测试工具,与相应依赖项和内容;

  3. 编写相应测试用例,极狐GitLab 提供现成接口和内容来进行测试;

  4. 运行测试;

  5. 查看结果,如有问题,则及时定位和修复;

  6. 集成到 CI/CD 中,后续每次提交新代码后,自动运行流水线,及时返回测试结果,从而尽早发现问题和解决问题。

在极狐GitLab 页面启用 API 模糊测试

模糊测试属于安全测试的一部分。

如下图,在极狐GitLab 新建项目 → 安全与合规→ 安全配置 → API 模糊测试 → 填写目标地址 + 选择扫描模式 + OpenAPI 规范文件路径 + 是否身份验证 + 扫描轮廓(例如,有一个接口,三个参数,示例中每个参数生成 20 个不同类型参数内容,来请求该接口,测试该接口是否稳定健壮。)→ 生成代码片段,即可放入 CI 运行测试。

API 模糊测试配置示例

如下图所示,极狐GitLab 项目中自带模板:API-Fuzzing·gitlab-ci.yml ,其主要作用是:

  1. 配置模糊测试的环境变量;

  2. 读取 OpenAPI. json 文件,抓取相应参数;

  3. 根据 OpenAPI.json 中的接口定义,自动生成大量测试用例组合。如果每个请求有 3 个参数,每个参数有 20 种取值,则理论上可以生成 20 的 3 次方,即 8000 个测试用例进行组合。

Build 阶段构建测试环境与准备测试数据;

Fuzz 阶段则专门执行模糊测试。

API 模糊测试配置内容

如下图展示了一个很典型的 CRUD(增删改查) 接口组合,包含 GET 和 PUT 两个接口:

  • GET 接口:用于获取用户信息,返回 UserID、名字、密码等多个字段;

  • PUT 接口:用于更新用户信息,可以更新名称、密码等字段。

下图是极狐GitLab API 模糊测试基于接口的定义自动生成相应的测试内容,主要包括

  • 接口URL与请求方法;

  • 接口所需的参数、请求体与认证信息;

  • 接口响应的验证断言或脚本;

  • 接口的模糊测试方案与大量随机测试用例;

  • 其他相关测试数据如 headers、cookies、身份信息等。

API 模糊测试执行过程

如下图,极狐GitLab API 模糊测试的执行流程大致如下:

  1. 构建测试镜像:编排 API 模糊测试所需要的环境容器,构建测试执行的 Docker 镜像;

  2. 部署被测试系统:将需要测试的系统或服务部署到环境中,运行并监听在配置的端口(如下图是777端口)上;

  3. 认证信息配置:如果被测试系统需要认证,则需在环境中配置相应的认证信息,以访问系统接口;

  4. 检出测试代码:从代码仓库中检出 API 模糊测试所要脚本、工具与用例等相关代码;

  5. 运行被测试系统:使其正常启动并监听在配置的端口上;

  6. 解析 OpenAPI 文件:使用 Pitchalizer 工具解析传入的 OpenAPI 文件,抓取其中的接口定义信息,包括 URL、方法、请求参数、headers 等内容;

  7. 生成测试用例:根据解析出的接口信息,自动生成大量的随机测试用例,包含各接口的测试数据;

  8. 执行接口请求:使用生成的测试用例对被测试系统的接口进行大规模的随机请求,同时监控系统响应与运行状况;

  9. 检查接口响应:检查结果是否符合预期,判断接口功能是否正确以及系统稳定性等。

API 模糊测试执行结果

最终总共是执行 259 个 API 请求。

如下图,示例一共是写 4 个接口,最终总共是执行 259 个 API 请求,平均每个接口大超过 60 个请求。可见模糊测试可以通过大量自动化测试来检测 API 接口健壮性,大幅提升测试效率,尽早解决问题。

以上就是关于 API 模糊测试的内容与实践,希望今天的分享对大家有帮助!

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

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

相关文章

合宙Air724UG Cat.1模块硬件设计指南--SIM卡接口

SIM卡接口 简介 SIM( Subscriber Identity Module)卡为用户识别模块,内部使用新式单片机及存储器管理结构,包含了大规模的集成电路,同时也称为用户识别卡。通信设备通过SIM卡来识别其用户,只有设备插入SIM卡后才能入网使用。SIM卡…

Javac编译原理:基本结构和工作原理

Javac编译器 文章目录 Javac编译器简介基本结构如何编译程序 工作原理词法分析器语法分析器语义分析器代码生成器 简介 javac是一种编译器,能将一种语言规范转化成另一种语言规范 编译器通常是将便于人理解的语言规范转换成容易理解的语言规范,如C都是…

阿里云服务器价格如何?与其他云服务提供商的价格对比如何?

阿里云服务器价格如何?与其他云服务提供商的价格对比如何?   阿里云服务器价格概述   作为全球领先的云计算服务提供商,阿里云在确保服务器性能和安全性的同时,也非常注重产品的价格竞争力。阿里云服务器(ECS&…

OpenMMLab-AI实战营第二期——6-2.玩转AIGC神器MMagic

文章目录 1. 基本介绍2. 动手实验 视频链接:玩转AIGC神器MMagic 代码教程:https://github.com/TommyZihao/MMagic_Tutorials 1. 基本介绍 Stable Diffusion的文生图,以及controlnet和dreamboost的图生图(输入一个图像文字描述&am…

python Django web 项目 联通用户管理系统

文章目录 1框架MVC 介绍Django 框架的介绍基础命令Django处理浏览器的请求的流程 部门表部门表显示7.模板的继承部门表的添加部门表的删除request.POST.get(‘key’) 、 request.GET.get(key, )部门表的编辑filter() 得到可迭代的QuerySet对象,支持for循环取容器内的元素first(…

图神经网络 GNN 入门

参考链接 A Gentle Introduction to Graph Neural Networks (distill.pub) 零基础多图详解图神经网络(GNN/GCN)【论文精读】_哔哩哔哩_bilibili 目录 图的基本构成 图的表示方法 图的示例 图网络的基本任务 图网络的处理 影响图网络效果的超参数 …

机器人参数化建模与仿真,软体机器人

专题一:机器人参数化建模与仿真分析、优化设计专题课程大纲 机器人建模基础 机器人运动学基础几何运动学闭环解解析法建模运动学MATLAB脚本文件编写(封闭解、构型绘制)、工具箱机器人工作空间(离散法、几何法)建模工作…

客户自助服务第一步:在线客服、在线帮助中心

随着互联网的快速发展,越来越多的企业开始重视客户体验,不断提升客户服务水平。其中,客户自助服务是提高客户满意度的重要途径之一。本文将从在线客服和在线帮助中心两个方面介绍。 客户自助服务的第一步 一、在线客服 在线客服是指企业通…

【linux】探索Linux命令行中强大的网络工具:netstat

文章目录 前言一、netstat是什么?二、使用方法1.常用参数2.实例演示3.更多功能 总结 前言 在Linux命令行中,有许多实用的工具可帮助我们管理和监控网络连接。其中一个最重要的工具就是netstat,它提供了丰富的网络连接和统计信息,…

怎么压缩PDF文件,这三个方便帮你一键压缩!

PDF文件是一种广受欢迎的版式文件格式,由Adobe公司发明,具有高度的兼容性,无论在不同的软件和设备中打开,都不会影响页面的排版。如今,人们常常上网搜索并下载需要的资料,例如电子书和PPT模板,这…

合宙Air724UG Cat.1模块硬件设计指南--USB接口

USB接口 简介 USB (Universal Serial Bus,通用串行总线) 是一种新兴的并逐渐取代其他接口标准的数据通信方式,自推出以来,已成功替代串口和并口,成为21世纪大量计算机和智能设备的标准扩展接口和必备接口之一,USB 具有…

HarmonyOS学习路之开发篇—Java UI框架(JS FA调用Java PA)

JS FA调用Java PA机制 使用兼容JS的类Web开发范式的方舟开发框架提供了JS FA(Feature Ability)调用Java PA(Particle Ability)的机制,该机制提供了一种通道来传递方法调用、处理数据返回以及订阅事件上。 当前提供Ab…

从零开发短视频电商 Jmeter插件安装和常用插件

Jmeter插件安装和常用插件 插件安装方式 一种是手动安装各种插件,下载对应的jar包,放到lib\ext目录下就可以使用了。另一种是通过漂亮的 UI ,jmeter 插件管理器Plugins Manager可以方便的管理其他插件的下载和更新。安装一次插件管理器&…

1设计模式

面试专题-设计模式 前言 在平时的开发中,涉及到设计模式的有两块内容,第一个是我们平时使用的框架(比如spring、mybatis等),第二个是我们自己开发业务使用的设计模式。 面试官一般比较关心的是你在开发过程中&#…

服务器性能扩展后,重启EasyDSS但无法运行是什么原因?

EasyDSS支持一站式的上传、转码、直播、回放、嵌入、分享功能,具有多屏播放、自由组合、接口丰富等特点。平台可以为用户提供专业、稳定的直播推流、转码、分发和播放服务,全面满足超低延迟、超高画质、超大并发访问量的要求。在推流方面,Eas…

seldom 实战技巧

seldom 是我一直在维护的自动化测试框架。目前GitHub已经 500 star。 最近在项目中使用Seldom poium 编写自动化测试用例。接下来,我就分享一些使用技巧。 如何参数化测试用例 网站的首页,如上面的导航。于是,开始利用poium编写元素定位。…

进程间通信 + 消息队列

进程间通信 每个进程有各自不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1吧数据从用户空间考到内核缓冲区,进程2再从内核缓冲…

android studio自带手机投屏功能

android studio自带手机投屏功能 最新版的android studio自带有手机投屏功能,设置后直接在android studio里面就可以“实时”投屏并操控手机。 (1)File - Settings - Experimental ,打开android物理实体设备镜像开关:…

C语言之指针详解(8)

目录 本章重点 1. 字符指针 2. 数组指针 3. 指针数组 4. 数组传参和指针传参 5. 函数指针 6. 函数指针数组 7. 指向函数指针数组的指针 8. 回调函数 9. 指针和数组面试题的解析 指针和数组笔试题解析 #include<stdio.h> int main() {//一维数组int a[] { 1,2,…

ABB机器人与西门子IO通讯

ABB与西门子 Profinet IO通讯 &#xff08;888-3&#xff09; 设定步骤&#xff1a; ABB 1、IP地址 &#xff1a;192.168.0.2 IPsetting 2、站名 ABB Industrial Network -->PROFINET 修改站名 3、字节大小 8字节 PROFINET InternalDevice 4、发送接受区域 sign GO1 组输出1…