代码审计思路经验谈

软件漏洞概述

漏洞是指计算机系统安全方面的缺陷,使得系统或其应用数据的保密性、完整性、可用性、访问控制等面临威胁。在软件安全方面,漏洞是软件中的特定缺陷,攻击者能够利用该弱点进行敏感信息更改和破坏,或者是程序、系统层面的控制和破坏。

另一种角度,可以将漏洞看做是系统或者软件安全策略上的缺失或者不足。当软件设计和开发时严格遵循并实现安全策略,则可以实现安全性。此时代码审计则根据安全策略的原理,进行策略确实或者不足上的审计。

总体审计思路

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日 

洞源实验室

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

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

相关文章

【监控】spring actuator源码速读

目录 1.前言 2.先搂一眼EndPoint 3.EndPoint如何被注入 4.EndPoint如何被暴露 4.1.如何通过http暴露 4.2.如何通过jmx暴露 5.EndPoint是怎么实现监控能力的 6.知道这些的意义是什么 1.前言 版本:spring-boot-starter-actuator 2.6.3 阅读源码一定要带着疑…

RunnerGo:UI自动化测试神器!

UI自动化测试已经成为现代软件开发过程中不可或缺的一部分。它能够提供诸多优势,包括提高测试效率、减少人力成本、提升软件质量等。同时,可视化工具为UI自动化测试带来了更多便利和灵活性。RunnerGo近期上线脚本录制器,根据你的测试操作直接…

03_uartLinux内核模块

01_basicLinux内核模块-CSDN博客文章浏览阅读23次。环境IDubuntuMakefilemodules:clean:basic.creturn 0;运行效果。https://blog.csdn.net/m0_37132481/article/details/136157384?csdn_share_tail%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%…

驶向未来:3D可视化模型重塑我们的道路认知

在科技的浪潮中,每一个革新都是对人类未来生活的深度洞察。而今,当可视化这一技术走进我们的视野,它不仅是一场视觉盛宴,更是一次对未来出行方式的全新探索。 一、从平面到立体,解锁道路新视角 你是否曾站在十字路口&…

两宋319年,37位诗词达人编年史

公元960年后周禁军将领赵匡胤通过陈桥兵变夺取帝位,定都开封府,建立宋朝。 1 李煜 生于公元937年,宋灭南唐千古词帝李煜深陷牢狱。3年之后的七夕之夜赐药身亡,临死前留有《虞美人》 “问君能有几多愁,恰似一江春水向…

基于stm32单片机智能储物柜系统设计

超市、体育馆及浴池等公共超市都为人们提供了储物柜,一些无法随身携带的书包、手机等物品可存放在储物柜中。当前绝大多数的储物柜都是采用打印条码的方式完成储物柜的开启,之后可使用打印条码经扫描后开启储物柜拿取个人物品。但是打印条码的纸张为又小…

5、Linux 常用指令

一、帮助指令 1.man 指令 语法 man [命令或配置文件] //功能描述:获得帮助手册上的信息查看 ls 命令的帮助信息 man ls信息作用NAME命令名称SYNOPSIS如何使用命令DESCRIPTION描述命令SEE ALSO相关的手册 2.help 指令 语法 help [命令] //功能描述:获得…

什么是自动化测试?如何做自动化测试?

前面介绍了功能测试和接口测试,在介绍接口测试时提到了实现API自动化。那具体什么是自动化,为什么要做自动化,这里我们集中总结。 一. 什么是自动化? 顾名思义,自动化测试是相对人工测试而言的,它是指把人…

MT8781核心板_MTK8781安卓核心板规格参数

MT8781安卓核心板以其强大的性能和高效的能耐备受瞩目。其八核CPU架构包括(2x Cortex-A76 2.2GHz 6x Cortex-A55 2.0GHz),以及高性能的Arm Mali G57级GPU。同时,配备高达2,133MHz的LPDDR4X内存和快速的UFS 2.2级存储,大大加速了数据访问速…

【Vue前端】vue使用笔记0基础到高手第2篇:Vue知识点介绍(附代码,已分享)

本系列文章md笔记(已分享)主要讨论vue相关知识。Vue.js是前端三大新框架:Angular.js、React.js、Vue.js之一,Vue.js目前的使用和关注程度在三大框架中稍微胜出,并且它的热度还在递增。Vue.js是一个轻巧、高性能、可组件…

C语言—指针

碎碎念:做指针题的时候我仿佛回到了原点&#xff0c;总觉得目的是为了把框架搭建起来&#xff0c;我胡说的哈31 1.利用指针变量将一个数组中的数据反向输出。 /*1.利用指针变量将一个数组中的数据反向输出。*/#include <stdio.h> #include <time.h> #include <…

开源软件:推动软件行业繁荣的力量

文章目录 &#x1f4d1;引言开源软件的优势分析开放性与透明度低成本与灵活性创新与协作 开源软件对软件行业的影响推动技术创新和进步促进软件行业的合作与交流培养人才和提高技能促进软件行业的可持续发展 结语 &#x1f4d1;引言 随着信息技术的飞速发展&#xff0c;软件已经…