渗透测试(penetration test,简称 pentest)是一种经过授权的安全测试:测试人员模拟真实攻击者,尝试发现并利用系统中的弱点,再报告发现的问题和修复方法。对运营网站、网店或 Web 应用的企业来说,它回答的是一个很实际的问题:如果有人试图入侵,对方能走到哪一步?
渗透测试和漏洞扫描的区别
两者常被混为一谈,但作用不同。
- 漏洞扫描由工具自动完成,对照已知问题清单检查系统,例如过时的软件版本、缺失的安全响应头或对外暴露的服务。扫描速度快,可以频繁执行,但可能产生误报,通常也不理解应用的业务逻辑。
- 渗透测试以人工为主。测试人员把扫描结果作为参考,逐项人工验证,把几个小弱点串联起来,并测试业务逻辑,比如只改动 URL 里的一个数字,一位客户能否看到另一位客户的订单。
扫描适合做日常检查,渗透测试则是在某个时间点做更深入的评估。多数组织两者都需要。
渗透测试的类型
按测试人员事先掌握的信息,通常分为三类:
- 黑盒测试:测试人员只有网址等基本信息,接近外部攻击者的视角。
- 灰盒测试:提供测试账号或部分文档,重点放在已登录用户能访问的范围。
- 白盒测试:提供架构资料,有时还包括源代码,可以做最全面的检查。
按测试对象划分,则有 Web 应用测试(登录、表单、会话、访问控制)、API 测试(每个接口的身份认证、授权和数据泄露风险)、网络测试(服务器、防火墙和对外服务)以及移动应用测试(App 本身、本地存储的数据和它调用的 API)。
测试范围和书面授权
安全测试必须获得系统所有者的许可,所以正规的渗透测试会先取得有权批准者的书面授权。如果网站部署在托管或云服务商那里,也要查看对方的政策,因为有些服务商对安全测试有专门规定。开始前,双方要约定测试规则:
- 哪些域名、IP 地址、应用和环境在范围内,哪些不在
- 测试日期和时段,以及在生产环境还是测试环境进行
- 禁止使用的手段,例如拒绝服务攻击
- 紧急联系人,以及测试中发现严重问题时怎么处理
一般测试流程
- 确定范围:约定目标、测试对象、类型和时间。
- 信息收集:梳理可被攻击的范围,包括子域名、页面、API 和所用技术。
- 测试:在约定规则内寻找并尝试利用弱点。
- 报告:记录每项发现、证据和修复建议。
- 修复:内部团队或开发商按风险高低依次修复。
- 复测:确认修复有效,并且没有引入新的漏洞。
一份好的报告应包含什么
报告是测试的主要成果,管理层和开发人员都应该看得懂。可以留意这些内容:
- 用通俗语言概括整体风险
- 每项发现的严重程度评级,以及对业务的影响
- 清晰的复现步骤和证据,方便开发人员确认问题
- 具体的修复建议,而不是笼统的提醒
- 测试范围和日期,以及没有测试的部分
以下示例仅用于说明:一项发现可能写成“高风险:已登录用户只要修改 API 请求中的发票编号,就能下载其他用户的发票”,并附上实际使用的请求、受影响的接口,以及在服务器端增加权限校验的建议。
什么时候测试,多久测一次
常见的测试时机包括新网站或应用上线前,新增支付流程、登录系统或更换托管等重大改动之后,以及对处理客户或支付数据的系统定期测试。一些行业、客户或合同可能要求按固定周期测试,具体要求请咨询你的顾问。
和其他安全措施如何配合
渗透测试是一种检查,不能代替日常的良好实践。CI/CD 流水线中的自动安全检查可以在每次发布时发现部分问题;回归测试确保修复过的问题不会再次出现。多重身份验证能降低密码被盗带来的影响,零信任则限制单个账号能访问的范围。渗透测试的结果往往能暴露这些措施的薄弱环节。
如需把安全测试和其他防护措施一起规划,可以查看 technine.io 的网络安全与合规服务。
常见问题
只做漏洞扫描够吗?
用于日常检查很有用,但业务逻辑和访问控制方面的问题,往往需要人工才能发现。渗透测试正好弥补这一点。
渗透测试会让网站宕机吗?
如果测试规则已排除破坏性手段,并约定好时间,一般不会。有些团队会先在测试环境进行,以降低风险。
通过渗透测试是否说明网站已经安全?
不是。结果只反映测试人员在约定范围和时间内的发现。新代码、新功能和新公开的漏洞都可能改变情况,所以复测和持续检查同样重要。
