白盒测试的概念及测试方法

读者提问:什么是白盒测试,测试方法有哪些?

阿常回答:

一、白盒测试

白盒测试又称结构测试、透明盒测试、逻辑驱动测试或基于代码的测试。

我们可以把软件当成一个透明的盒子,测试者必须检查程序的内部结构,从检查程序的逻辑着手,得出测试数据。

需要注意的是,做白盒测试需要精通编程语言哦。比如这款程序是用 Java 语言开发的,那我们就得精通 Java 语言。

二、测试方法

1、白盒测试法

代码检查法、静态结构分析法、静态质量度量法、逻辑覆盖法、基本路径测试法、域测试、符号测试、路径覆盖和程序变异。

2、覆盖标准

逻辑覆盖、循环覆盖和基本路径测试。

3、逻辑覆盖

发现错误的能力由弱到强依次是:语句覆盖、判定覆盖、条件覆盖、判定条件覆盖、条件组合覆盖、修改条件判断覆盖。

阿常碎碎念:

因为白盒测试对于编程水平要求较高,白盒测试通常是由开发人员在做单元测试时执行的。

精通一门编程语言比如 Java / Python 的测试人员,写自动化脚本时可以通过做白盒测试来检查程序的内部逻辑。

4.精通APM-精准测试覆盖率Jacoco

  1. JaCoCo简介
  2. 技术能做什么
  3. 实现原理
  4. 最佳实践及注意事项
  5. 进阶用法
  • 集成 JaCoCo agent 到 CI/CD 环境
  • 如何优化测试覆盖率不达标
  • 通过SonarQube集成JaCoCo来展示每次构建的覆盖率情况

JaCoCo(Java Code Coverage)是一个为Java应用程序提供代码覆盖率衡量的开源工具。它可以检测Java字节码的执行情况,生成全面的代码覆盖报告。

在JaCoCo出现之前,Java程序员已经有了一些代码覆盖率工具可供选择,如Cobertura、Emma等。但这些工具要么功能有限,要么配置复杂、效率低下。JaCoCo诞生于2009年,旨在提供一个可靠、高效且易于集成的代码覆盖率解决方案。

  • 高效:JaCoCo直接在运行时插桩字节码,无需进行额外的构建步骤,大大提高了效率
  • 易于集成:JaCoCo可以轻松集成到Maven、Ant等构建工具中,与CI/CD无缝衔接
  • 全面覆盖:支持多种代码覆盖类型,如指令、分支、循环、行、方法等
  • 丰富报告:生成HTML/XML/CSV格式报告,支持多种报告视角和过滤选项
  • 跨平台:工作于JVM之上,支持所有基于Java的应用程序

代码覆盖率分析日益成为高质量软件交付的标配,JaCoCo作为主流工具将持续获得支持和增强。未来或将完善对最新Java版本和框架的支持,提升可视化报告质量,简化工作流程集成等。

  1. 无侵入性插桩利用Java Agent机制,在目标JVM启动时注入JaCoCo的运行时代理代理分析类文件,找到需要插桩的位置,并修改字节码指令修改后的类将记录运行时的执行路径,用于覆盖率统计
  2. 支持多种覆盖类型通过ASM字节码分析和修改框架,精确分析Java字节码结构识别方法、分支、循环等代码结构,进行精准插桩运行时跟踪这些代码结构的执行情况,统计覆盖率数据
  3. 生成报告汇总运行时收集的原始执行数据根据报告格式需求,将原始数据与源代码进行映射处理使用模板生成HTML/XML/CSV格式报告,包括统计数据和源码高亮视图
  4. 轻量高效只在被测程序的运行时进行一次字节码改写,不影响编译过程插桩代码只添加少量指令,与原程序指令平行执行,开销很小无需频繁读写文件,执行性能接近不插桩场景
  5. 报告可视化使用JavaScript和CSS渲染HTML报告,生成代码高亮视图报告分为文件/包/类等多个层级,支持交互式展开折叠条形图将不同覆盖类型直观展示,辅助分析质量状况
  6. CI集成为Maven、Ant、Gradle等主流构建工具提供插件扩展将覆盖率报告作为质量关卡,阻止低覆盖率应用部署上线与CI服务器JenkinsBamboo等无缝集成,实现持续交付
  1. JaCoCo Agent加载通过Java命令行参数-javaagent启动JaCoCo代理或者在运行时,通过Instrumentation接口动态加载代理代码JaCoCo代理初始化,准备修改应用字节码
  2. 字节码扫描JaCoCo利用ASM框架,扫描应用所有的类文件和字节码识别需要插桩的目标代码,如分支、循环、方法调用等
  3. 插桩改写在目标代码处插入计数器,用于统计执行路径覆盖情况识别已插桩过的类,避免重复插桩浪费资源
  4. 执行跟踪代理启动执行数据服务器,用于接收每个计数器的数据应用执行时,相应计数器将执行路径数据发送给服务器
  5. 数据采集执行数据服务器实时汇总收集计数器执行数据应用退出前,JaCoCo代理保存最终的执行数据文件
  6. 报告生成读取执行数据文件,结合未插桩的类文件,生成汇总报告根据报告格式要求,渲染统计数据和源码视图
  • Java Agent:Java Agent是JVM启动时通过特殊选项指定的代码,可以对JVM进行监控、修改、增强等操作。JaCoCo以Java Agent形式注入代码,实现字节码插桩。
  • ASM字节码工具:JaCoCo利用了ASM框架对Java字节码进行分析和修改。ASM提供了访问者模式API,可精确遍历、操作字节码指令序列。
  • 执行数据服务器:JaCoCo的执行数据服务器充当数据收集器,用于接收插桩后的应用代码发送的覆盖率数据,汇总统计最终数据。
  1. 排除无需测试的代码通过配置规则排除第三方类、实用类等无需测试覆盖的代码避免这些代码拉低整体覆盖率,影响质量评估准确性
  2. 针对产品覆盖率设置目标根据产品特点和质量要求,设置合理的覆盖目标新产品起步阶段,可设置70%以上的目标循序渐进提升成熟产品应设置90%以上较高目标,确保质量长期可控
  3. 集成到CI/CD流程将JaCoCo覆盖率检查集成到持续集成和交付流程中构建验证通过后自动生成报告,低于阈值时阻止部署上线持续监控和反馈覆盖率,指导测试用例优化和补充
  4. 代码审计和评审定期审计JaCoCo反馈的未覆盖代码评估这些未覆盖代码的重要性及潜在风险针对高危区域补充测试用例,提高覆盖率
  5. 与测试框架集成JaCoCo可与主流单元测试框架如JUnit、TestNG等集成在运行测试用例时自动启动JaCoCo跟踪覆盖率简化了测试、质量管理的工作流,高效获取覆盖率反馈
  1. 插桩开销JaCoCo插桩后的应用会有一定程度的性能损耗实际生产环境不应保留插桩代码运行,仅开发测试时启用
  2. 报告一致性生成报告的源码版本要与被测试的班次保持一致避免类删除、移动等导致源码映射错位
  3. 多线程场景JaCoCo需要同步多线程并发执行数据开销会随线程数增加而线性增长
  4. 易遗漏的覆盖场景枚举类、内部类等容易被测试用例遗漏多线程、异常等场景也需注意测试覆盖
  5. 自动生成代码对于框架或反射自动生成的代码,JaCoCo无法进行插桩应通过其他手段如mock或集成测试补充这部分覆盖率
  1. 当 CI/CD 管道运行时,它首先会执行编译构建和单元测试的任务。这个阶段,我们通常会通过配置 Maven 或 Gradle 插件来启动 JaCoCo agent。例如,如果使用 Maven,我们可以在 pom.xml 中添加 JaCoCo 插件的配置。
  2. 在配置JaCoCo agent时,你需要为其指定一个输出目录,该目录用于存放生成的覆盖率报告。当单元测试运行时,JaCoCo agent 会对字节码进行增强,跟踪执行路径,然后收集覆盖率数据。
  3. 当单元测试运行结束后,JaCoCo agent 会生成覆盖率报告(比如 XML 或 HTML 格式),并将其保存到你之前指定的输出目录。
  4. 然后,可以使用一些 CI/CD 插件(比如 Jenkins 的 JaCoCo plugin)来解析这些覆盖率报告,展示覆盖率信息。
  5. 在测试任务完成,JVM 关闭时,JaCoCo agent 也会被自动卸载。因为 JaCoCo agent 是以 JVM 参数的形式加载的,其生命周期与 JVM实例一致。

也就是当 CI/CD 流程的构建任务开始时,它会启动一个新的 JVM 进程,并在这个进程中运行构建脚本(例如 Maven 或 Gradle 脚本),加载 JaCoCo agent,并执行单元测试。这所有的过程都是在这一个 JVM 进程中完成的。当构建任务结束后,这个 JVM 进程就会关闭,同时也会卸载 JaCoCo agent。但是这并不会影响你的应用的正常运行,因为你的应用运行在另一个独立的 JVM 进程中

  1. 增加测试用例:检查是否有未覆盖的代码段或路径,为这些部分编写对应的测试用例。
  2. 进行边界值和异常情况测试:确保测试中包含判断逻辑的边界情况,例如为空、为0、为极限值等情况。同时需要测试异常处理路径,例如处理无效输入的逻辑。
  3. 优化代码结构:如果代码中存在过于复杂的逻辑判断和多重嵌套,可以考虑重构代码,以简化控制流程。
  4. 使用白盒测试:白盒测试指的是直接测试代码的内部逻辑,这能帮助我们找到哪些路径未被覆盖。
  5. 导入正确的依赖:确保所有的测试库和代码库都正确导入,未被误引导至错误的库中。
  6. 使用Mock对象:某些情况下,为了测试一段代码,可能需要编写复杂的上下文环境。在这种情况下,可以使用Mock对象来创建这些上下文。

最后,覆盖率是一个参考指标,不能完全代表代码质量。重要的是要做到对产品功能和业务逻辑的全面覆盖。

  • 直接使用JaCoCo不支持增量测试覆盖率报告,它将报告所有测试的覆盖率,而不只是针对某次commit的增量修改部分代码。
  • 如果需要得到增量覆盖率报告,就需要整合其他的工具。例如,“SonarQube”就支持增量覆盖率管理,能够结合CI/CD工具,在每次代码修改后触发增量覆盖率分析。也就是说,结合SonarQube,可以看到针对某次commit修改部分的覆盖率数据。
  • 注意,SonarQube默认情况下会分析全量的代码。为了得到每次commit的修改的增量覆盖率报告,你需要在设置中启用增量模式(Leak Period模式),设置为previous_version,这样它将只分析自上次版本发布以来的新代码。

RCE代码及命令执行

RCE漏洞,可以让攻击者直接向后台服务器远程注入操作系统命令或者代码,从而控制后台系统。

  1. 调用第三方组件存在的代码执行漏洞。
  2. 用户输入的内容作为系统命令的参数拼接到命令中。
  3. 对用户的输入过滤不严格。
  4. 可控变量或漏洞函数。

像命令执行和代码执行漏洞,通常需要看网站的情况,若网站只是单单的一个页面那么基本上就不可能存在该漏洞,若网站可能存在一些输入ip、调用接口等那么可能存在,但是通常该漏洞多数需要配合代码审计或者拿到源码,否则很难挖掘到。

该漏洞的出现是由于应用系统从设计上需要给用户提供指定的远程命令操作的接口,例如在防火墙的WEB界面中会存在一个故障排除功能,里面就会存在类似Ping操作的界面,若设计者未针对这类功能进行严格的控制检测,则可能导致攻击者提交恶意命令,从而控制后台,控制服务器。

白盒:可以对代码进行审计。

黑盒:这里就可以使用一些漏扫工具、公开的漏洞、手工看功能点及参数值,其中参数值主要需要看是否和相关的漏洞函数有关,若有就可以进行测试,但是可能存在加密的情况,那么还需要进行解密。

这个漏洞和命令执行漏洞差不多,根据设计的需求,需将用户输入的部分代码进行执行,从而导致远程代码执行漏洞的出现。所以,开放的代码执行,需要针对代码进行做严格的控制,避免出现相应的漏洞。

整体的检测方式和命令执行都是一样的,只是输入的方式不同

白盒:可以对代码进行审计。

黑盒:这里就可以使用一些漏扫工具、公开的漏洞、手工看功能点及参数值,其中参数值主要需要看是否和相关的漏洞函数有关,若有就可以进行测试,但是可能存在加密的情况,那么还需要进行解密。

这两者的区别主要在于命令执行是调用操作系统命令进行执行,而代码执行是调用服务器网站的代码进行执行。

借鉴链接

该函数会将执行的结果输出并将输出结果的最后一行作为字符串返回,如果执行失败则返回fale。这个函数也是经常被使用到的。

该函数不会输出结果,但是会返回执行结果的最后一行,可以结合output进行结果的输出。

该函数只调用命令,并将运行的结果原封不动的输出,没有相应的返回值。

该函数不会输出结果,返回执行结果 使用反引号(“)时调用的就是此函数。

当然还有很多的其他函数,可以自学百度搜索。

在进行命令执行之前首先需要来了解一下基本的Windows命令以及Linux命令,这里我们只做简单的介绍,倘若真的发现该漏洞了,可以直接在网上查找到相关的命令组成进行执行。

Windows的基础命令准确来说也就是cmd中输入的命令,例如ping、tracert、telnet等。

当然还有很多的命令,这里只是举一些列子而已,若不知相关参数,或者使用方式,可以去搜索Windows相关的命令教程。

Linux命令我感觉更没什么好说的了,平常操作linux就是使用命令,这部分若不太了解可以去看我的linux命令总结。

这里我们用DVWA靶场来做案例。

这里我们在输入内容的时候会出现乱码的情况,可以把DVWA\\dvwa\\includes目录下的dvwaPage.inc.php文件中所有的”charset=utf-8”,全部替换修改为”charset=gb2312”即可

在low级别中是接受了用户输入的IP,服务器通过操作性的不同情况执行ping命令,并且Low级别中并未对输入的内容进行过滤。

  1. 这里我们使用net user查看一下用户,但是这里若直接输入net user,是不会执行命令的。
  1. 这里就需要使用到我们之前提到过的拼接符,并且这里并没有进行过滤,那么这里可以使用任意的拼接符,只要保证能够在拼接后正常输出即可。比如这里我使用“|”拼接符,“|”只会执行后面的,那么这里可以直接跳过,输入前边的内容,直接输入“|net user”
  2. 当然这里也可以使用别的拼接符做案例,比如使用“&&”,之前解释道,“&&”是当前面的命令为假,那么后面也不执行,反之,若前面的命令为真,那么后面就会执行,这里也就是说前面的命令能够正常执行了,那么后面的命令也就能执行,那么这里输入“127.0.0.1 && net user”
  3. 其它的可以自己试试,这里我就不全部进行执行了。

在Medium级别中是对“&&”与“;”进行了过滤,那么这里可以不使用这两个破解符即可,使用别的,比如我之前提到的“|”或者“&”。

  1. 关于“|”在Low级别中已经操作过了,那么这里我就只操作“&”,“&”破解符是不管前面的命令执不执行都会执行后面的命令。那么这里是不是也就可以直接输入“& net user”?
  2. 这里可能发现诶,并没有执行,那么你可以向下翻一翻。可以发现命令是执行了,当然最好还是完整输入。

在High级别中是对“|”进行过滤了,这里不知道是作者无意间敲了一个空格还是故意的。

1)那么这里其实就可以直接输入“|net user”,这里可能看到不是过滤了“|”怎么还能用?

其实这里主要是在“|”后面不进行空格直接连起来输入, 就可以绕过了,因为你过滤“|”关我“|”什么事?

这里我们使用墨者靶场中的命令注入执行分析,做一个全流程的操作。

靶场需要5个墨币,挺贵了,其实题目很简单,但是感觉不值得,不想买的看看也行。

命令注入执行分析

这里我们首先需要先判断一下操作系统,由于命令执行是分操作系统的,不同的操作系统的命令也是不同的,所以需要先判断一下操作系统。可以看到这里是Ubuntu系统。

这里我们就使用之前我们测试过的方式进行测试,这里我们测试了127.0.0.1 |pwd 不行,其他的我也不测试了也不行。

这里发现输入不行,为了好测试,这里直接开始抓包分析,我们抓到包后,尝试在包后面添加,然后发送。这里修改数据包后,成功发送。

这里在获取key值的时候,发现无法获取,不输出内容,那么这里就要考虑是否存在过滤,那么在linux中存在读取文件有cat、more、less、head、tail等,那么我们这里就一个个尝试

这里我们结果尝试后发现,所有的读取命令都不行,那么这里我们就要考虑其他的方式了。

在linux中还存输入重定向,就是将一个文件作为命令的标准输入,格式:cat <key_251322682818227.php。

案例中设计到的只是使用了“net user”作为演示,当然也可以使用别的一些命令,由于我这个是Windows系统,Linux系统也是一样的。至于安全,还是需要在开发过程中需要对参数进行严格的限制。

该执行代码会将中间的php代码进行解析。

该函数会将字符串当作函数进行执行,但是需要传入一个完整的语句,同时必须以;分号结尾,也是最常见的函数。

该函数是判断是否为字符串,如果是则当初代码进行执行,但是在php7.0.29之后的版本不支持动态调用。

该函数是为数组的每个元素应用回调函数。

这里和命令执行一样,涉及的函数会很多,可以自学百度搜索学习,或者在实际情况中遇到后,在搜索也行。

该案例我们使用pikachu靶场来做演示

这里我们可以根据提示可以看到,让我们提交一个我们喜欢的字符串。我们这里随便输入一些,发现返回“你喜欢的字符还挺奇怪的!”

从代码中能够看到,是把用户提到的请求内容,直接使用eval函数去执行,也就是说当函数执行的时候若报错了,那么就会直接if语句中的内容。那么当没有报错的时候就会把代码进行执行。

这里我们输入一个phpinfo();,提交执行,看看效果,可以看到能够PHP代码被执行了,并且返回了相应的结果到前端。

借鉴

PHP 向它运行的任何脚本提供了大量的预定义常量,但是在这里有很多的常量是有不同的扩展库定义的。

__LINE__显示文件中的当前行号

__FILE__显示文件的完整路径和文件名。如果用在被包含文件中,则返回被包含的文件名

__DIR__显示文件所在的目录。如果用在被包括文件中,则返回被包括的文件所在的目录

当然还有其他的这里我就举几个例子,也可以去看我给的链接,文章大佬进行详细的总结。

获取当前代码所在行数。

获得当前文件的完整路径。

获得当前文件所在的目录。

利用代码执行漏洞读取一些操作系统上的敏感文件,从而获取重要的信息。

这里读取hosts文件,读取其他文件都是一样的。

利用代码执行漏洞可以配合一句话木马,然后使用工具进行连接一句话木马,从而实现获取敏感数据。

这里就不使用pikachu靶场了,这里我们自己编写一个代码。

这里我们访问我们刚刚编写的页面。

这里我们在url后添加?a=@eval($_POST[\’cmd\’]),然后访问。

这里我们使用蚁剑进行连接测试,然后连接目标主机。

可以看到这里我们已经能连接上目标主机。

利用远程代码执行漏洞执行写文件的操作,使其生成后门木马。

这里我们依旧使用之前的准备的代码。

在URL后面添加?a=var_dump(file_put_contents($_POST[1],$_POST[2]));然后使用Post发送1=info.php&2=<?php phpinfo();?>。

这个新生成的页面是在当前目录下,也就是说你访问的是根目录,那么文件就在根目录下,那么这里可以看到我们已经成功生成了,那么如果我们生成的是一个一句话木马呢?

靶场链接:https://www.mozhe.cn/bug/detail/253

这里测试可以使用工具进行测试,工具下载链接:struts2漏洞检测工具:https://pan.baidu.com/s/13yIAHLDY1sZliQI6Wg1ZXA?pwd=t95s提取码:t95s

通过工具的检测我们可以看到是存在相应的漏洞的。

这里我们可以去网上上exp,也可以使用工具直接利用。这里我们就使用工具进行利用,这里我们通过前期的检测,我们检测出存在远程执行漏洞,那么我们可以在漏洞编号上选择相应的编号,然后在命令执行位置,输入想要执行的命令。

可以看到成功执行,后续文件不在测试怎么看key值。

这里说一下exp:意思就是利用代码,而poc:意思就是验证代码

像这个漏洞可以在网上直接找相关的exp进行操作。

例如这里写入exp的方式利用S2-015漏洞。

当然这里不能直接输入这样的命令,需要对其进行url编码。

由于使用工具很容易就获取到了key值,这里我们使用exp进行获取。

url编号后的exp

其实两者的防御都是一样的。需要对敏感函数禁用,就是之前提到的一些函数已经未提到的,同时对相关的变量进行过滤,再其次就是之上使用WAF的产品进行防护。

这里的WAF绕过我并没有提,可以自行百度搜索,因为像这类漏洞,多数需要白盒查看源代码进行代码审计然后才能发现漏洞,当然也不是说黑盒不行,主要要考虑到,对方参数有没有修改,设置了哪些过滤等等,盲猜比较麻烦。

from https://www.freebuf.com/articles/web/367358.html

本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com

点赞 0
收藏 0

文章为作者独立观点不代本网立场,未经允许不得转载。