软件因为漏洞,导致产品的数据泄露、功能受到影响和系统被入侵等危害。安全测试就是为了发现这些问题,并给予一定的安全评估。
本文章主要介绍如何进行软件的安全性测试。
Quick Guide
安全方面
- 应用程序层的安全
- 应用程序本身的安全性
- 应用程序的数据安全
- 操作系统的安全
- 网络的安全
安全测试的要求
- 熟悉常见漏洞、逻辑漏洞的原理和检测方式
- 较强编程能力,能使用脚本或者安全工具检测漏洞
- 做好安全评估
漏洞
外部攻击方式
种类 | 类型 | 简单描述 |
---|---|---|
通用漏洞 | 暴力破解 | 利用密码字典循环去破解密码 |
通用漏洞 | SQL注入 | 注入攻击漏洞,这些攻击发生在当不可信的SQL语句作为命令或者查询语句的一部分,被发送给解释器的时候。攻击者发送的恶意数据可以欺骗解释器,以执行计划外的命令或者在未被恰当授权时访问数据。 |
通用漏洞 | XPath注入 | XPath注入攻击是指利用XPath 解析器的松散输入和容错特性,能够在URL、表单或其它信息上附带恶意的XPath 查询代码,以获得权限信息的访问权并更改这些信息。XPath注入攻击是针对Web服务应用新的攻击方法,它允许攻击者在事先不知道XPath查询相关知识的情况下,通过XPath查询得到一个XML文档的完整内容。 |
通用漏洞 | 不安全的加密存储 | 未对需要保护的数据进行加密或者加密算法太弱都是不安全的加密存储 |
通用漏洞 | 敏感信息泄露 | 许多Web应用程序没有正确保护敏感数据,如信用卡、税务ID和身份验证凭据。攻击者可能会窃取或篡改这些弱保护的数据以进行信用卡诈骗、身份窃取或其他犯罪。敏感数据值需额外的保护,比如在存放或在传输过程中的加密,以及在与浏览器交换时进行特殊的预防措施。 |
通用漏洞 | XSS跨站脚本攻击 | 恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意用户的特殊目的。 |
通用漏洞 | CSRF跨站请求伪造 | 攻击者通过调用第三方网站的恶意脚本来伪造请求,在用户不知情的情况下,攻击者强行递交构造的具有“操作行为”的数据包。(测试对象:网页中可进行输入的表单) |
逻辑漏洞 | 篡改输入 | 利用一些命令或者工具等篡改一些字段的值,从而达到恶意的效果。例如,篡改商品的单价和数量等。 |
逻辑漏洞 | 不安全的直接对象引用 | 在具有导出/下载功能的页面参数中修改内容,WEB服务器便会导出/下载程序源代码或者指定文件(测试对象:URL中有用户参数的地址,可以进行下载操作的地址)或者当开发人员暴露一个对内部实现对象的引用时,例如,一个文件、目录或者数据库密匙, 就会产生一个不安全的直接对象引用。在没有访问控制检测或其他保护时,攻击者会操控这些引用去访问未授权数据 |
逻辑漏洞 | 功能级访问控制缺失 | 大多数Web应用程序的功能在UI页面显示之前,会验证功能级别的访问权限。但是,应用程序需要在每个功能被访问时在服务器端执行相同的访问控制检查。如果请求没有被验证,攻击者能够伪造请求从而在未经适当授权时访问功能。 |
逻辑漏洞 | 缓冲区溢出 | 当计算机向缓冲区内填充数据位数时超过了缓冲区本身的容量,溢出的数据覆盖在合法数据上。 |
逻辑漏洞 | 失效的身份验证机制 | 只对首次传递的Cookie加以验证,程序没有持续对Cookie中内含信息验证比对,攻击者可以修改Cookie中的重要信息以提升权限进行网站数据存取或是冒用他人账号取得个人私密资料(测试对象:可以进行传参的URL,提交请求页面,登录后的Cookie) |
逻辑漏洞 | 会话管理劫持 | 检测Web应用程序会话机制是否存在安全隐患,能否被非法利用(会话劫持,伪装成合法用户)而影响Web应用程序的安全。 |
逻辑漏洞 | 没有限制URL访问 | 系统已经对URL的访问做了限制,但这种限制却实际并没有生效。攻击者能够很容易的就伪造请求直接访问未被授权的页面(测试对象:需要身份验证的页面) |
逻辑漏洞 | 传输层保护不足 | 在身份验证过程中没有使用SSL/TLS,因此暴露传输数据和会话ID,被攻击者截听。它们有时还会使用过期或者配置不正确的证书。(测试对象:登录模块) |
逻辑漏洞 | 未验证的重定向(redirectUrl)和转发 | 攻击者可以引导用户访问他们所要用户访问的站点。而最终造成的后果,重定向会使得用户访问钓鱼网站或是恶意网站。 |
配置漏洞 | 安全配置错误 | Config中的链接字符串以及用户信息,邮件,数据存储信息等都需要加以保护,如果没有进行保护,那么就是安全配置出现了问题。 |
APP漏洞 | 逆向反编译 | 通过提供的安装包或者客户端,反编译出原代码获取信息 |
系统漏洞 | LDAP注入 | 利用LDAP注入技术的关键在于控制用于目录搜索服务的过滤器。使用这些技术,攻击者可能直接访问LDAP目录树下的数据库,及重要的公司信息。情况还可能比这更严重,因为许多应用的安全性依赖于基于LDAP目录的单点登录环境。 |
系统漏洞 | 使用含有已知漏洞的组件 | 组件,比如:库文件、框架和其他软件模块,几乎总是以全部的权限运行。如果使用含有已知漏洞的组件,这种攻击可以造成更为严重的数据丢失或服务器接管。应用程序使用带有已知漏洞的组件会破坏应用程序防御系统,并使一系列可能的攻击和影响成为可能。危害比较严重 |
系统漏洞 | 操作系统漏洞 | 利用操作系统的漏洞,引发系统故障或者窃取信息 |
网络 | DDoS | 流量攻击,一种针对网络带宽的攻击,即大量攻击包导致网络带宽被阻塞,合法网络包被虚假的攻击包淹没而无法到达主机;一种是为资源耗尽攻击,主要是针对服务器主机的攻击,即通过大量攻击包导致主机的内存被耗尽或CPU被内核及应用程序占完而造成无法提供网络服务 |
内部攻击方式
社会工程学:通过对人的习惯、心里和数据分析,伪装或者欺骗内部人员获取信息。
检测
使用专业的具有特定功能的安全扫描软件来寻找潜在的漏洞,将已经发生的缺陷纳入缺陷库,然后通过自动化测试方法来使用自动化缺陷库进行轰炸测试。
安全测试工具
Kali Linux:基于Debian的Linux发行版, 设计用于数字取证操作系统。Kali Linux预装了许多渗透测试软件,包括nmap 、Wireshark 、msfvenom、John the Ripper,以及Aircrack-ng,超过300个渗透测试工具,永久免费,开源.
Nmap:一个网络连接端扫描软件,用来扫描网上电脑开放的网络连接端。确定哪些服务运行在哪些连接端,并且推断计算机运行哪个操作系统(这是亦称 fingerprinting)。
msfvenom:msfpayload,msfencode的结合体,可利用msfvenom生成木马程序,并在目标机上执行,在本地监听上线。
AppScan:一款安全漏洞扫描工具,支持Web和移动,现在安全测试做漏洞扫描非常适用,它相当于是”探索”和”测试”的过程,最终生成很直观的测试报告,有助于研发人员分析和修复通常安全测试工具用这个,扫描一些安全漏洞,用起来比较方便,网上资料比较多,适合很多测试同学用,资料广阔,大家可以尝试下。
Burp Suite:一款信息安全从业人员必备的集 成型的渗透测试工具,它采用自动测试和半自动测试的方式,包含了 Proxy,Spider,Scanner,Intruder,Repeater,Sequencer,Decoder,Comparer等工具模块;Proxy功能可以拦截HTTP/S的代理服务器(手机和web);Spide功能-智能感应的网络爬虫;Intruder功能可以对web应用程序进行自动化攻击等,非常适合做安全测试。通 过拦截HTTP/HTTPS的web数据包,充当浏览器和相关应用程序的中间人,进行拦截、修改、重放数据包进行测试,是web安全人员的一把必备的瑞士军刀。
Acunetix:一款网络漏洞扫描软件,它可以检测网络的安全漏洞。
sqlmap:一个开源的渗透测试工具,可以用来进行自动化检测,利用SQL注入漏洞,获取数据库服务器的权限。它具有功能强大的检测引擎,针对各种不同类型数据库的渗透测试的功能选项,包括获取数据库中存储的数据,访问操作系统文件甚至可以通过外带数据连接的方式执行操作系统命令。
OpenVAS:一个开放式漏洞评估系统,也可以说它是一个包含着相关工具的网络扫描器。其核心部件是一个服务器,包括一套网络漏洞测试程序,可以检测远程系统和应用程序中的安全问题。OpenVas服务端只允许安装在Linux系统上,接下来我们来介绍一下使用二进制搭建OpenVas的方法以及基础的使用。
fortify:静态代码检查工具
nessus:一款号称是世界上最流行的漏洞扫描程序,全世界有超过75000个组织在使用它。该工具提供完整的电脑漏洞扫描服务,并随时更新其漏洞数据库。Nessus不同于传统的漏洞扫描软件,Nessus可同时在本机或远端上遥控,进行系统的漏洞分析扫描。
zap:OWASP Zed攻击代理(ZAP)是世界上最受欢迎的免费安全审计工具之一,由数百名国际志愿者*积极维护。它可以帮助您在开发和测试应用程序时自动查找Web应用程序中的安全漏洞。
Acunetix Web Vulnerability Scanner(简称AWVS):是一款知名的网络漏洞扫描工具,它通过网络爬虫测试你的网站安全,检测流行安全漏洞
测试场景设计
正向测试过程是以测试空间为依据寻找缺陷和漏洞,反向测试过程则是以已知的缺陷空间为依据去寻找软件中是否会发生同样的缺陷和漏洞,两者各有其优缺点。反向测试过程主要的一个优点是成本较低,只要验证已知的可能发生的缺陷即可,但缺点是测试不完善,无法将测试空间覆盖完整,无法发现未知的攻击手段。正向测试过程的优点是测试比较充分,但工作量相对来说较大。因此,对安全性要求较低的软件,一般按反向测试过程来测试即可,对于安全性要求较高的软件,应以正向测试过程为主,反向测试过程为辅。
正向安全测试
为了规避反向设计原则所带来的测试不完备性,需要一种正向的测试方法来对软件进行比较完备的测试,使测试过的软件能够预防未知的攻击手段和方法。
- 先标识测试空间。对测试空间的所有的可变数据进行标识,由于进行安全性测试的代价高昂,其中要重点对外部输入层进行标识。例如,需求分析、概要设计、详细设计、编码这几个阶段都要对测试空间进行标识,并建立测试空间跟踪矩阵。
- 精确定义设计空间。重点审查需求中对设计空间是否有明确定义,和需求牵涉到的数据是否都标识出了它的合法取值范围。在这个步骤中,最需要注意的是精确二字,要严格按照安全性原则来对设计空间做精确的定义。
- 标识安全隐患。根据找出的测试空间和设计空间以及它们之间的转换规则,标识出哪些测试空间和哪些转换规则可能存在安全隐患。例如,测试空间愈复杂,即测试空间划分越复杂或可变数据组合关系越多也越不安全。还有转换规则愈复杂,则出问题的可能性也愈大,这些都属于安全隐患。
- 建立和验证入侵矩阵。安全隐患标识完成后,就可以根据标识出来的安全隐患建立入侵矩阵。列出潜在安全隐患,标识出存在潜在安全隐患的可变数据,和标识出安全隐患的等级。其中对于那些安全隐患等级高的可变数据,必须进行详尽的测试用例设计。
反向安全测试
大部分软件的安全测试都是依据缺陷空间反向设计原则来进行的,即事先检查哪些地方可能存在安全隐患,然后针对这些可能的隐患进行测试。因此,反向测试过程是从缺陷空间出发,建立缺陷威胁模型,通过威胁模型来寻找入侵点,对入侵点进行已知漏洞的扫描测试。好处是可以对已知的缺陷进行分析,避免软件里存在已知类型的缺陷,但是对未知的攻击手段和方法通常会无能为力。
- 建立缺陷威胁模型。建立缺陷威胁模型主要是从已知的安全漏洞入手,检查软件中是否存在已知的漏洞。建立威胁模型时,需要先确定软件牵涉到哪些专业领域,再根据各个专业领域所遇到的攻击手段来进行建模。
- 寻找和扫描入侵点。检查威胁模型里的哪些缺陷可能在本软件中发生,再将可能发生的威胁纳入入侵点矩阵进行管理。如果有成熟的漏洞扫描工具,那么直接使用漏洞扫描工具进行扫描,然后将发现的可疑问题纳入入侵点矩阵进行管理。
- 入侵矩阵的验证测试。创建好入侵矩阵后,就可以针对入侵矩阵的具体条目设计对应的测试用例,然后进行测试验证。
测试方法
- 静态的代码安全测试:主要通过对源代码进行安全扫描,根据程序中数据流、控制流、语义等信息与其特有软件安全规则库进行匹对,从中找出代码中潜在的安全漏洞。静态的源代码安全测试是非常有用的方法,它可以在编码阶段找出所有可能存在安全风险的代码,这样开发人员可以在早期解决潜在的安全问题。而正因为如此,静态代码测试比较适用于早期的代码开发阶段,而不是测试阶段。
- 动态的渗透测试:渗透测试也是常用的安全测试方法。是使用自动化工具或者人工的方法模拟黑客的输入,对应用系统进行攻击性测试,从中找出运行时刻所存在的安全漏洞。这种测试的特点就是真实有效,一般找出来的问题都是正确的,也是较为严重的。但渗透测试一个致命的缺点是模拟的测试数据只能到达有限的测试点,覆盖率很低。
- 程序数据扫描。一个有高安全性需求的软件,在运行过程中数据是不能遭到破坏的,否则就会导致缓冲区溢出类型的攻击。数据扫描的手段通常是进行内存测试,内存测试可以发现许多诸如缓冲区溢出之类的漏洞,而这类漏洞使用除此之外的测试手段都难以发现。例如,对软件运行时的内存信息进行扫描,看是否存在一些导致隐患的信息,当然这需要专门的工具来进行验证,手工做是比较困难的。
如何练习
- [搭建一个靶机])(https://www.freebuf.com/sectool/102661.html)
- 进行攻击练习
- 修复漏洞,再次测试攻击,查看结果是否有效
安全性评估
当做完安全性测试后,软件是否能够达到预期的安全程度呢?这是安全性测试人员最关心的问题,因此需要建立对测试后的安全性评估机制。一般从以下两个方面进行评估。
- 安全性缺陷数据评估。如果发现软件的安全性缺陷和漏洞越多,可能遗留的缺陷也越多。进行这类评估时,必须建立基线数据作为参照,否则评估起来没有依据就无法得到正确的结论。
- 采用漏洞植入法来进行评估。漏洞植入法和可靠性测试里的故障插入测试是同一道理,只不过这里是在软件里插入一些有安全隐患的问题。采用漏洞植入法时,先让不参加安全测试的特定人员在软件中预先植入一定数量的漏洞,最后测试完后看有多少植入的漏洞被发现,以此来评估软件的安全性测试做得是否充分。
安全建议
层面
- 管理层
- 技术:建立高效统一的安全管理和权限划分,如集中授权、认证、用户和日志管理等
- 非技术:流程化、制度化去加强安全意识和规范
- 应用层
- 业务安全:防止恶意攻击
- 应用设计安全:认证、口令策略、访问控制和授权、加密、会话管理、日志、数据包含和运行安全等
- 应用编码安全:输入校验、输出编码、文件上传下载、异常处理、安全API等
- 系统层:操作系统、数据库系统、中间间系统等
- 安全加固:最小化安装、最小化服务、最强口令策略、内核参数优化等
- 恶意软件防护:防病毒、主机防火墙等
- 网络层:网络设备保护、网络拓朴安全设计、网络边界保护(如防火墙)、网络数据加密(如VPN)、网络安全检测(如IDS\IPS)等
原则
- 最小授权:只授予每个用户/程序在执行操作时所必须的最小特权。这样可以限制事故、错误、攻击带来的危害,减小特权程序之间潜在的相互影响。
- 发生故障优先保证安全:当系统发生故障时,对任何请求默认应加以拒绝。
- 深入防御原则:采用多层安全机制,这个概念范围比较大。比如在表单中的字段校验不光要在页面校验,还要在后台有相应的校验机制;比如在信任区、飞信任区之间二次部署防火墙。
- 权限分离:比如禁止root用户远程登录、多重身份校验登陆等;
- 系统架构设计和代码尽可能简洁,越复杂的系统,bug越多
- 共享事务的数量和使用尽可能少,毕竟单独控制一个操作比并行控制两个过程更容易一些;
- 安全保护机制不能依赖于攻击者对系统实现过程的无知、而只依赖于像口令/密钥这样较容易改变的东西。
- 不信任原则:要严格限制用户、外部部件的信任度,要假设他们都是不安全的。
- 对受保护的对象的每一个访问都要经过检查。
- 心理接受程度:不能通过限制、甚至组织用户访问系统资源来阻止攻击,但可以考虑引入少量可接受的使用障碍。
- 不要等开发人员编码完成才开始进行安全测试,可以负责任的将,65%以上的安全漏洞都是发生在架构设计阶段,因此要积极参与到架构设计评审活动中,将一些低中级别的隐患扼杀在摇篮中。