OWASP Top 10 (2021)
1. 访问控制失效 (Broken Access Control)
指的是应用程序未能正确限制经过身份验证的用户可以执行的操作或访问的资源。这可能导致攻击者绕过授权机制,访问、修改或删除本不属于其权限范围的数据或功能。
常见类型:
垂直越权 (Vertical Privilege Escalation):在已登录状态下,通过伪造请求访问或操作更高权限用户的功能或资源。
水平越权 (Horizontal Privilege Escalation):在已登录状态下,通过伪造请求访问或操作同级别其他用户的功能或资源。
未授权访问 (Unauthenticated Access):未经过任何认证或登录,即可访问原本需要认证才能访问的敏感资源。
测试方法:
手工测试:切换 Cookie、修改路径参数(如
/user/123到/user/456)、修改用户参数/查询参数。工具辅助:使用 Burp Suite 等工具,移除认证信息(如 Cookie),观察响应包是否能访问受限资源(未授权访问);使用低权限用户的 Cookie 替换高权限用户的 Cookie,观察是否能操作非自身资源(垂直/水平越权)。
防护措施:
服务端权限验证:所有访问控制决策必须在服务器端执行。
API 默认拒绝:API 接口应默认拒绝所有访问,只对明确授权的请求放行。
记录越权尝试日志:记录所有失败的访问控制尝试。
2. 加密失效 (Cryptographic Failures)
由于数据在传输或存储过程中未被加密、加密不当或使用了过时的加密算法,导致敏感数据泄露。
常见问题:
未使用 HTTPS 明文传输:敏感数据以明文形式传输。
使用过时的加密算法:如 MD5、SHA1 等哈希算法。
缺少数据完整性校验:数据可能被篡改。
密钥管理不当:密钥复用、密钥泄露、硬编码密钥。
数据库备份文件泄露。
防护措施:
强制使用 HTTPS:所有敏感数据传输必须通过 HTTPS/TLS 进行加密。
敏感数据加密存储:敏感字段或文件应加密存储。
使用强加密算法:采用现代、安全的加密算法(如 AES-256、SHA-256/SHA-3)和推荐的协议版本(如 TLS 1.2+)。
加强密钥管理:使用专业的密钥管理系统 (KMS)。
3. 注入漏洞 (Injection)
攻击者将恶意的代码或数据注入到应用程序中,使其被解释为正常命令或查询执行,从而实现获取、修改、删除数据,甚至执行系统命令的目的。
注入类型:
SQL 注入 (SQL Injection)
命令注入 (Command Injection)
跨站脚本 (XSS - Cross-Site Scripting)
NoSQL 注入、LDAP 注入、XPath 注入。
SQL 注入:
分类:联合查询注入、报错注入、布尔盲注、时间盲注、堆叠注入、宽字节注入、二次注入。
攻击流程:判断注入点 -> 确认注入类型 -> 枚举数据库信息 -> 导出敏感数据。
SQLMap:自动化 SQL 注入工具,常用参数
-r、-u、-p。SQLMap 获取 Shell 条件:知道绝对路径、拥有高权限用户、
secure_file_priv不为空。
命令注入:
攻击者将恶意操作系统命令注入到服务器应用程序中,使服务器执行非预期的命令。
常见出现点:应用程序调用系统命令的地方,如
ping、nslookup、ls、cat。判断方法:观察代码是否使用了
system()、exec()、os.system()等函数。利用方式:写入 WebShell 或利用 Bash 反弹 Shell。
XSS (跨站脚本攻击):
攻击者将恶意脚本注入到网页中,当其他用户浏览该网页时,恶意脚本会在受害者的浏览器中执行,从而窃取数据、劫持会话、篡改数据。
类型:反射型 XSS、存储型 XSS、DOM 型 XSS。
攻击目的:窃取 Cookie、捕捉键盘输入、钓鱼攻击、劫持会话、伪造用户操作。
常见 XSS 标签:
<script>、<img>、<a>、<svg>、事件属性(onload、onerror、onmouseover)。测试点:URL 参数、Cookie、HTTP Header、搜索框、留言板、用户评论区、JS 动态插入点。
绕过技巧:双写、URL 编码、HTML 实体编码、JS 伪协议。
防护措施 (注入通用):
输入验证:对所有用户输入进行严格的验证和过滤(白名单机制)。
输出编码:将用户数据输出到页面时,进行适当的编码。
参数化查询/预编译语句:防止 SQL 注入。
最小权限原则:数据库账户只授予必要操作的最小权限。
禁用不必要函数:限制可能执行系统命令的函数。
使用安全的 API。
4. 不安全的设计 (Insecure Design)
在系统设计和架构阶段,由于不恰当的安全设计选择或缺乏威胁建模而导致的安全风险。
常见问题:
缺乏权限模型:API 不区分普通用户和管理员用户,导致越权。
接口无速率限制:登录接口无限制尝试密码。
过度信任客户端:过度依赖前端进行权限控制或数据校验。
宽松的默认配置:后台登录入口未加认证或直接暴露在公网。
缺乏威胁建模。
防护措施:
建立安全开发生命周期 (SDLC):将安全考虑融入开发的每一个阶段。
进行威胁建模:在设计初期识别潜在威胁。
实施最小权限原则。
敏感数据不存储在客户端。
严格的文件上传检查。
5. 安全配置错误 (Security Misconfiguration)
是指系统组件的默认配置不安全、错误设置或缺乏适当的安全措施,导致攻击者可以利用这些缺陷获取敏感信息或控制系统。XXE (XML External Entity) 漏洞也常归因于此。
常见问题:
启动不必要的功能:如不必要的服务、端口、页面、账户。
未及时更新补丁:利用已知漏洞(N-day)。
默认/弱配置:使用默认用户密码、Web 服务器显示详细错误信息、开启目录遍历。
缺少安全 HTTP 头部。
错误的跨域资源共享 (CORS) 策略:如
Access-Control-Allow-Origin: *。云服务配置错误。
攻击方式:
访问默认管理页面或安装向导。
利用目录浏览功能访问隐藏文件。
通过错误页面泄露服务器路径。
利用默认凭证登录系统。
防御措施:
最小化暴露面:关闭默认账户、页面、端口,移除未使用的服务。
强化配置:对所有系统组件进行安全加固。
定期扫描漏洞:使用配置扫描工具。
环境分离:不同环境应有不同的安全配置。
及时打补丁。
6. 使用存在漏洞或过期的组件 (Vulnerable and Outdated Components)
应用程序或其依赖的组件存在已知漏洞,但开发者没有及时更新修复,容易导致系统被攻击者利用。
常见存在问题的组件:
常见框架和第三方库:Spring Boot、Spring MVC、Vue、jQuery 等。
常见中间件:Nginx、Apache HTTP Server、Tomcat、MySQL、Redis、Memcached、RabbitMQ 等。
如何识别:
指纹识别:使用
WhatWeb、Wappalyzer等工具。组件清单。
应用部署长期无人维护。
防护措施:
定期更新组件:及时更新所有使用的第三方组件。
移除未使用的依赖组件。
漏洞监控:关注常用组件的最新漏洞信息。
替换有严重漏洞的组件。
源分析工具 (SCA)。
7. 身份认证与管理失效 (Identification and Authentication Failures)
当应用程序的用户身份验证机制设计或实现不当时,攻击者可能冒充其他用户、获取管理员权限或绕过身份认证。
常见问题:
弱密码策略:允许设置简单密码。
认证绕过:通过逻辑漏洞绕过登录验证。
会话管理失误:会话 ID 易预测、无过期时间。
默认/硬编码账户。
身份验证逻辑缺陷:如万能密码。
JWT/Token 使用不当:签名未验证、无过期时间。
攻击方式:
弱口令暴力破解。
会话固定攻击 (Session Fixation)。
Token 复用。
万能密码登录绕过。
防护措施:
加强密码策略:强制使用强密码,支持多因素认证 (MFA)。
安全的身份验证流程。
会话管理:会话 ID 高随机性、设置失效时间、登录后创建新会话、注销时销毁会话、使用
HttpOnly和SecureCookie 标志。防暴力破解机制:限制登录尝试次数。
8. 软件和数据完整性故障 (Software and Data Integrity Failures)
应用程序在没有验证完整性的情况下做出软件更新、关键数据或 CI/CD 管道相关假设,或者包含不安全的反序列化机制。
常见问题:
不安全的反序列化:可能导致远程代码执行 (RCE)。
代码/配置完整性未受控。
使用未经验证的第三方组件。
对象存储或配置文件未校验完整性。
不安全的 CI/CD 管道。
案例:
软件供应链攻击:攻击者上传恶意包。
CI/CD 后门注入。
下载更新包无签名校验。
防护措施:
只使用官方渠道的软件包。
启用签名验证:对所有下载的软件包进行数字签名验证。
避免使用易受攻击的序列化机制。
保护 CI/CD 管道。
9. 安全日志和监控故障 (Security Logging and Monitoring Failures)
系统没有记录关键操作日志,缺乏主动告警机制,或未能有效检测和响应可疑行为,导致攻击无法及时发现或应对。
常见问题:
缺少关键日志:未记录管理员登录、密码修改等敏感操作。
日志记录不全:只记录成功操作,不记录失败尝试。
缺乏告警机制:大量登录失败、路径扫描等行为没有自动告警。
日志可被攻击者修改/删除:日志文件未做权限控制。
未检测自动化攻击:爬虫、暴力破解工具未被识别。
防护措施:
全面日志记录:记录所有关键安全事件。
保护日志完整性:对日志文件进行权限控制,传输到安全日志管理系统 (SIEM)。
实时监控与告警:对异常登录行为、敏感数据访问等设置阈值并告警。
定期日志审计。
10. 服务端请求伪造 (Server-Side Request Forgery - SSRF)
SSRF 漏洞允许攻击者诱导服务器向攻击者指定的任意地址发起请求,从而导致信息泄露、内网扫描、甚至远程控制。
常见攻击目标:
本地接口:
127.0.0.1、localhost。内部管理接口或数据库服务。
内网地址。
云服务元数据接口:获取云服务凭证。
常见服务端口:Redis、Memcached、MySQL 等。
防护措施:
白名单机制:请求目标地址必须在明确定义的白名单中。
禁用请求内网地址:禁止请求私有 IP 地址范围。
协议限制:只允许 HTTP、HTTPS 协议。
请求行为限制:设置超时、限制重定向。
不信任用户输入:对所有用户提供的 URL 参数进行严格校验。
网络隔离:将 Web 服务器与内部敏感系统进行网络隔离。