软件漏洞概述
漏洞是指计算机系统安全方面的缺陷,使得系统或其应用数据的保密性、完整性、可用性、访问控制等面临威胁。在软件安全方面,漏洞是软件中的特定缺陷,攻击者能够利用该弱点进行敏感信息更改和破坏,或者是程序、系统层面的控制和破坏。
另一种角度,可以将漏洞看做是系统或者软件安全策略上的缺失或者不足。当软件设计和开发时严格遵循并实现安全策略,则可以实现安全性。此时代码审计则根据安全策略的原理,进行策略确实或者不足上的审计。
总体审计思路
1. 代码审计思路
在实际工作中,每个项目有其预算,客户也有其更为关注的点,如何利用有限的资源,尽量达到或者超过客户预期是项目成败的关键。通常客户所关注的点是容易检测出的代码安全问题,在审计上按80/20法则及推进先后顺序,则需要将前中期审计重点放置在常见安全风险点上,而不是技术难度和复杂度都高的风险点审计。
此时合理的审计思路就显得格外重要。首先,根据项目预算确定项目时间和投入资源,根据时间和资源制定项目可执行方案。审计层面思路是先快速了解项目架构,好比浏览书本的目录,做到对项目中各个模块的功能有了解即可。为了提高整体效率,前期使用人工和工具的方式,利用工具进行初步扫描,人工进行初步审计,达到发现大多数简单安全风险的水平。中后期则进行纯人工审计,利用敏感和危险函数、数据流回溯、功能模块、安全策略、黑白盒审计等等的审计方法交叉审计和验证,尽可能多而全部的挖掘源代码中的安全风险问题。
2. 代码审计策略
2.1 全文通读审计
该策略就是通过直接通过源代码分析去审计安全风险。这种方式的审计对审计人员的能力要求相对较大,需要通读代码了解程序的答题结构,了解各个模块并理解代码各项功能。在阅读完整体代码之后,根据程序入口开始审计。
该方式的优点在于深度了解项目代码架构和功能后可以审计出较为复杂的安全风险点。缺点在于对审计人员的要求度较高,审计较为耗时。
示例(74CMS):
我们可以先看源码文件中是否含有API、admin、system等关键字的目录,这些目录通常需要重点关注。
接着就是查看关键代码,比如functions.php文件中有一些系统的关键函数和一些过滤规则
接下来可以再找一找其中的配置文件,我们可以去搜config等类型的文件名称,这些文件中会包含一些项目关键配置
2.2 功能模块审计
功能模块的审计介于全文通读、敏感和危险函数审计的两种方式之间。在降低全文源码通读的难度的前提下,适当兼顾了代码审计的深度和广度,做到比起函数审计更为全。
在模块层面上,可以进一步进行数据类型分析、对象分析、接口分析、算法分析、函数间逻辑调用分析,针对模块功能常见的安全风险点进行逐一审计,比如用户认证、文件上传、文件管理和密码找回、支付逻辑等等功能点。
示例(74CMS):
首先我们需要在源码文件夹中查看upload、login、export等源码文件,然后根据相关的功能模块进行代码审计。
导出表格相关功能:
登录模块:
2.3 敏感和危险函数审计
敏感和危险函数审计,也是代码审计中最为常见及直接的审计方式。常见的安全风险大多数由于函数使用不当造成。根据审计经验,可以获知常见安全风险涉及的敏感和危险函数,全项目检索相关函数进行定位,通过函数前后调用关系进行审计,验证相关安全风险是否存在。
该方式的优缺点也相对明显,优点在于可以快速上手进行审计,只需检索相应敏感和危险函数,快速定位到风险点,可定向审计同类型安全风险点,效果明显。缺点则是由于没有通读全文,对程序整体架构了解不够深入,在风险点的覆盖上不够全面,深度较为欠缺。
示例:
代码审计中常见的危险函数
3. 基本概念和审计方式
在进行代码审计之前,我们需要对代码审计的一些基本概念和审计方法有一定的了解。在软件开发过程中,代码审计是一种重要的安全实践,用于发现和纠正应用程序中的安全漏洞。它通过仔细检查应用程序的源代码来识别潜在的安全风险,确保应用程序在生产环境中的安全性和稳定性。
常用的审计方式有以下几种:
- 静态代码分析工具:如Fortify、Checkmarx等,可以快速自动分析源代码中的潜在安全问题,缺点是监测结果中存在较多的误报。
- 动态代码分析工具:如Burp Suite、OWASP ZAP等,用于模拟攻击者的行为并发现应用程序中的漏洞。
- 工具+人工审计:通过工具扫描配合人工检查分析源代码,发现一些自动化工具可能会错过的漏洞和弱点,并且可以排除其中审计工具扫描结果中的相关误报,增加准确率。
- 黑盒渗透测试+白盒代码审计:这种方法可以全面覆盖系统中的潜在有风险的接口或参数,做到更全面的分析,通常也需要更多人工投入。
4. 代码审计方法
根据敏感和危险函数回溯参数,查询可控变量,寻找敏感功能点进行数据流上的审计。在日常渗透测试过程中通常关注三点:输入点,数据流,输出点。首先可以通过系统功能来判断输入点的位置,常见输入点为各种查询、用户登陆界面、搜索功能、留言板或公告等参数。可以通过对应输入点的位置来追踪数据流,主要关注是否存在过滤代码对用户可控的参数做了合法性校验。
以下有几种常见思路:
1. 根据敏感和危险函数回溯参数传递过程因为大多数漏洞是由于函数的使用不当造成的。
优点:只需要搜索相应的敏感和危险函数,即可快速地挖掘想要的漏洞,可定向挖掘、高效、高质量。
缺点:由于没有了解整体代码,对项目的整体,对项目的整体框架了解不够深入,不容易了解参数的完整传播过程,会存在误报,通常也比较难发现逻辑漏洞。
2. 查找可控变量,正向追踪变量传递过程,查找可能存在安全漏洞的变量,从变量处发现安全问题。常见的可操控变量:username、id、password、File、url、path、search、MultipartFile等。
3. 寻找敏感功能点,尤其关注于易出现漏洞的功能点,如:文件上传、留言板、登录认证功能、找回密码等通过从敏感功能点入手来查找安全问题。
4. 第三方组件、中间件对比,检查Web应用所使用的第三方组件或中间件是否受到已知漏洞的影响。
5. 检查开发框架是否存在已知漏洞,或者是否存在由于开发人员使用不当而引起的安全风险。
作者:xpro
2024年2月18日
洞源实验室