软件测试之安全测试

Posted 优雅的心情

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了软件测试之安全测试相关的知识,希望对你有一定的参考价值。

一、引言

1.1、为什么要学习安全测试以及什么是安全测试

 为了安全、有效的进行权限控制、不能随意提交数据进行修改、避免跨站式脚本的攻击。我们偶尔会听到这么一些报道,说某个网站的首页被篡改,敏感数据被泄露或者是重要信息被更改。其实这些问题就是因为黑客利用了系统安全漏洞,对系统进行攻击导致而成,从而导致损失的代价也是不言而喻的。因此安全测试也成为了系统质量保证中必不可少的一部分,那么安全测试具体有什么好处呢?

  • 提升产品的安全质量
  • 尽量在发布前找到安全问题予以修补降低成本
  • 度量安全等级(因为我们知道其实安全测试和找bug一样,我们不可能把系统所有的安全问题都能找到并解决,通过安全测试,我们可以大体的估计系统的安全等级)
  • 验证安装在系统内的保护机制能否在实际应用中对系统进行保护,使之不被非法入侵,不受各种因素的干扰。

1.2、什么是安全测试

 提供证据表明,在面对敌意和恶意的时候,应用仍能充分满足它的需求。安全测试是在IT软件产品的生命周期中,特别是产品开发基本完成到发布阶段,对产品进行检验以验证产品是否符合安全需求定义和产品质量标准的过程。也就是说安全测试是建立在功能测试的基础上进行的测试。简要的说安全测试主要发现包含如下的问题:

  • 信息泄露、破坏信息的完整性
  • 拒绝服务(合法用户不能够正常访问网络服务)
  • 非法使用(非授权访问)、窃听
  • 业务数据流分析
  • 假冒、旁路控制
  • 授权侵犯(内部攻击即局域网攻击)
  • 计算机病毒、恶意软件
  • 信息安全法律法规不完善

1.3、安全测试与常规测试的区别

 <1> 测试目标不同:普通测试以发现bug为目标,安全测试以发现隐患为目标
 <2> 假设条件不同:普通测试假设导致问题的数据是用户不小心造成的,接口一般只考虑用户界面;安全测试假设导致问题的数据是攻击者处心积虑构造的,需要考虑所有可能的攻击途径。
 <3> 思考域不同:普通测试以系统所具有的功能为思考域;安全测试的思考域不但包括系统的功能,还有系统的机制、外部环境、应用和数据自身安全风险与安全属性等。
 <4> 问题发现模式不同:普通测试以违反功能定义为判断依据;安全测试以违反权限与能力的约束为判断依据。

二、软件安全测试的基本原则

下面介绍一些安全测试方面的原则,遵循这些原则能够避免安全测试许多常见问题的出现。

1、培养正确的思维方式

只有跳出常规思维定式才能成功执行安全测试。常规测试只需要覆盖目标软件的正常行为,而安全测试人员则要有创造性思维,创造性思维能够帮助我们站在攻击者角度思考各种无法预期的情况,同时能够帮助我们猜测开发人员是如何开发的,如何绕过程序防护逻辑,以某种不安全的行为模式导致程序失效。

2、尽早测试和经常测试

安全性缺陷和普通Bug没什么区别,越早发现修复成本越低,要做到这一点,最开始的工作就是在软件开发前期对开发和测试团队进行常见安全问题的培训,教他们学会如何检测并修复安全缺陷。虽然新兴的第三方库、工具以及编程语言能够帮助开发人员设计出更安全的程序,但是新的威胁不断出现,开发人员最好能够意识到新产生的安全漏洞对正在开发的软件的影响;测试人员要转变思维方式,从攻击者角度的各个细节测试应用程序,使软件更加安全。

3、选择正确的测试工具

很多情况下安全测试需要模拟黑客的行为对软件系统发起攻击,以确保软件系统具备稳固的防御能力。模拟黑客行为就要求安全测试人员擅长使用各种工具,如漏洞扫描工具、模拟数据流行为的前后台相关工具、数据包抓取工具等。现在市面上提供了很多安全扫描器或者应用防火墙工具可以自动完成许多日常安全任务,但是这些工具并不是万能的。作为测试人员,准确了解这些工具能做什么,不能做什么是非常重要的,切不可过分夸大或者不当使用测试工具。

4、可能情况下使用源代码

测试大体上分为黑盒测试和白盒测试两种。黑盒测试-般使用渗透方法,这种方法带有明显的黑;盒测试本身的不足,需要大量测试用例进行覆盖,且测试完成后仍无法确定软件是否存在风险。现在,白盒测试中源代码扫描成为一种越来越流行的技术,使用源代码扫描工具对软件进行代码扫描,一方面可以找出潜在的风险,从内对软件进行检测,提高代码的安全性;另一方面也可以进一步提高代码的质量。黑盒的渗透测试和白盒的源代码扫描内外结合,可以使软件的安全性得到极大程度的提高。

5、测试结果文档化

测试总结的时候,明智且有效的做法是将测试行动和结果清晰准确地记录在文档中,产生一份测试报告。该报告最好包括漏洞类型、问题引起的安全威胁及严重程度、用于发现问题的测试技术、漏洞的修复、漏洞风险等。一份好的测试报告应该帮助开发人员准确定位软件安全漏洞,从而有效进行漏洞修补,使软件更安全可靠。

三、常见的安全漏洞

3.1、失效的身份验证机制

只对首次传递的Cookie加以验证,程序没有持续对Cookie中内含信息验证比对,攻击者可以修改Cookie中的重要信息以提升权限进行网站数据存取或是冒用他人账号取得个人私密资料(测试对象:可以进行传参的URL,提交请求页面,登录后的Cookie)

3.2、会话管理劫持

检测Web应用程序会话机制是否存在安全隐患,能否被非法利用(会话劫持,伪装成合法用户)而影响Web应用程序的安全。

3.3、SQL注入

注入攻击漏洞,这些攻击发生在当不可信的SQL语句作为命令或者查询语句的一部分,被发送给解释器的时候。攻击者发送的恶意数据可以欺骗解释器,以执行计划外的命令或者在未被恰当授权时访问数据。

3.4、XPath注入

XPath注入攻击是指利用XPath 解析器的松散输入和容错特性,能够在URL、表单或其它信息上附带恶意的XPath 查询代码,以获得权限信息的访问权并更改这些信息。XPath注入攻击是针对Web服务应用新的攻击方法,它允许攻击者在事先不知道XPath查询相关知识的情况下,通过XPath查询得到一个XML文档的完整内容。

3.5、XSS跨站脚本攻击

恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意用户的特殊目的。

3.6、CSRF跨站请求伪造

攻击者通过调用第三方网站的恶意脚本来伪造请求,在用户不知情的情况下,攻击者强行递交构造的具有“操作行为”的数据包。(测试对象:网页中可进行输入的表单)

3.7、不安全的直接对象引用

在具有导出/下载功能的页面参数中修改内容,WEB服务器便会导出/下载程序源代码或者指定文件(测试对象:URL中有用户参数的地址,可以进行下载操作的地址)或者当开发人员暴露一个对内部实现对象的引用时,例如,一个文件、目录或者数据库密匙, 就会产生一个不安全的直接对象引用。在没有访问控制检测或其他保护时,攻击者会操控这些引用去访问未授权数据

3.8、安全配置错误

Config中的链接字符串以及用户信息,邮件,数据存储信息等都需要加以保护,如果没有进行保护,那么就是安全配置出现了问题。

3.9、不安全的加密存储

未对需要保护的数据进行加密或者加密算法太弱都是不安全的加密存储

3.10、没有限制URL访问

系统已经对URL的访问做了限制,但这种限制却实际并没有生效。攻击者能够很容易的就伪造请求直接访问未被授权的页面(测试对象:需要身份验证的页面)

3.11、传输层保护不足

在身份验证过程中没有使用SSL/TLS,因此暴露传输数据和会话ID,被攻击者截听。它们有时还会使用过期或者配置不正确的证书。(测试对象:登录模块)

3.12、未验证的重定向(redirectUrl)和转发

攻击者可以引导用户访问他们所要用户访问的站点。而最终造成的后果,重定向会使得用户访问钓鱼网站或是恶意网站。

3.13、敏感信息泄露

许多Web应用程序没有正确保护敏感数据,如信用卡、税务ID和身份验证凭据。攻击者可能会窃取或篡改这些弱保护的数据以进行信用卡诈骗、身份窃取或其他犯罪。敏感数据值需额外的保护,比如在存放或在传输过程中的加密,以及在与浏览器交换时进行特殊的预防措施。

3.14、功能级访问控制缺失

大多数Web应用程序的功能在UI页面显示之前,会验证功能级别的访问权限。但是,应用程序需要在每个功能被访问时在服务器端执行相同的访问控制检查。如果请求没有被验证,攻击者能够伪造请求从而在未经适当授权时访问功能。

3.15、使用含有已知漏洞的组件

组件,比如:库文件、框架和其他软件模块,几乎总是以全部的权限运行。如果使用含有已知漏洞的组件,这种攻击可以造成更为严重的数据丢失或服务器接管。应用程序使用带有已知漏洞的组件会破坏应用程序防御系统,并使一系列可能的攻击和影响成为可能。危害比较严重

3.16、缓冲区溢出

当计算机向缓冲区内填充数据位数时超过了缓冲区本身的容量,溢出的数据覆盖在合法数据上。

3.17、LDAP注入

利用LDAP注入技术的关键在于控制用于目录搜索服务的过滤器。使用这些技术,攻击者可能直接访问LDAP目录树下的数据库,及重要的公司信息。情况还可能比这更严重,因为许多应用的安全性依赖于基于LDAP目录的单点登录环境。

3.18、篡改输入

利用一些命令或者工具等篡改一些字段的值,从而达到恶意的效果。例如,篡改商品的单价和数量等。

四、渗透测试

 渗透测试是利用模拟黑客攻击的方式,评估计算机网络系统安全性能的一种方法。这个过程是站在攻击者角度对系统的任何弱点、技术缺陷或漏洞进行主动分析,并且有条件的主动利用安全漏洞。渗透测试都具有以下特点:

  • 渗透测试是一个渐进的并且逐步深入的过程。
  • 渗透测试是选择不影响业务系统正常进行的攻击方法进行的测试。

渗透测试的流程:

4.1、明确目标

<1> 确定范围:测试的范围,如:IP、域名、内外网、整站or部分模块

<2> 确定规则:能渗透到什么程度(发现漏洞为止or继续利用漏洞)、时间限制、能否修改上传、能否提权…

  • 目标系统介绍、重点保护对象及特性。
  • 是否允许数据破坏?
  • 是否允许阻断业务正常运行?
  • 测试之前是否应当知会相关部门接口人?
  • 接入方式?外网和内网?
  • 测试是发现问题就算成功,还是尽可能的发现多的问题?
  • 渗透过程是否需要考虑社会工程?

<3> 确定需求:web应用的漏洞(新上线程序)?业务逻辑漏洞(针对业务的)?人员权限管理漏洞(针对人员、权限)?
根据需求和自己技术能力来确定能不能做、能做多少

4.2、分析风险,获得授权

分析渗透测试过程中可能产生的风险,如大量测试数据的处理、影响正常业务开展、服务器发生异常的应急、数据备份和恢复、测试人力物力成本…
由测试方书写实施方案初稿并提交给客户(or本公司内部领导)进行审核。在审核完成后,从客户(or本公司内部领导)获取对测试方进行书面委托授权书,授权测试方进行渗透测试。

4.3、信息收集

在信息收集阶段,我们需要尽量多的收集关于目标web应用的各种信息,比如:脚本语言的类型、服务器的类型、目录的结构、使用的开源软件、数据库类型、所有链接页面,用到的框架等。
方式:主动扫描;开放搜索
开放搜索:利用搜索引擎获得后台、未授权页面、敏感url

  • 基础信息:IP,网段,域名,端口
  • 系统信息:操作系统版本
  • 应用信息:各端口的应用,例如web应用,邮件应用等
  • 版本信息:所有探测到的版本
  • 服务信息:服务器类型、版本
  • 人员信息:域名注册人员信息,web应用中网站发帖人的id,管理员姓名等
  • 防护信息:试着看能否探测到防护设备

4.4、漏洞探测(手动&自动)

利用上一步中列出的信息,使用相应的漏洞检测

方法:
<1> 漏扫:AWVS、AppScan…
<2> 结合漏洞去exploit-db等位置找利用
<3> 在网上寻找验证POC

内容:
系统漏洞:系统没有及时打补丁
Websever漏洞:Websever配置问题
Web应用漏洞:Web应用开发问题
其它端口服务漏洞:各种21/8080(st2)/7001/22/3389
通信安全:明文传输,token在cookie中传送等

4.5、漏洞验证

将上一步中发现的有可能可以成功利用的全部漏洞都验证一遍。结合实际情况,搭建模拟环境进行试验,成功后再应用于目标中。

自动化验证:结合自动化扫描工具提供的结果
手工验证:根据公开资源进行验证
试验验证:自己搭建模拟环境进行验证
登录猜解:有时可以尝试猜解一下登陆口的账号密码等信息
业务漏洞验证:如发现业务漏洞,要进行验证
公开资源的利用
exploit-db/wooyun/
渗透代码网站
通用、缺省口令
厂商的漏洞警告等

4.6、信息分析

为下一步实施渗透做准备

精准攻击:准备好上一步探测到的漏洞exp(漏洞利用),用来精准攻击
绕过防御机制:是否有防火墙等设备,如何绕过
定制攻击路径:最佳工具路径,根据薄弱入口,高内网权限位置,最终目标
绕过检测机制:是否有检测机制,流量监控,杀毒软件,恶意代码检测等(免杀)
攻击代码:经过试验得来的代码,包括不限于xss代码,sql注入语句等

4.7、利用漏洞,获取数据

实施攻击:根据前几步的结果,进行攻击
获取内部信息:基础设施(网络连接,vpn,路由,拓扑等)
进一步渗透:内网入侵,敏感目标
持续性存在:一般对客户做渗透不需要。rookit,后门,添加管理账号,驻扎手法等
清理痕迹:清理相关日志(访问,操作),上传文件等

4.8、信息整理

整理渗透工具:整理渗透过程中用到的代码,poc,exp等
整理收集信息:整理渗透过程中收集到的一切信息
整理漏洞信息:整理渗透过程中遇到的各种漏洞,各种脆弱位置信息
目的:为了最后形成报告,形成测试结果使用。

4.9、形成报告

按需整理:按照之前第一步跟客户确定好的范围,需求来整理资料,并将资料形成报告
补充介绍:要对漏洞成因,验证过程和带来危害进行分析
修补建议:当然要对所有产生的问题提出合理高效安全的解决办法

以上是关于软件测试之安全测试的主要内容,如果未能解决你的问题,请参考以下文章

软件测试之安全测试

安全测试手法之***测试网站信息讲解

“让开发者爱上安全测试”系列之“源码安全测试”——开发者之伤

数据库软件安全测试之SQL注入

[02]剑指安全之巅:知识普及之模糊测试的新生

安全测试之AppScan