1. 安全测试的本质
安全测试是一项旨在发现并防范软件应用程序中的漏洞、威胁和风险的软件测试。其目的在于确保软件系统的完整性、保密性、可用性以及防范潜在的信息泄露和恶意攻击,以免造成信息、收入、声誉等方面的损失。
1.1 安全测试的关键措施
-
保密性: 防止信息泄露给非预期的接收者。
-
完整性: 保障从发送者到接收者的传输是准确、正确的。
-
身份验证: 确认用户身份的合法性。
-
授权: 指定对用户和资源的合法访问权限。
-
可用性: 确保信息随时准备就绪。
-
不可否认性: 防止发送者或接收者拒绝发送或接收消息。
1.2 常见安全漏洞
-
SQL 注入攻击: 通过夹带 SQL 指令,导致数据库受到攻击,可能引发数据窃取、更改、删除等危害。
-
文件上传漏洞: 允许攻击者上传可执行代码文件,获取 Web 应用的控制权限。
-
权限漏洞: 涉及访问控制,可能导致用户数据泄露,包括水平和垂直越权问题。
-
暴力破解: 通过大量请求遍历方式,绕过验证机制找出正确的验证信息。
-
拒绝服务攻击: 制造合理请求导致资源过载,使服务不可用。
-
敏感信息泄露: 不应被外部访问的数据通过各种途径泄露到外部,可能导致信息滥用和诈骗。
-
业务逻辑漏洞: 涉及设计不全的业务流程,可能导致重置密码、发送恶意短信等问题。
-
跨站脚本攻击(XSS): 通过HTML注入篡改网页,控制用户浏览器,用于身份窃取、行为劫持等。
-
跨站点请求伪造(CSRF): 利用用户身份完成攻击操作,如发布文章、购买商品等。
2. 为何进行安全测试
安全测试尤为关键,尤其是在处理数据库等敏感信息的产品和网站中。缺乏安全性测试,可能导致严重后果,特别是在面对高级的 SQL 注入攻击时,数据库可能逐步暴露在黑客的面前。以下是安全测试的主要原因:
-
权限问题: 缺乏安全性保障容易导致权限跳跃,使用户越权访问资源,执行不应有的操作。
-
数据信息篡改: 在支付场景中,通过抓包修改提交数据信息,比如将商品价格由100修改为1,可能导致巨大经济损失。
-
跨站脚本等安全隐患: 缺乏对HTML注入等安全隐患的检测,可能使用户受到各种攻击,包括诱捕、重定向到钓鱼网站等。
3. 实施安全测试的方法
安全测试贯穿整个软件生命周期,包括风险分析、静态分析和渗透测试。相较于普通测试,安全测试需要更全面的视角,思考域涵盖系统的功能、机制、外部环境以及应用和数据的安全风险。以下是安全测试与普通测试的不同之处:
-
测试目标: 普通测试以发现 Bug 为目标,而安全测试以发现安全隐患为目标。
-
假设条件: 普通测试假设问题是由用户不小心造成的,而安全测试假设问题是由攻击者构造的。
-
思考域: 安全测试的思考域除了系统功能,还包括系统的机制、外部环境、应用和数据的安全风险与安全属性等。
-
问题发现模式: 普通测试以违反功能定义为判断依据,而安全测试以违反权限与能力的约束为判断依据。
4. 工作中的实践总结
在工作中,对于安全测试的实践需要关注多个方面:
4.1 敏感词校验
通过对小程序、H5、官网的输入框进行敏感词输入和搜索,以验证是否对敏感词有拦截。这包括对于各种业务场景的校验,如图所示。
4.2 明文传输
检查系统传输过程中的敏感内容,包括登录、支付、注册等场景,确保数据传输安全,防止明文传输。
4.3 越权访问
测试系统是否可以通过 URL 直接获取管理员和其他用户的信息,防止越权访问漏洞。检查不同权限用户是否能访问到其权限范围外的资源。
4.4 非法注入
通过测试系统对输入的过滤和转义,防止非法注入攻击,包括搜索框、输入框、备注信息、上传文件、URL等。
4.5 短信、邮箱验证
验证触发短信、邮箱验证码的相关场景,防止频繁调用接口导致短信被刷。检查验证码接口,防止通过接口截取验证码信息。
4.6 密码健壮性
测试密码和验证码验证方式是否可靠,防止暴力猜测。通过抓包工具修改接口中的密码和验证码,多次尝试输入错误的验证码,检查系统是否有输入次数上限。
4.7 数据安全
检测系统中敏感数据的存储是否安全,包括检查是否加密存储、数据是否进行了脱敏等。
4.8 支付相关
测试在线支付、达达支付等支付场景,确保支付接口调用正确,支付页面金额准确,防止支付密码信息泄露。
通过以上实践,可以更全面地评估系统的安全性,发现潜在的漏洞并加以修复,确保系统在面对各种安全威胁时能够做出有效的防护。