道普云-优品软件培育计划【第六期】—— 安全测试测试方法和测试工具(上)

软测百科

优品软件培育计划【第六期】—— 安全测试测试方法和测试工具(上)

图片


优品软件培育计划百场前沿技术系列讲座直播的第六场邀请到的是全球著名手机厂商QA Leader田超,从Web安全检测、App安全检测、Server安全检测、API服务安全检测等方面带大家一起探讨高段位测试必备技能,帮助大家建立全面稳固的安全测试知识体系现将整场讲座的内容整理如下,供大家继续学习使用。


图片

-正文-

首先跟大家聊一下,什么是安全?安全的定义是什么?我们什么时候需要安全?就像下图我们平时所用到的锁子,它可以保障物品的安全,这是一种物理的安全。锁子是机械加工制造而成的,它有它的制造原理,也有设计原理。锁子的核心就是锁簧,由几个弹子保证锁子的安全性。下面的gif动图是一个开锁工具的动态演示,知道了锁子的原理之后,就可以轻松的开锁。

图片
根据加工精度,珠子的数量决定了最大的钥匙的组合的可能性,互开率就是评价一个锁子安全与否的关键指标。如果说互开率是固定的,比如说10%的互开率,也就是说我只要试10把钥匙,总有两把钥匙是可以开同一把锁的,这个时候锁子是不太安全的。那么大家考虑下,如何做不改变锁子的设计原理的前提下,提高锁子的安全性?

在日常的生活中,一把锁子有设计、制造、销售和使用这些环节,从设计和制造工艺已经固定的情况下,最终可以解决的是要么我不安装不安全的锁子,要么就是我安装了还想安全,这时候就是这十分之二的可能性,不要把这个卖给我的邻居,邻居拿到钥匙就可以开到我家的锁。

所以答案就是,在实际的销售过程中,厂家会把同样的钥匙、同样的锁芯,卖到不同的地方,比如一把锁卖到陕西、一把锁卖到长春。跨地域之后,由于钥匙是物理钥匙,不可能经过快速的运输,快速找到这把锁。这样就可以保证,在生产制造和设计环节的安全性都没办法提高的情况下,还可以提高产品的安全性。

这是一个思路,希望通过这些小的案例给大家拓宽一些思路,我们在讲安全的时候,原理和密码的强度是固定的,如何使它相对安全,或者提高它的安全性?这也是我们在做安全测试的时候需要去思考的,毕竟每个公司的设计开发能力是有限的,但是做出的产品需要是安全的,就要从多个方面进行考虑。

刚才举的锁具的例子,它是一种物理的安全。在计算机领域,安全最多提到的是加密。

银行里面的安全,钱是要放到保险柜中用锁子锁起来,但是如果钱是放在我们的手机银行里,更多的是靠我们自己设置的密码以及银行对交易过程的数据加密,保障即使你看到加密的密码之后,你也没有办法去把它破解掉。

我们知道当银行卡丢失时,如果有人捡到你的银行卡,在ATM机上只有两次试错的机会,第三次输入错误,银行卡就会被锁定,这也是一种安全机制,它保障了我们使用的安全。

计算机里面的安全更多的是靠密码,加密算法以及密码的长度、复杂度这些手段来保障的。我们经常用电脑,作为计算机用户,大家都知道,密码设置的时候比较容易,但是要记住密码就比较难,为了记住密码,通常我们都会设置一些有规律的密码。什么是有规律的密码?123456是一种规律、654321也是一种规律。如何设置一个复杂的密码?既方便自己记住,别人又很难猜到,这个就需要一些技巧。

这里再给大家举一个例子,有一部电视剧是张嘉译主演的,他把家里的无线密码改了,孩子的妈妈就没有办法连上无线了,问他密码是什么,他说了一首唐诗,这句首诗里每个字的首字母再加一个符号、数字,这时候密码的复杂度就足够高了,你必须知道这首诗和附加的特殊字符才能猜到这个密码。我们的密码安全首先要便于记忆,再就是要有足够的复杂度,第三个要有足够的长度。再就是我们说的明文密码在计算机里要经过加密,否则就是一张白纸,你设置得再复杂,别人也是一看就明白。

就像我们之前听说过的,CSDN的用户密码全部都是明文,导致整个网站的信誉度就会下降,我不确定我在里面写的任何内容是不是都保存的是明文?

密码的复杂度有了之后,也经不起现在大数据、云计算、GPU计算以及像MD5字典这种解密工具,密码更多的是一种策略,不能说绝对安全,只能是相对安全,并且有时间限制。

另外,别人想要获取密码首先是有获取利益的需求,当密码保护的数据和信息不足以产生很大价值的时候,密码的安全度要求是不高的。

第三个问题就是我们安全性的脆弱点是在哪里?

图片
就像下面给大家放的这个图片,这是一个珠串,这个产品它本身就有一个脆弱点,就是总有一天它会断,但是从哪个珠子断我们都不确定。它可能是最容易摩擦到的地方,也有可能刚拿到手还没用就断了,它有设计的原因,也有使用的原因。所以产品的脆弱点在哪里我们无从得知,但是在做软件的时候,安全是需要我们一点点去分析,建立模型,最终保证这个产品的安全。

接下来我们再来一起来探讨安全在保护什么

在早些时候,安全是被设计成一种叫做“加密狗”的产品,它的使用方法是这个加密狗需要放在服务器的USB接口上,里面运行的程序,每一次数据都会经过加密狗的加密、解密才能保证软件产品的运作。它保障了软件的著作权,我的设计专利不会因为你拷走了这个软件就能工作,你必须要买加密狗才能让这套软件工作起来。

第二个就是“文件加密”,文件加密通常是商业公司里面,我起草了一个方案,起草了一个销售的项目书、意向书,怎么保证它的安全?不只是我要给文档加一个打开的密码、修改的密码,更多的是从二进制的角度,直接对内容进行加密,需要用特定的软件才能打开。

第三种是我们在日常工作和上网浏览的过程中经常见到的——动态验证码。它主要保证服务提供商的安全。大家都知道,网络上像黄马甲、水军等这种工具比较多,可以批量发送一些请求或数据包,导致我的系统是给特定的人群提供正常服务的,但是这些正常服务会受到干扰,很多正常的服务没有办法得到满足,反倒给有特殊动机的人提供了一些牟利的手段。为了避免这种事情发生,动态验证码就是为了验证,在操作这个网站的人,他是一个活生生的人,还是一个机器?

最开始的验证码都是比较简单的,像最左边的数字形式。随着机器学习或者图片处理算法的实现,这种密码或者动态验证码已经不能保证网站的安全了。现在更多的是像中间这种,像这第二张,姚明和李宇春,让你找出这里面有多少个姚明,还有就是12306这种,让你找出来有多少个沙拉。再有一种像最右边这张,安全验证是需要你去滑动滑块,需要手动操作一下,它的精确度要求比较高,用自动化工具或者脚本是无法完成这些识别的。这些都是为了保障服务商的安全。

图片

倒数第二个图,这个属于特定领域的验证码,它也是一种安全,它限制了什么?你能看懂个这个数学公式,能算对这个值的人,至少是大学里面学过数学的,它保障了我这个网站的受众的一个知识储备,这也是一种安全。

下面给大家举了一个例子,这个例子相当于家里的路由器,路由器有一个功能,如果插上U盘,我可以把路由器当前的配置信息,也就是说我维护的无线密码,加载的一些网关,每个网络网口做什么样的服务,这些信息都可以备份下来。备份下来之后的内容就是这张图下半的部分,它是加密的。我们是看不懂这样的文字的,但是网上有一种工具可以帮你把它解密。
图片
原理是什么呢?我拿出了这段Python代码,核心用到的就是我们学计算机语言的时候两个运算,第一个叫“模”,另一个叫“余”,其实“模”和“余”是一回事,“模”是我除完之后取“余”,对0到127这些ASCII码字符进行模余操作,把它转换到同等的空间里去,实现字符的转换。比如说M固定会转换成~、G换成Q......对于普通大众用户来说,它已经足够安全,但是对于网络上有心去做这个的人,这个就是不安全的。在普通人眼中已经很安全了,但是在特定的从业人员眼中是没有安全性的。
图片

接下来给大家介绍两个加密的方式,一个是Decode,我们平时从原文到密文的过程就叫Decode,它可以用很多算法,比如像这种模余的算法等等。


图片

也可以用Hash的方法,用Hash碰撞的方式,生成Hash串,就完全随机了,这都是保证信息安全的方法。
图片

这个信息载体所表达的内容一般人是看不懂的,必须要有一定专业基础的人才可以看懂。我们作为安全从业人员,就需要去理解这些字符串的用途是什么?是怎么样生成的?他是什么样的安全等级?就像我们生活中传统的A\B\C三种类别的锁,A级锁能15秒破解,B级锁2分钟,C级锁40分钟,我们要知道文件的加密方式它能保证多长时间能被破解掉?是1秒还是100秒?还是说得需要10年的时间才能被破解掉?

01

安全测试的概念


安全测试是在IT软件产品的生命周期中,特别是产品开发基本完成到发布阶段,对产品进行检验以验证产品符合安全需求定义和产品质量标准的过程。它一般是在产品开发基本完成到发布阶段才会去做的一件事情,这是一个普遍现象,但其实安全应该提前到更早,在设计阶段就应该把安全考虑进去,在设计的时候就验证产品的安全等级是什么样子,在最终实现的过程中再去一步步检验安全是不是达到了设计的标准。

另外,安全测试属于产品的安全需求定义书里定义的内容,也符合行业的质量标准,属于非功能需求的检验范畴,有时候我们的需求文档里可能都不体现安全,只说系统需要具备安全性,至于安全性是什么水平不明说,遵循什么样的国际标准或者国家标准也不明说,这个就需要我们安全从业人员去推广,或者通过培训,让公司、团队有安全意识。慢慢把这部分内容补充进去,才有的检验,否则就没有一个参考标准。

02

安全测试与功能测试的区别


安全测试与普通的测试有一些区别,功能测试是保证产品能够正常工作,输入A可以出来A的结果,输入B可以出来B的结果,但是安全问题是你可能输入的是%、输入的是*或者是“or 1=1”这种特殊的构造字符串,它能绕过程序设计逻辑,导致程序给用户暴露了不该暴露的数据。


我们一般认为大公司或者国外领先的公司的安全性是不错的,但其实也不一定,就像facebook它会暴漏个人隐私。我们知道个人隐私不属于程序设计方面的问题,但是在收集使用过程中它仍然属于安全,这种是数据的安全,数据的使用安全跟数据的收集安全,这也是国家从去年到今年一直在严厉打击的。非法收集公民个人信息,包括快递信息,家庭住址、电话...包括身份证的正反面、手持身份证的照片等信息,收集之后就有保管、保证其安全不泄露的义务。


这些都是功能测试里面所没有的,功能测试只是保证功能可以正常运转,上传一张手持身份证照片,上传完成后提示上传成功,但是上传成功之后,能不能被窃取到,安全测试去检查,不是功能测试检查的范畴。

目标不同:测试以发现BUG为目标,安全测试以发现安全隐患为目标。


假设条件不同:测试假设导致问题的数据是用户不小心造成的,接口一般只考虑用户界面。安全测试假设导致问题的数据是攻击者处心积虑构造的,需要考虑所有可能的攻击途径。


思考域不同:测试以系统所具有的功能为思考域。安全测试的思考域不但包括系统的功能,还有系统的机制、外部环境、应用与数据自身安全风险与安全属性等。


问题发现模式不同:测试以违反功能定义为判断依据。安全测试以违反权限与能力的约束为判断依据。

03

安全测试与渗透测试的区别


很多人认为安全测试就是渗透测试,但其实两者还是有许多区别的。渗透测试一般是有人邀请你去做安全,而安全测试是规定你必须做安全。渗透测试一般是要求外部帮我们内部来达成一个安全的检查,而安全测试是从公司内部出发,去解决安全的隐患,降低安全的风险,出发点是不一样的。


视角也不一样,渗透测试更多是攻击的方式,攻击有可能是盲目的也有可能是试探性的,但是安全测试来说,它可以看到源代码,我就知道在哪里会出问题,必须进行纠正。


从覆盖的差异来看,渗透测试只是选取边界的一些服务器或者边界的网络进行渗透,再进一步到内网,或者核心的网络,核心的服务器,需要一级级地去攻破目标才能达成下一级的目标。但是安全测试是从内部,从最核心的数据、数据库服务器、文件存储服务器以及最核心的交换机,从这些最核心的地方慢慢往外推演来保证安全。先是最核心的数据不能出现问题,再是应用不能出现问题,再就是应用和数据之间的通信不能出现问题,再就是用户访问应用的时候不能出现问题,最后再保证访问应用的这些人是安全的。


安全测试是从内到外的一种安全,而渗透测试是从外到内的,它是一种试探的方法。但是我们的安全要从源头上去解决,更重要的是从实际的可操作的层面上去直接封堵住安全漏洞。从解决方案和成本上也是有很大差异的,渗透测试是要有很大花费的,而且成效不一定很显著,但是安全测试,只要你做了这些安全检查,收效就是对等的,只要经过了这些检查,就必然没有这样的问题。

总结来说:

出发点差异:渗透测试是以成功入侵系统,证明系统存在安全问题为出发点;而安全测试则是以发现系统所有可能的安全隐患为出发点。


视角差异:渗透测试是以攻击者的角度来看待和思考问题,安全测试则是站在防护者角度思考问题,尽量发现所有可能被攻击者利用的安全隐患,并指导其进行修复。


覆盖性差异:渗透测试只选取几个点作为测试的目标,而安全测试是在分析系统架构并找出系统所有可能的攻击界面后进行的具有完备性的测试。


成本差异:安全测试需要对系统的功能、系统所采用的技术以及系统的架构等进行分析,所以较渗透测试需要投入更多的时间和人力。


解决方案差异:渗透测试无法提供有针对性的解决方案;而安全测试会站在开发者的角度分析问题的成因,提供更有效的解决方案。



现在注册/登录,即可申请产品试用

申请试用