Skip to content

前言 ​

前面我们讲过黑白盒测试和性能测试,但是呢,对于一个软件来说,安全测试也是非常重要的。就像封面所示,内容很诱人,一旦用户点击进去,就很容易让其执行非本意的操作,试想下结果……不堪设想。因此,做好软件安全测试,共同营造一个良好的软件环境是至关重要的。

在下面的这篇文章中,将讲解关于软件测试中的安全测试。一起来学习吧~

一、💿 安全测试概念 ​

1、安全测试概述 ​

安全测试是在 IT 软件产品的生命周期中,特别是产品开发基本完成到发布阶段,对产品进行检验以验证产品符合安全需求定义和产品质量标准的过程。

2、安全测试与软件生命周期的关系 ​

安全测试贯穿于软件的整个生命周期。如下图所示:

安全测试与软件生命周期的关系

3、常规测试与安全测试的不同 ​

(1)测试目标不同 ​

普通测试以发现 Bug 为目标;

安全测试以发现安全隐患为目标。

测试目标不同

(2)假设条件不同 ​

普通测试假设导致问题的数据是用户不小心造成的,接口一般只考虑用户界面;

安全测试假设导致问题的数据是攻击者处心积虑构造的,需要考虑所有可能的攻击途径。

假设条件不同

(3)思考域不同 ​

普通测试以系统所具有的功能为思考域;

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

思考域不同

(4)问题发现模式不同 ​

普通测试以违反功能定义为判断依据;

安全测试以违反权限与能力的约束为判断依据。

问题发现模式不同

二、🔍 安全测试基本原则 ​

1、培养正确的思维方式 ​

安全测试人员要有创造性思维,创造性思维能够帮助我们站在攻击者角度思考各种无法预期的情况,同时能够帮助我们猜测开发人员是如何开发的,如何绕过程序防护逻辑,以某种不安全的行为模式导致程序失效。

培养正确的思维方式

2、尽早测试和经常测试 ​

安全性缺陷和普通 Bug 没什么区别,越早发现修复成本越低,要做到这一点,最开始的就是在软件开发前期对开发和测试团队进行常见安全问题的培训,教会他们学会如何检测并修复安全缺陷。

虽然新兴的第三方库、工具以及编程语言能够帮助开发人员设计出更安全的程序,但是新的威胁不断出现,开发人员最好能够意识到新产生的安全漏洞对正在开发的软件的影响,测试人员要转变思维方式,从攻击者角度的各个细节测试应用程序,使软件更加安全。

尽早测试和经常测试

3、选择正确的测试工具 ​

很多情况下安全测试需要模拟黑客的行为对软件系统发起攻击,以确保软件系统具备稳固的防御能力。模拟黑客行为就要求安全测试人员擅长使用各种工具,如漏洞扫描工具、模拟数据流行为的前后台相关工具、数据包抓取工具等。

现在市面上提供了很多安全扫描器或者应用防火墙工具可以自动完成许多日常安全任务,但是这些工具并不是万能的。作为测试人员,我们要准确了解这些工具能做什么,不能做什么是非常重要的,切不可过分夸大或者不当使用测试工具。

选择正确的测试工具

4、尽可能测试源代码 ​

使用源代码扫描工具对软件进行代码扫描,一方面可以找出潜在的风险,从内对软件进行检测,提高代码的安全性;另一方面也可以进一步提高代码的质量。黑盒的渗透测试和白盒的源代码扫描内外结合,可以使软件的安全性得到极大程度的提高。

尽可能测试源代码

5、测试结果文档化 ​

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

一份好的测试报告应该帮助开发人员准确定位软件安全漏洞,从而有效进行漏洞修补,使软件更安全可靠。

测试结果文档化

三、🔦 常见安全漏洞 ​

1、SQL 注入 ​

(1)定义 ​

所谓 SQL 注入就是把 SQL 命令人为的输入 URL 、表格域、或者其他动态生成的 SQL 查询语句的输入参数中,最终达到欺骗服务器执行恶意的 SQL 命令。

(2)案例 ​

案例 1:

sql
str SQL=“select * from users where (name=‘“+username+”’) and (pw=‘“+password+”’); ”
sql
str SQL=“select * from users where (name=‘1’ or ‘1’=‘1’) and
(pw=‘1’ or ‘1’=‘1’); ”

案例 2:

sql
str SQL=“select * from users where (name=‘张三’;DROP TABLE users;--)”
sql
Select *from users where name=‘张三’;
DROP TABLE users

(3)如何防范 SQL 注入 ​

SQL 注入是风险非常高的安全漏洞,我们可以在应用程序中对用户输入的数据进行合法性检测,包括用户输入数据的类型和长度,同时,对 SQL 语句中的特殊字符(如单引号、双引号、分号等)进行过滤处理。

由于 SQL 注入攻击的 Web 应用程序处于应用层,因此大多防火墙不会进行拦截。除了完善应用代码外,还可以在数据库服务器端进行防御,对数据库服务器进行权限设置,降低 Web 程序连接数据库的权限,撤销不必要的公共许可,使用强大的加密技术保护敏感数据并对被读取走的敏感数据进行审查跟踪等。

2、XSS 跨站脚本攻击 ​

(1)XSS 命名 ​

XSS 全拼为 Cross Site Scripting ,意为跨站脚本,其缩写原本为 CSS ,但这与 HTML 中的层叠样式表(Cascading Style Sheets)缩写重名了,为了区分就将跨站脚本改为了 XSS 。

(2)定义 ​

XSS (Cross Site Scripting)是 Web 应用系统最常见的安全漏洞之一,它主要源于 Web 应用程序对用户输入检查和过滤不足。攻击者可以利用 XSS 漏洞把恶意代码注入到网站中,当有用户浏览该网站时,这些恶意代码就会被执行,从而达到攻击的目的。

(3)xss 攻击过程 ​

先用一张图来演示 XSS 的攻击过程:

 XSS攻击过程

XSS 攻击过程有以下 4 个步骤:

  • 攻击者通过邮件或其他方式诱使用户点击包含恶意代码的链接,例如攻击者通过 E-mail 向用户发送一个包含恶意代码的网站 home.com 。
  • 用户点击链接后,浏览器会在用户毫不知情的情况下执行链接中包含的恶意代码。
  • 将用户与 home.com 交互的 cookie 和 session 等信息发送给攻击者。
  • 攻击者拿到这些数据之后,就会伪装成用户与真正的网站进行会话,从事非法活动。

(4)如何防御 ​

对于 XSS 漏洞,最核心的防御措施就是对用户的输入进行检查和过滤,包括 URL 、查询关键字、 HTTP 头、 POST 数据等,仅接受指定长度范围、格式适当、符合预期的内容,对其他不符合预期的内容一律进行过滤。

除此之外,当向 HTML 标签或属性中插入不可信数据时,要对这些数据进行相应的编码处理。将重要的 cookie 标记为 http only ,这样 javascript 脚本就不能访问这个 cookie ,避免了攻击者利用 javascript 脚本获取 cookie 。

3、CSRF 跨站请求伪造攻击 ​

(1)定义 ​

CSRF (Cross-Site Request Forgery)为跨站请求伪造,它是一种针对 Web 应用程序的攻击方式,攻击者利用 CSRF 漏洞伪装成受信任用户的请求,来访问受攻击的网站。

(2)攻击过程 ​

下面用一张图来演示 CSRF 的攻击过程:

 CSRF攻击过程

(3)如何攻击 ​

在 CSRF 攻击中,当用户访问一个信任网站时,在没有退出会话的情况下,攻击者诱使用户点击恶意网站,恶意网站会返回攻击代码,同时要求访问信任网站,这样用户就在不知情的情况下将恶意网站的代码发送到了信任网站。

(4)CSRF 和 XSS 的不同之处 ​

XSS 是盗取用户信息伪装成用户执行恶意活动,而 CSRF 则是通过用户向网站发起攻击。

如果将 XSS 攻击过程比喻为小偷偷取了用户的身份证去办理非法业务,则 CSRF 攻击则是骗子“劫持”了用户,让用户自己去办理非法业务,以达到自己的目的。

(5)如何防范 CSRF ​

CSRF 漏洞产生的原因主要是对用户请求缺少更安全的验证机制,防范 CSRF 漏洞的主要思路就是加强后台对用户及用户请求的验证,而不能仅限于 cookie 的识别。

例如,使用 http 请求头中的 Referer 对网站来源进行身份校验,添加基于当前用户身份的 token 验证,在请求数据提交前,使用验证码填写方式验证用户来源,防止未授权的恶意操作。

(6)Referer ​

HTTP Referer 是请求头的一部分,代表网页的来源(上一页的地址),当浏览器向 Web 服务器发送请求的时候,一般会带上 Referer ,告诉服务器此次访问是从哪个页面链接过来的,服务器由此可以获得一些信息用于处理。

四、🩸 渗透测试 ​

1、渗透测试的定义 ​

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

2、渗透测试的特点 ​

渗透测试是一个渐进的并且逐步深入的过程。

渗透测试是选择不影响业务系统正常运行的攻击方法进行的测试。

3、渗透测试流程主要步骤 ​

渗透测试的主要步骤如下图所示:

渗透测试的主要步骤

4、渗透测试流程 ​

(1)明确目标 ​

  • 确定测试需求。
  • 确定客户要求渗透测试的范围。
  • 确定渗透测试规则。

(2)收集信息 ​

在信息收集阶段要尽量收集关于项目软件的各种信息,例如,对于一个 Web 应用程序,要收集脚本类型、服务器类型、数据库类型以及项目所用到的框架、开源软件等。信息收集对于渗透测试来说非常重要,只有掌握目标程序足够多的信息,才能更好地进行漏洞检测。

信息收集的方式可分为两种:

主动收集: 通过直接访问、扫描网站等方式收集想要的信息,这种方式可以收集的信息比较多,但是访问者的操作行为会被目标主机记录。

被动收集: 利用第三方服务对目标进行了解,如上网搜索相关信息。这种方式获取的信息相对较少且不够直接,但目标主机不会发现测试人员的行为。

(3)扫描漏洞 ​

在这一阶段,综合分析收集到的信息,借助扫描工具对目标程序进行扫描,查找存在的安全漏洞。

(4)验证漏洞 ​

在扫描漏洞阶段,测试人员会得到很多关于目标程序的安全漏洞,但这些漏洞有误报,需要测试人员结合实际情况,搭建模拟测试环境对这些安全漏洞进行验证。被确认的安全漏洞才能被利用执行攻击。

(5)分析信息 ​

经过验证的安全漏洞就可以被利用起来向目标程序发起攻击,但是不同的安全漏洞,攻击机制并不相同,针对不同的安全漏洞需要进一步分析,包括安全漏洞原理、可利用的工具、目标程序检测机制、攻击是否可以绕过防火墙等,制定一个详细精密的攻击计划,这样才能保证测试顺利执行。

(6)渗透攻击 ​

渗透攻击就是对目标程序发起真正的攻击,达到测试目的,如获取用户帐号密码、截取目标程序传输的数据、控制目标主机等。一般渗透测试是一次性测试,攻击完成之后要执行清理工作,删除系统日志、程序日志等,擦除进入系统的痕迹。

(7)整理信息 ​

渗透攻击完成之后,整理攻击所获得的信息,为后面编写测试报告提供依据。

(8)编写测试报告 ​

测试完成之后要编写测试报告,阐述项目安全测试目标、信息收集方式、漏洞扫描工具以及漏洞情况、攻击计划、实际攻击结果、测试过程中遇到的问题等,此外,还要对目标程序存在的漏洞进行分析,提供安全有效的解决办法。

五、🛠️ 常见安全测试工具 ​

1、Web 漏洞扫描工具-AppScan ​

(1)定义 ​

AppScan 是 IBM 公司出的一款 Web 应用安全测试工具,它采用黑盒测试方式,可以扫描常见的 web 应用安全漏洞。

(2)AppScan 的扫描过程 ​

AppScan 的扫描过程为:探测、测试、扫描。

在探测阶段, AppScan 通过发送请求对站内的链接、表单等进行访问,根据响应信息检测目标程序可能存在的安全隐患,从而确定安全漏洞范围。

在测试阶段, AppScan 对潜在的安全漏洞发起攻击。 AppScan 有一个内置的测试策略库,测试策略库可以针对相应的安全隐患检测规则生成对应的测试输入, AppScan 就使用生成的测试输入对安全漏洞发起攻击。

在扫描阶段, AppScan 会检测目标程序对攻击的响应结果,并根据结果来确定探测到的安全漏洞是否是一个真正的安全漏洞,如果是一个真正的安全漏洞则根据其危险程度确定危险级别,为开发人员修复缺陷提供依据。

2、端口扫描工具-Nmap ​

(1)定义 ​

Nmap 是一个网络连接端口扫描工具,用来扫描网上计算机开放的网络连接端口。确定服务运行的端口,并且推断计算机运行的操作系统。它是网络管理员用以评估网络系统安全必备工具之一。

(2)Nmap 的具体功能 ​

Nmap 具体功能如下:

  • 主机扫描
  • 端口状态扫描
  • 应用程序版本探测
  • 操作系统探测
  • 防火墙/IDS 逃避和欺骗
  • 支持测试对象交互脚本

3、抓包工具-Fiddler ​

(1)定义 ​

Fiddler 是一个 http 协议调试代理工具,它以代理 Web 服务器形式工作,帮助用户记录计算机和 Internet 之间传递的所有 HTTP(HTTPS) 流量。

如图所示:

抓包工具

(2)Fiddler 的功能 ​

Fiddler 可以捕获来自本地运行程序的所有流量,从而记录服务器到服务器、设备到服务器之间的流量。此外, Fiddler 还支持各种过滤器,过滤出用户想要的流量数据,节省大量时间和精力。 相比于其他抓包工具, Fiddler 小巧易用,且功能完善,它支持将捕获的流量数据存档,以供后续分析使用。

4、Web 渗透测试工具-Metasploit ​

(1)定义 ​

Metasploit 是一个渗透测试平台,能够查找、验证漏洞,并利用漏洞进行渗透攻击。它是一个开源项目,提供基础架构、内容和工具来执行渗透测试和广泛的安全审计。

(2)Metasploit 的具体功能 ​

对于渗透攻击, Metasploit 主要提供了以下功能模块:

渗透模块(exploit): 运行时会利用目标的安全漏洞进行攻击。

攻击载荷模块(payload): 在成功对目标完成一次渗透之后,测试程序开始在目标计算机上运行。它能帮助用户在目标系统上获得需要的访问和行动权限。

辅助模块(auxiliary): 包含了一系列的辅助支持模块,包括扫描模块、漏洞发掘模块、网络协议欺骗模块。

编码器模块(encoder): 编码器模块通常用来对我们的攻击模块进行代码混淆,逃过目标安全保护机制的检测,如杀毒软件和防火墙等。

Meterpreter: 使用内存技术的攻击载荷,可以注入到进程之中。它提供了各种可以在目标上执行的功能。

(3)Metasploit 的作用 ​

Metasploit 是一个多用户协作工具,团队成员可以共享主机数据,查看收集的证据以及创建主机备注以共享有关特定目标的知识。最终, Metasploit 可帮助用户确定利用目标的最薄弱点,并证明存在漏洞或安全问题。

六、🔚 结束语 ​

对于软件测试来说,除了黑白盒测试、性能测试以外,安全测试也尤为重要。一旦网页有漏洞,攻击者很容易就让受攻击者执行非本意的操作,这种场面并不是谁都想看到的。因此,对于软件来说,要做好安全测试 🙋

关于安全测试的内容就讲到这里啦!如有不理解或文章有误,欢迎评论区留言或私信我交流!

同时,有需要了解软件测试相关的其他内容,可到『软件测试』栏目进行查看学习~

Released under the MIT License.