Web 信息安全:OWASP Top 10 与防御实战
Web 安全基础与渗透测试入门
Web 信息安全:OWASP Top 10 与防御实战
前言
Web 应用已成为企业与用户交互的核心平台,也是攻击者最常盯上的目标。无论你是开发人员、运维工程师还是安全爱好者,理解常见 Web 漏洞的原理与防御手段都是必备技能。本教程以 OWASP Top 10(2021 版)为主线,结合渗透测试的基础思路,帮助你从零构建攻防思维。
什么是 OWASP Top 10?
OWASP(Open Web Application Security Project)是一个开源的 Web 应用安全研究组织。其每 3~4 年发布的 Top 10 Web 应用安全风险 报告,汇总了当前最严重、最常见的 Web 漏洞类型,是 Web 安全的底层知识框架。
2021 版 OWASP Top 10 列表:
- A01:2021 – 访问控制失效
- A02:2021 – 加密机制失效
- A03:2021 – 注入
- A04:2021 – 不安全设计
- A05:2021 – 安全配置错误
- A06:2021 – 易受攻击和过时的组件
- A07:2021 – 认证与授权失败
- A08:2021 – 软件与数据完整性故障
- A09:2021 – 安全日志与监控故障
- A10:2021 – 服务端请求伪造(SSRF)
接下来逐一拆解每类风险,并讲解攻击原理与防御要点。
A01:访问控制失效
访问控制决定了“谁可以做什么”。失效时,攻击者可能越权访问他人数据、修改权限甚至接管账户。
典型场景:
- 水平越权:普通用户 A 修改请求中的
user_id参数为 B,直接查看或修改 B 的数据。 - 垂直越权:低权限用户通过隐藏 URL(如
/admin)访问管理功能。 - 直接对象引用:通过猜测资源 ID(如
/invoice/1024.pdf)访问无授权保护的文件。
攻击思路(示例):
- 登录普通用户,拦截请求。
- 修改请求中的 ID 或角色参数。
- 重放请求,观察是否返回他人数据。
防御要点:
- 服务端强制校验:绝不可仅依赖前端隐藏菜单。
- 使用基于角色的访问控制(RBAC)或基于属性的访问控制(ABAC)。
- 默认拒绝:未明确授权即禁止访问。
- 对每个请求验证资源所有权。
A02:加密机制失效
并非单纯指加密算法的破解,更常见的是:敏感数据未加密、使用弱加密、密钥管理混乱、传输过程泄露等。
常见问题:
- HTTP 明文传输登录凭证、会话 Cookie。
- 数据库明文存储密码。
- 使用已废弃的算法(如 MD5、SHA1)、硬编码密钥。
- 启用过时的 TLS 版本(如 TLS 1.0)。
攻击示例:
- 通过中间人攻击抓取明文密码。
- 拖库后直接使用泄露的明文密码撞库。
防御要点:
- 强制 HTTPS,设置 HSTS 头。
- 密码存储使用强哈希函数(如 bcrypt、Argon2),加盐。
- 敏感数据加密存储(如 AES-GCM),密钥由密钥管理服务(KMS)管理。
- 禁用老旧加密套件,定期更新证书。
A03:注入
注入漏洞是用户提供的数据被当作指令执行的结果。最常见的是 SQL 注入,此外还有命令注入、LDAP 注入等。
原理演示(SQL 注入):
-- 原始查询语句
SELECT * FROM users WHERE username = ‘$user’ AND password = ‘$pass’;
-- 攻击者输入用户名: admin’ --
-- 最终查询变为
SELECT * FROM users WHERE username = 'admin' --' AND password = '';
-- 将后续语句注释掉,绕过密码验证。
攻击技巧:
- 联合查询注入:
UNION SELECT ...提取其他表数据。 - 盲注:通过布尔或时间响应推断数据。
- 堆叠查询:多条语句执行(如
; DROP TABLE users)。
防御要点:
- 永远不要拼接 SQL,使用参数化查询(预编译语句)。
- 存储过程不能完全替代参数化。
- 白名单校验输入,例如当只能为数字时强制类型转换。
- 最小化数据库账户权限,禁用不必要的命令。
A04:不安全设计
这是一个相对广泛的风险类别,强调在设计阶段就引入安全缺陷。例如缺少速率限制、业务流程缺陷、错误的安全预设等。
实例:
- 密码重置流程仅需回答弱安全问题(如“你最喜欢的颜色”)。
- 电商网站允许负数数量下单。
- 无限制的 API 调用,导致资源滥用。
防御要点:
- 开展威胁建模(如 STRIDE)在设计阶段识别风险。
- 引入安全需求,例如关键操作需要二次确认。
- 使用安全设计模式:深度防御、最小权限、失效安全默认。
- 编写安全用户故事,将安全融入开发流程。
A05:安全配置错误
服务器、框架、库、容器等的不安全默认配置,或是多余的功能、默认账号未修改,都会给攻击者可乘之机。
典型情况:
- 应用目录列表开启,泄露文件结构。
- 默认后台路径(如
/admin)未更改,且使用默认密码。 - 错误消息显示堆栈跟踪,泄露技术栈信息。
- 不必要的 HTTP 方法开启(如 PUT、DELETE)。
- 云存储桶公开访问。
防御要点:
- 制定标准化的安全加固基线(参考 CIS Benchmarks)。
- 自动化配置检查工具(如 OpenSCAP、云原生安全扫描)。
- 删除示例代码、默认账户、不必要的功能。
- 返回给客户端的安全头设置完整(CSP、X-Content-Type-Options 等)。
A06:易受攻击和过时的组件
当应用使用了含有已知漏洞的库、框架或插件,且未及时更新,就会陷入被动。
真实案例:
- Equifax 数据泄露事件:未修补 Apache Struts2 漏洞。
- Log4Shell 漏洞(CVE-2021-44228):影响大量使用 Log4j2 的应用。
防御要点:
- 使用软件组成分析(SCA)工具(如 OWASP Dependency-Check、Snyk)持续扫描依赖。
- 仅从官方源获取组件,校验签名。
- 建立补丁管理流程,根据风险等级优先升级。
- 移除不再维护的组件。
A07:认证与授权失败
专注于身份验证与登录管理的缺陷,常涉及凭证暴力破解、会话管理漏洞等。
漏洞场景:
- 登录接口无限尝试(无账户锁定或验证码)。
- 弱密码策略,允许
123456。 - 会话 ID 可预测或未在登录后重置。
- 未使用安全的 Cookie 属性(如
HttpOnly、Secure、SameSite)。
攻击方式:
- 利用自动化工具(如 Hydra)暴力破解弱口令。
- 通过 XSS 获取会话 Cookie 进行会话劫持。
防御要点:
- 多因素认证(MFA)作为标配。
- 实现账户锁定、速率限制、强密码策略。
- 会话管理:使用强随机 ID,登录后生成新会话,设置合适超时。
- 安全退出:使所有会话失效。
A08:软件与数据完整性故障
当应用依赖未经完整性验证的软件更新、关键数据或 CI/CD 管道时,可能被植入恶意代码。
典型问题:
- 从不受信源的 CDN 加载 JS 库,且未做完整性校验(未用 SRI)。
- 反序列化不可信数据,导致远程代码执行(如 Java、Python 的反序列化漏洞)。
- CI/CD 管道被篡改,导致代码或镜像被恶意修改。
防御要点:
- 使用子资源完整性(SRI)标签:
<script src="..." integrity="sha384-..."></script> - 对序列化数据进行数字签名或优先选用纯数据格式(如 JSON)。
- 对 CI/CD 流程进行访问控制,审核制品签名。
- 使用软件物料清单(SBOM)追踪组件来源。
A09:安全日志与监控故障
日志记录不全、未监控或未告警,导致入侵者长期潜伏而未被发现。这也是法规合规(如 GDPR)的常见违规项。
常见疏漏:
- 未记录登录失败、敏感操作(如修改权限)。
- 日志存储在本地,被攻击者清除。
- 没有实时监控和告警。
防御要点:
- 记录所有认证、授权、输入验证错误、敏感操作。
- 日志包含足够的上下文但不记录密码等敏感数据。
- 将日志集中到安全的 SIEM 系统,设置告警规则。
- 与事件响应流程对接,定期演练。
A10:服务端请求伪造(SSRF)
攻击者诱导服务器向内部网络或其他外部系统发起恶意请求,常用于绕过防火墙、打穿内网。
攻击示例:
某网站读取远程图片功能提供参数 url=http://external.com/image.jpg。攻击者将其改为:
url=http://169.254.169.254/latest/meta-data/