什么是OWASP Top 10?
OWASP(Open Web Application Security Project)是一个开源的、非营利的全球性安全组织,致力于改善软件的安全状况。其发布的OWASP Top 10每几年更新一次,总结了当前Web应用程序中最常见、最危险的十大安全漏洞。
当前最新的版本是 OWASP Top 10: 2021。我们将以此为基础进行详解。
以下是 OWASP Top 10 - 2021 的详细解析:
1. 失效的访问控制(Broken Access Control)
-
描述:访问控制强制实施策略,使用户不能在其预期权限之外行事。当应用程序无法正确实施这些控制时,攻击者就可以访问其他用户的数据、执行未授权的操作(如查看敏感文件、修改他人数据、提升权限等)。
-
典型攻击方式:
-
垂直越权:普通用户访问管理员功能(如通过修改URL参数
/admin/deleteUser.php?id=123
)。 -
水平越权:用户A访问用户B的数据(如修改URL中的用户ID
userId=B
为userId=A
)。 -
目录遍历(Path Traversal):通过操纵文件路径参数访问服务器上的敏感文件(如
../../etc/passwd
)。
-
-
防护措施:
-
除公共资源外,默认拒绝所有访问。
-
强制实施一次性的、不可篡改的访问控制机制(如在服务器端Session中校验权限,而非相信客户端传来的参数)。
-
禁用Web服务器目录列表。
-
记录访问控制失败的日志并告警。
-
2. 加密机制失效(Cryptographic Failures)
-
描述(原“敏感数据泄露”):这是一种广泛存在的故障,主要体现在未正确使用加密技术来保护敏感数据(如密码、信用卡号、健康记录、个人身份信息等)。数据在传输或存储过程中处于明文状态,或使用了弱加密算法、硬编码密钥等。
-
典型攻击方式:
-
在网络中窃听未使用HTTPS(TLS)的通信。
-
攻击数据库后直接获取明文的敏感信息。
-
对弱哈希(如MD5, SHA1)或未加盐的密码进行破解。
-
-
防护措施:
-
对传输中的数据和静态存储的数据使用强加密算法(如TLS 1.2/1.3, AES-256)。
-
禁止使用旧的和弱的算法(如MD5, SHA1, RC4, DES)。
-
使用随机盐和强哈希函数(如Argon2, bcrypt, PBKDF2)存储密码。
-
绝不硬编码加密密钥。
-
3. 注入(Injection)
-
描述:当不可信的数据作为命令或查询的一部分被发送给解释器时,会发生注入漏洞。攻击者的恶意数据可以欺骗解释器,执行非预期的命令或在没有适当授权的情况下访问数据。SQL注入 是最著名的子类。
-
典型攻击方式:
-
SQL注入:
' OR '1'='1' --
被拼接到SQL查询中,绕过登录验证或 dump 整个数据库。 -
命令注入:在输入中拼接系统命令(如
; rm -rf /
)。 -
NoSQL/LDAP/ORM注入:原理类似,目标解释器不同。
-
-
防护措施:
-
使用安全的API,如参数化查询(Prepared Statements)、ORM,避免使用解释器或提供参数化接口。
-
对输入进行严格的白名单验证。
-
对特殊字符进行转义(作为次要防御措施)。
-
最小权限原则,避免使用高权限账户连接数据库。
-
4. 不安全设计(Insecure Design)
-
描述(2021年新增):这关乎设计阶段的缺陷,与实现缺陷不同。它代表了缺少或无效的安全控制设计,是“安全左移”理念的核心。如果设计本身就有问题,后续的代码实现再完美也无法解决根本性安全风险。
-
典型攻击方式:
-
业务流程缺陷,如无需证明所有权即可更改账户邮箱。
-
拍卖系统因设计问题导致“竞标覆盖”。
-
-
防护措施:
-
建立并使用安全的软件开发生命周期(SDLC)。
-
在设计和架构阶段进行威胁建模。
-
使用安全的编码模式和参考架构。
-
5. 安全配置错误(Security Misconfiguration)
-
描述:由于配置不当导致的安全问题,涵盖范围极广,包括:使用默认账户密码、启用不必要的服务、错误的HTTP头配置、暴露详细的错误信息、云服务权限配置过宽等。
-
典型攻击方式:
-
访问默认的管理员面板(如
/admin
)。 -
利用启用的调试功能获取堆栈跟踪信息。
-
服务器目录列表泄露了文件结构。
-
-
防护措施:
-
建立最小化、可重复的安全加固流程(如硬化的操作系统、应用服务器配置)。
-
定期扫描和评估配置。
-
移除或禁用不必要的功能、服务、文档。
-
自动化配置管理过程。
-
6. vulnerable and Outdated Components(易受攻击和过时的组件)
-
描述(原“使用含有已知漏洞的组件”):如果应用程序使用了带有已知安全漏洞的第三方库、框架、模块(如Log4j, Struts2, Spring等),且未及时更新,攻击者可以利用这些已知漏洞轻松攻破系统。
-
典型攻击方式:
-
搜索目标系统使用的组件及其版本,在公开漏洞库(如CVE, NVD)中寻找对应的利用代码(Exploit)进行攻击。
-
典型案例:2021年底的 Log4Shell (CVE-2021-44224) 漏洞。
-
-
防护措施:
-
使用包管理器(如Maven, npm, pip)维护组件清单。
-
定期使用SCA(软件成分分析)工具(如OWASP Dependency-Check, Snyk)扫描并监控依赖项。
-
仅从官方渠道获取组件,并验证其完整性。
-
及时移除不再维护的依赖。
-
7. 身份认证失效(Identification and Authentication Failures)
-
描述(原“失效的身份认证”):应用程序在与身份认证和会话管理相关的功能上实现不正确,可能允许攻击者破解密码、密钥、会话令牌,或利用其他实现缺陷暂时或永久地冒充其他用户的身份。
-
典型攻击方式:
-
暴力破解/撞库攻击:在登录接口尝试常用密码或从其他网站泄露的密码。
-
会话固定(Session Fixation)。
-
在URL中暴露会话ID。
-
认证成功后不会话ID不会更新。
-
-
防护措施:
-
实施多因素认证(MFA)。
-
不使用默认的、弱的凭证。
-
使用强密码策略和安全的密码哈希存储。
-
实现安全的会话管理(使用安全的、随机的会话ID,登录后重新生成会话ID,设置合理的会话超时)。
-
8. 软件和数据完整性故障(Software and Data Integrity Failures)
-
描述(2021年新增):指在不验证完整性的情况下,依赖来自不受信任来源的软件、基础设施、数据。例如,自动化的CI/CD管道被篡改,注入恶意代码;应用程序从不可信的CDN加载JavaScript库。
-
典型攻击方式:
-
供应链攻击:污染上游开源库或构建管道。
-
利用“不安全的反序列化”(2017版A8),将恶意对象注入数据流中。
-
-
防护措施:
-
使用数字签名来验证软件或数据的完整性和来源。
-
确保CI/CD管道有适当的配置和访问控制。
-
避免执行从不可信来源加载的代码。
-
9. 安全日志和监控失效(Security Logging and Monitoring Failures)
-
描述(原“不足的日志记录和监控”):未能有效记录、监控和响应安全事件。这会导致攻击者能够进一步攻击系统、保持持久化、篡改数据而未被察觉。
-
典型攻击方式:
-
攻击者进行多次暴力破解尝试,但系统未记录登录失败日志,或日志未被监控,因此无人告警。
-
攻击者利用SQL注入提取数据,但由于日志不详细,无法进行事后调查。
-
-
防护措施:
-
确保所有登录、访问控制失败、服务器端输入验证失败都被记录,并带有足够的上下文。
-
确保日志以一种易于被日志管理解决方案处理的格式生成。
-
建立有效的监控和告警机制,以便及时发现可疑活动。
-
建立事件响应和恢复计划。
-
10. 服务端请求伪造(SSRF)
-
描述:当Web应用程序在未对用户提供的URL进行充分验证的情况下,直接用它来发起一个内部请求时,就会发生SSRF。攻击者可以诱使应用程序向任意的域或内部系统发送精心构造的请求,从而绕过防火墙等访问控制,访问或操作内部资源。
-
典型攻击方式:
-
攻击者控制一个参数(如
url=example.com
),将其改为内网地址(如url=192.168.1.1:8080/admin
),服务器就会向该内网地址发起请求并返回结果。 -
攻击云元数据服务(如
169.254.169.254
)以获取云服务器的敏感凭证。
-
-
防护措施:
-
尽可能使用“白名单”允许的域名或IP。
-
禁用不需要的URL架构(如
file:///
,ftp://
,gopher://
)。 -
隔离并加固网络,限制应用服务器向外发起请求的能力。
-
总结与建议
排名 | 漏洞名称 | 核心问题 | 防护核心思想 |
---|---|---|---|
1 | 失效的访问控制 | 权限检查不严,用户可越权操作 | 服务器端强制校验权限 |
2 | 加密机制失效 | 数据未正确加密或使用弱加密 | 强加密算法、哈希加盐 |
3 | 注入 | 将不可信数据当作代码执行 | 参数化查询、输入验证 |
4 | 不安全设计 | 架构设计阶段就存在安全缺陷 | 威胁建模、安全SDLC |
5 | 安全配置错误 | 系统/服务/应用配置不当 | 最小化原则、自动化加固 |
6 | 易受攻击和过时的组件 | 使用带已知漏洞的第三方库 | 资产清单、依赖扫描、及时更新 |
7 | 身份认证失效 | 登录/会话管理功能有缺陷 | 多因素认证、强密码、安全会话 |
8 | 软件和数据完整性故障 | 信任了未被验证完整性的外部代码或数据 | 数字签名、供应链安全 |
9 | 安全日志和监控失效 | 无法发现和调查攻击行为 | 有效日志记录、监控告警、应急响应 |
10 | 服务端请求伪造(SSRF) | 应用服务器被当作代理访问内网 | 白名单校验、禁用危险协议 |
对于开发、测试、运维和安全人员来说,OWASP Top 10是一个极其宝贵的知识框架和检查清单。它指导我们在软件生命周期的各个阶段(设计、开发、测试、部署、运维)中,应该重点关注哪些安全风险,并采取相应的防护措施,从而系统地提升应用程序的安全性。